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
@@ -167,11 +167,26 @@ export const Func: Kind = 19
167
167
  export const Interface: Kind = 20
168
168
  export const Map: Kind = 21
169
169
  export const Ptr: Kind = 22
170
+ export const Pointer: Kind = Ptr
170
171
  export const Slice: Kind = 23
171
172
  export const String: Kind = 24
172
173
  export const Struct: Kind = 25
173
174
  export const UnsafePointer: Kind = 26
174
175
 
176
+ const pointerAddressStride = 0x100000000
177
+ const pointerAddresses = new WeakMap<object, number>()
178
+ let nextPointerAddress = 1
179
+
180
+ function pointerAddress(value: object): number {
181
+ let address = pointerAddresses.get(value)
182
+ if (address === undefined) {
183
+ address = nextPointerAddress * pointerAddressStride
184
+ nextPointerAddress++
185
+ pointerAddresses.set(value, address)
186
+ }
187
+ return address
188
+ }
189
+
175
190
  // Type is the representation of a Go type.
176
191
  export interface Type {
177
192
  // String returns a string representation of the type.
@@ -225,6 +240,10 @@ export interface Type {
225
240
  // NumMethod returns the number of methods in the type's method set
226
241
  NumMethod(): number
227
242
 
243
+ // Len returns an array type's length.
244
+ // Panics if the type's Kind is not Array.
245
+ Len(): number
246
+
228
247
  // Bits returns the size of the type in bits
229
248
  // Panics if the type's Kind is not a sized type.
230
249
  Bits(): number
@@ -271,6 +290,9 @@ class InvalidTypeClass implements Type {
271
290
  NumMethod(): number {
272
291
  return 0
273
292
  }
293
+ Len(): number {
294
+ throw new Error('reflect: Len of invalid type')
295
+ }
274
296
  Bits(): number {
275
297
  throw new Error('reflect: Bits of invalid type')
276
298
  }
@@ -507,6 +529,45 @@ export class Value {
507
529
  return this._value
508
530
  }
509
531
 
532
+ public Pointer(): number {
533
+ const kind = this.Kind()
534
+ if (
535
+ kind !== Chan &&
536
+ kind !== Func &&
537
+ kind !== Map &&
538
+ kind !== Ptr &&
539
+ kind !== Slice &&
540
+ kind !== UnsafePointer
541
+ ) {
542
+ throw new ValueError({ Kind: kind, Method: 'Pointer' })
543
+ }
544
+ if (this._value === null || this._value === undefined) {
545
+ return 0
546
+ }
547
+ if ($.isVarRef(this._value)) {
548
+ const address = this._value.__goAddress?.()
549
+ if (address !== undefined) {
550
+ return address
551
+ }
552
+ return pointerAddress(this._value)
553
+ }
554
+ if (kind === Slice) {
555
+ const slice = this._value as $.Slice<unknown> | Uint8Array
556
+ try {
557
+ if ($.len(slice) === 0) {
558
+ return 0
559
+ }
560
+ return $.indexAddress(slice, 0)
561
+ } catch {
562
+ return 0
563
+ }
564
+ }
565
+ if (typeof this._value === 'object' || typeof this._value === 'function') {
566
+ return pointerAddress(this._value)
567
+ }
568
+ return 0
569
+ }
570
+
510
571
  public pointer(): unknown {
511
572
  return this._value
512
573
  }
@@ -606,9 +667,35 @@ export class Value {
606
667
  return new Value(null, new BasicType(Invalid, 'invalid'))
607
668
  }
608
669
 
609
- public Complex(): number | { real: number; imag: number } | null {
610
- // Placeholder for complex number support
611
- return this._value as number | { real: number; imag: number } | null
670
+ public MapKeys(): $.Slice<Value> {
671
+ if (this.Kind() !== Map) {
672
+ throw new ValueError({ Kind: this.Kind(), Method: 'MapKeys' })
673
+ }
674
+ if (this._value === null || this._value === undefined) {
675
+ return $.makeSlice<Value>(0)
676
+ }
677
+ if (!(this._value instanceof globalThis.Map)) {
678
+ throw new ValueError({ Kind: this.Kind(), Method: 'MapKeys' })
679
+ }
680
+ const keyType = this.Type().Key()
681
+ const keys: Value[] = []
682
+ for (const key of this._value.keys()) {
683
+ keys.push(new Value(key as ReflectValue, keyType))
684
+ }
685
+ return $.arrayToSlice(keys)
686
+ }
687
+
688
+ public Complex(): number | $.Complex | null {
689
+ const k = this.Kind()
690
+ if (k !== Complex64 && k !== Complex128) {
691
+ throw new Error(
692
+ 'reflect: call of reflect.Value.Complex on ' +
693
+ Kind_String(k) +
694
+ ' Value',
695
+ )
696
+ }
697
+ const value = this._parentVarRef ? this._parentVarRef.value : this._value
698
+ return value as number | $.Complex | null
612
699
  }
613
700
 
614
701
  // Send sends a value to a channel
@@ -754,6 +841,28 @@ export class Value {
754
841
  }
755
842
  }
756
843
 
844
+ // SetComplex sets v's underlying value to x
845
+ public SetComplex(x: number | $.Complex): void {
846
+ if (!this.CanSet()) {
847
+ throw new Error(
848
+ 'reflect: call of reflect.Value.SetComplex on unaddressable value',
849
+ )
850
+ }
851
+ const k = this.Kind()
852
+ if (k !== Complex64 && k !== Complex128) {
853
+ throw new Error(
854
+ 'reflect: call of reflect.Value.SetComplex on ' + k + ' Value',
855
+ )
856
+ }
857
+ this._value = x
858
+ if (this._parentVarRef) {
859
+ this._parentVarRef.value = x
860
+ }
861
+ if (this._parentStruct && this._fieldName) {
862
+ this._parentStruct[this._fieldName] = x
863
+ }
864
+ }
865
+
757
866
  // SetBytes sets v's underlying value to x
758
867
  public SetBytes(x: $.Slice<number>): void {
759
868
  if (!this.CanSet()) {
@@ -1055,6 +1164,14 @@ export class BasicType implements Type {
1055
1164
  return 0
1056
1165
  }
1057
1166
 
1167
+ public Len(): number {
1168
+ throw new Error(
1169
+ 'reflect: call of reflect.Type.Len on ' +
1170
+ Kind_String(this._kind) +
1171
+ ' Type',
1172
+ )
1173
+ }
1174
+
1058
1175
  public Bits(): number {
1059
1176
  const k = this._kind
1060
1177
  switch (k) {
@@ -1074,6 +1191,10 @@ export class BasicType implements Type {
1074
1191
  case Uint64:
1075
1192
  case Float64:
1076
1193
  return 64
1194
+ case Complex64:
1195
+ return 64
1196
+ case Complex128:
1197
+ return 128
1077
1198
  case Int:
1078
1199
  case Uint:
1079
1200
  case Uintptr:
@@ -1153,6 +1274,10 @@ class SliceType implements Type {
1153
1274
  return 0
1154
1275
  }
1155
1276
 
1277
+ public Len(): number {
1278
+ throw new Error('reflect: call of reflect.Type.Len on slice Type')
1279
+ }
1280
+
1156
1281
  public Bits(): number {
1157
1282
  throw new Error('reflect: call of reflect.Type.Bits on slice Type')
1158
1283
  }
@@ -1318,6 +1443,10 @@ class PointerType implements Type {
1318
1443
  return 0
1319
1444
  }
1320
1445
 
1446
+ public Len(): number {
1447
+ throw new Error('reflect: call of reflect.Type.Len on pointer Type')
1448
+ }
1449
+
1321
1450
  public Bits(): number {
1322
1451
  throw new Error('reflect: call of reflect.Type.Bits on pointer Type')
1323
1452
  }
@@ -1394,6 +1523,10 @@ class FunctionType implements Type {
1394
1523
  return 0
1395
1524
  }
1396
1525
 
1526
+ public Len(): number {
1527
+ throw new Error('reflect: call of reflect.Type.Len on func Type')
1528
+ }
1529
+
1397
1530
  public Bits(): number {
1398
1531
  throw new Error('reflect: call of reflect.Type.Bits on func Type')
1399
1532
  }
@@ -1473,6 +1606,10 @@ class MapType implements Type {
1473
1606
  return 0
1474
1607
  }
1475
1608
 
1609
+ public Len(): number {
1610
+ throw new Error('reflect: call of reflect.Type.Len on map Type')
1611
+ }
1612
+
1476
1613
  public Bits(): number {
1477
1614
  throw new Error('reflect: call of reflect.Type.Bits on map Type')
1478
1615
  }
@@ -1631,6 +1768,10 @@ class StructType implements Type {
1631
1768
  return 0
1632
1769
  }
1633
1770
 
1771
+ public Len(): number {
1772
+ throw new Error('reflect: call of reflect.Type.Len on struct Type')
1773
+ }
1774
+
1634
1775
  public Bits(): number {
1635
1776
  throw new Error('reflect: call of reflect.Type.Bits on struct Type')
1636
1777
  }
@@ -1650,6 +1791,10 @@ class StructType implements Type {
1650
1791
  return new BasicType(Bool, 'bool', 1)
1651
1792
  case 'float64':
1652
1793
  return new BasicType(Float64, ti, 8)
1794
+ case 'complex64':
1795
+ return new BasicType(Complex64, ti, 8)
1796
+ case 'complex128':
1797
+ return new BasicType(Complex128, ti, 16)
1653
1798
  case 'uint':
1654
1799
  case 'uint32':
1655
1800
  case 'uint64':
@@ -1676,6 +1821,10 @@ class StructType implements Type {
1676
1821
  return new BasicType(Bool, 'bool', 1)
1677
1822
  case 'float64':
1678
1823
  return new BasicType(Float64, 'float64', 8)
1824
+ case 'complex64':
1825
+ return new BasicType(Complex64, 'complex64', 8)
1826
+ case 'complex128':
1827
+ return new BasicType(Complex128, 'complex128', 16)
1679
1828
  default:
1680
1829
  return new BasicType(Invalid, name, 8)
1681
1830
  }
@@ -1793,6 +1942,10 @@ class ChannelType implements Type {
1793
1942
  return 0
1794
1943
  }
1795
1944
 
1945
+ public Len(): number {
1946
+ throw new Error('reflect: call of reflect.Type.Len on chan Type')
1947
+ }
1948
+
1796
1949
  public Bits(): number {
1797
1950
  throw new Error('reflect: call of reflect.Type.Bits on chan Type')
1798
1951
  }
@@ -1826,10 +1979,7 @@ class InterfaceType implements Type {
1826
1979
  }
1827
1980
 
1828
1981
  public PkgPath?(): string {
1829
- if (
1830
- this._name === 'interface{}' ||
1831
- this._name.startsWith('interface {')
1832
- ) {
1982
+ if (this._name === 'interface{}' || this._name.startsWith('interface {')) {
1833
1983
  return ''
1834
1984
  }
1835
1985
  const dotIndex = this._name.lastIndexOf('.')
@@ -1840,10 +1990,7 @@ class InterfaceType implements Type {
1840
1990
  }
1841
1991
 
1842
1992
  public Name(): string {
1843
- if (
1844
- this._name === 'interface{}' ||
1845
- this._name.startsWith('interface {')
1846
- ) {
1993
+ if (this._name === 'interface{}' || this._name.startsWith('interface {')) {
1847
1994
  return this._name
1848
1995
  }
1849
1996
  const dotIndex = this._name.lastIndexOf('.')
@@ -1891,6 +2038,10 @@ class InterfaceType implements Type {
1891
2038
  return 0
1892
2039
  }
1893
2040
 
2041
+ public Len(): number {
2042
+ throw new Error('reflect: call of reflect.Type.Len on interface Type')
2043
+ }
2044
+
1894
2045
  public Bits(): number {
1895
2046
  throw new Error('reflect: call of reflect.Type.Bits on interface Type')
1896
2047
  }
@@ -1945,22 +2096,7 @@ function getTypeOf(value: ReflectValue): Type {
1945
2096
  typeInfo.params &&
1946
2097
  typeInfo.results
1947
2098
  ) {
1948
- // Build proper function signature from type info
1949
- const paramTypes = typeInfo.params
1950
- .map((p: any) => (typeof p === 'string' ? p : p.name || 'any'))
1951
- .join(', ')
1952
- const resultTypes = typeInfo.results.map((r: any) =>
1953
- typeof r === 'string' ? r : r.name || 'any',
1954
- )
1955
-
1956
- let signature = `func(${paramTypes})`
1957
- if (resultTypes.length === 1) {
1958
- signature += ` ${resultTypes[0]}`
1959
- } else if (resultTypes.length > 1) {
1960
- signature += ` (${resultTypes.join(', ')})`
1961
- }
1962
-
1963
- return new FunctionType(signature)
2099
+ return functionTypeFromInfo(typeInfo)
1964
2100
  }
1965
2101
  }
1966
2102
 
@@ -2017,6 +2153,15 @@ function getTypeOf(value: ReflectValue): Type {
2017
2153
  return new PointerType(elemType)
2018
2154
  }
2019
2155
 
2156
+ if (
2157
+ 'real' in value &&
2158
+ 'imag' in value &&
2159
+ typeof (value as $.Complex).real === 'number' &&
2160
+ typeof (value as $.Complex).imag === 'number'
2161
+ ) {
2162
+ return new BasicType(Complex128, 'complex128', 16)
2163
+ }
2164
+
2020
2165
  // Check for arrays
2021
2166
  if (globalThis.Array.isArray(value)) {
2022
2167
  if (value.length === 0) {
@@ -2115,7 +2260,7 @@ function getTypeOf(value: ReflectValue): Type {
2115
2260
  // Check if fieldInfo is a StructFieldInfo with type and tag
2116
2261
  if (isStructFieldInfo(fieldInfo)) {
2117
2262
  return {
2118
- name,
2263
+ name: fieldInfo.name ?? name,
2119
2264
  type: StructType.createTypeFromFieldInfo(fieldInfo.type),
2120
2265
  tag: fieldInfo.tag,
2121
2266
  }
@@ -2155,6 +2300,17 @@ export function ValueOf(i: ReflectValue): Value {
2155
2300
  return new Value(i, getTypeOf(i))
2156
2301
  }
2157
2302
 
2303
+ export function TypeAssert(
2304
+ typeArgs: $.GenericTypeArgs | undefined,
2305
+ v: Value,
2306
+ ): [any, boolean] {
2307
+ const descriptor = typeArgs?.T
2308
+ if (!descriptor?.type) {
2309
+ return [v.Interface(), true]
2310
+ }
2311
+ return $.typeAssertTuple<any>(v.Interface(), descriptor.type)
2312
+ }
2313
+
2158
2314
  export function ArrayOf(length: number, elem: Type): Type {
2159
2315
  return new ArrayType(elem, length)
2160
2316
  }
@@ -2180,10 +2336,123 @@ export function ChanOf(dir: ChanDir, t: Type): Type {
2180
2336
  return new ChannelType(t, dir)
2181
2337
  }
2182
2338
 
2183
- export function TypeFor(): Type {
2339
+ export function TypeFor(typeArgs?: $.GenericTypeArgs): Type {
2340
+ const descriptor = typeArgs?.T
2341
+ if (descriptor?.type) {
2342
+ return typeFromTypeInfo(descriptor.type)
2343
+ }
2344
+ if (descriptor?.methods) {
2345
+ const methods = Object.keys(descriptor.methods)
2346
+ if (methods.length !== 0) {
2347
+ return new InterfaceType(
2348
+ `interface { ${methods.map((method) => method + '()').join('; ')} }`,
2349
+ )
2350
+ }
2351
+ }
2352
+ if (descriptor?.zero) {
2353
+ return getTypeOf(descriptor.zero())
2354
+ }
2184
2355
  return new InterfaceType('interface{}')
2185
2356
  }
2186
2357
 
2358
+ function typeFromTypeInfo(info: $.TypeInfo | string): Type {
2359
+ if (typeof info === 'string') {
2360
+ const registered = builtinGetTypeByName(info)
2361
+ if (registered) {
2362
+ return typeFromTypeInfo(registered)
2363
+ }
2364
+ return StructType.createTypeFromFieldInfo(info)
2365
+ }
2366
+ switch (info.kind) {
2367
+ case $.TypeKind.Array:
2368
+ return new ArrayType(
2369
+ typeFromTypeInfo(
2370
+ info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
2371
+ ),
2372
+ info.length,
2373
+ )
2374
+ case $.TypeKind.Channel:
2375
+ return new ChannelType(
2376
+ typeFromTypeInfo(
2377
+ info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
2378
+ ),
2379
+ chanDirFromTypeInfo(info.direction),
2380
+ )
2381
+ case $.TypeKind.Function:
2382
+ return functionTypeFromInfo(info)
2383
+ case $.TypeKind.Interface:
2384
+ return interfaceTypeFromInfo(info)
2385
+ case $.TypeKind.Map:
2386
+ return new MapType(
2387
+ typeFromTypeInfo(
2388
+ info.keyType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
2389
+ ),
2390
+ typeFromTypeInfo(
2391
+ info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
2392
+ ),
2393
+ )
2394
+ case $.TypeKind.Pointer:
2395
+ return new PointerType(
2396
+ typeFromTypeInfo(
2397
+ info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
2398
+ ),
2399
+ )
2400
+ default:
2401
+ return StructType.createTypeFromFieldInfo(info)
2402
+ }
2403
+ }
2404
+
2405
+ function functionTypeFromInfo(info: $.FunctionTypeInfo): Type {
2406
+ if (info.name) {
2407
+ return new FunctionType(info.name)
2408
+ }
2409
+ const params = info.params ?? []
2410
+ const paramTypes = params.map((param, index) => {
2411
+ const typeName = functionSignatureTypeName(param)
2412
+ if (!info.isVariadic || index !== params.length - 1) {
2413
+ return typeName
2414
+ }
2415
+ if (typeName.startsWith('[]')) {
2416
+ return '...' + typeName.slice(2)
2417
+ }
2418
+ return '...' + typeName
2419
+ })
2420
+ const resultTypes = (info.results ?? []).map(functionSignatureTypeName)
2421
+ let signature = `func(${paramTypes.join(', ')})`
2422
+ if (resultTypes.length === 1) {
2423
+ signature += ` ${resultTypes[0]}`
2424
+ }
2425
+ if (resultTypes.length > 1) {
2426
+ signature += ` (${resultTypes.join(', ')})`
2427
+ }
2428
+ return new FunctionType(signature)
2429
+ }
2430
+
2431
+ function functionSignatureTypeName(info: $.TypeInfo | string): string {
2432
+ return typeFromTypeInfo(info).String()
2433
+ }
2434
+
2435
+ function interfaceTypeFromInfo(info: $.InterfaceTypeInfo): Type {
2436
+ if (info.methods.length === 0) {
2437
+ return new InterfaceType('interface{}', info.name)
2438
+ }
2439
+ return new InterfaceType(
2440
+ `interface { ${info.methods.map((method) => method.name + '()').join('; ')} }`,
2441
+ info.name,
2442
+ )
2443
+ }
2444
+
2445
+ function chanDirFromTypeInfo(direction?: 'send' | 'receive' | 'both'): ChanDir {
2446
+ switch (direction) {
2447
+ case 'send':
2448
+ return SendDir
2449
+ case 'receive':
2450
+ return RecvDir
2451
+ default:
2452
+ return BothDir
2453
+ }
2454
+ }
2455
+
2187
2456
  /**
2188
2457
  * getInterfaceTypeByName looks up a registered interface type by name
2189
2458
  * and returns a Type for it. Returns an interface{} type if not found.
@@ -0,0 +1,75 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import {
3
+ TypeKind,
4
+ registerInterfaceType,
5
+ registerStructType,
6
+ } from '../builtin/index.js'
7
+ import { Int, Struct, TypeFor } from './type.js'
8
+
9
+ describe('TypeFor', () => {
10
+ it('uses generic runtime type descriptors', () => {
11
+ const intType = TypeFor({
12
+ T: {
13
+ type: { kind: TypeKind.Basic, name: 'int' },
14
+ zero: () => 0,
15
+ },
16
+ })
17
+
18
+ expect(intType.String()).toBe('int')
19
+ expect(intType.Kind()).toBe(Int)
20
+ })
21
+
22
+ it('formats literal interface methods from type metadata', () => {
23
+ const ifaceType = TypeFor({
24
+ T: {
25
+ type: {
26
+ kind: TypeKind.Interface,
27
+ methods: [{ name: 'SomeMethod', args: [], returns: [] }],
28
+ },
29
+ zero: () => null,
30
+ },
31
+ })
32
+
33
+ expect(ifaceType.String()).toBe('interface { SomeMethod() }')
34
+ })
35
+
36
+ it('formats unnamed function signatures from type metadata', () => {
37
+ const fnType = TypeFor({
38
+ T: {
39
+ type: {
40
+ kind: TypeKind.Function,
41
+ params: [{ kind: TypeKind.Basic, name: 'int' }],
42
+ results: [{ kind: TypeKind.Basic, name: 'string' }],
43
+ },
44
+ zero: () => null,
45
+ },
46
+ })
47
+
48
+ expect(fnType.String()).toBe('func(int) string')
49
+ })
50
+
51
+ it('resolves registered type names from descriptors', () => {
52
+ class RegisteredStruct {}
53
+ registerStructType(
54
+ 'main.RegisteredStruct',
55
+ new RegisteredStruct(),
56
+ [],
57
+ RegisteredStruct,
58
+ {},
59
+ )
60
+ registerInterfaceType('main.RegisteredInterface', null, [
61
+ { name: 'SomeMethod', args: [], returns: [] },
62
+ ])
63
+
64
+ const structType = TypeFor({
65
+ T: { type: 'main.RegisteredStruct', zero: () => new RegisteredStruct() },
66
+ })
67
+ const ifaceType = TypeFor({
68
+ T: { type: 'main.RegisteredInterface', zero: () => null },
69
+ })
70
+
71
+ expect(structType.String()).toBe('main.RegisteredStruct')
72
+ expect(structType.Kind()).toBe(Struct)
73
+ expect(ifaceType.String()).toBe('interface { SomeMethod() }')
74
+ })
75
+ })
@@ -0,0 +1,24 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+
3
+ import { PrintStack, Stack } from './index.js'
4
+
5
+ describe('runtime/debug override', () => {
6
+ it('returns a stack trace as bytes', () => {
7
+ const stack = Stack()
8
+
9
+ expect(stack).toBeInstanceOf(Uint8Array)
10
+ expect(new TextDecoder().decode(stack)).toContain('Error')
11
+ })
12
+
13
+ it('prints the current stack trace', () => {
14
+ const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {})
15
+
16
+ try {
17
+ PrintStack()
18
+ expect(consoleError).toHaveBeenCalledTimes(1)
19
+ expect(consoleError.mock.calls[0][0]).toContain('Error')
20
+ } finally {
21
+ consoleError.mockRestore()
22
+ }
23
+ })
24
+ })
@@ -0,0 +1,8 @@
1
+ export function Stack(): Uint8Array {
2
+ const stack = new Error().stack ?? 'stack trace unavailable'
3
+ return new TextEncoder().encode(stack)
4
+ }
5
+
6
+ export function PrintStack(): void {
7
+ console.error(new TextDecoder().decode(Stack()))
8
+ }
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import {
4
+ Compiler,
5
+ FuncForPC,
6
+ ReadTrace,
7
+ StartTrace,
8
+ StopTrace,
9
+ } from './runtime.js'
10
+
11
+ describe('runtime override', () => {
12
+ it('exposes stack and trace compatibility helpers', () => {
13
+ expect(Compiler).toBe('gc')
14
+ expect(FuncForPC(0)).toBeNull()
15
+ expect(StartTrace()).toBeNull()
16
+ expect(ReadTrace()).toBeNull()
17
+ expect(() => StopTrace()).not.toThrow()
18
+ })
19
+ })