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
@@ -29,19 +29,29 @@ export type NodeFSModule = {
29
29
  lchownSync?(path: string, uid: number, gid: number): void
30
30
  linkSync?(existingPath: string, newPath: string): void
31
31
  lstatSync?(path: string): any
32
- mkdirSync?(path: string, options?: number | { mode?: number; recursive?: boolean }): void
32
+ mkdirSync?(
33
+ path: string,
34
+ options?: number | { mode?: number; recursive?: boolean },
35
+ ): void
33
36
  readFileSync?(path: string): Uint8Array
34
37
  readdirSync?(path: string, options?: { withFileTypes?: boolean }): any[]
35
38
  readlinkSync?(path: string): string
36
39
  renameSync?(oldPath: string, newPath: string): void
37
- rmSync?(path: string, options?: { force?: boolean; recursive?: boolean }): void
40
+ rmSync?(
41
+ path: string,
42
+ options?: { force?: boolean; recursive?: boolean },
43
+ ): void
38
44
  rmdirSync?(path: string): void
39
45
  statSync?(path: string): any
40
46
  symlinkSync?(target: string, path: string): void
41
47
  truncateSync?(path: string, len?: number): void
42
48
  unlinkSync?(path: string): void
43
49
  utimesSync?(path: string, atime: Date | number, mtime: Date | number): void
44
- writeFileSync?(path: string, data: Uint8Array, options?: { mode?: number }): void
50
+ writeFileSync?(
51
+ path: string,
52
+ data: Uint8Array,
53
+ options?: { mode?: number },
54
+ ): void
45
55
  }
46
56
 
47
57
  export type DenoStream = {
@@ -75,6 +85,13 @@ export type HostRuntime = {
75
85
  writeStdoutText: HostTextWrite
76
86
  }
77
87
 
88
+ export type HostRuntimeDetector = () => HostRuntime
89
+
90
+ export type MainScriptMeta = {
91
+ url: string
92
+ main?: boolean
93
+ }
94
+
78
95
  const encoder = new TextEncoder()
79
96
 
80
97
  function getDynamicRequire(): ((specifier: string) => unknown) | null {
@@ -149,12 +166,66 @@ function detectNodeFS(processObj: any | null): NodeFSModule | null {
149
166
  return null
150
167
  }
151
168
 
152
- function unsupportedReadFD(_fd: number, _buffer: Uint8Array): number | null {
153
- throw new HostUnsupportedError()
169
+ function hasURLScheme(path: string): boolean {
170
+ return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(path)
171
+ }
172
+
173
+ function isAbsoluteScriptPath(path: string): boolean {
174
+ return path.startsWith('/') || /^[A-Za-z]:[\\/]/.test(path)
175
+ }
176
+
177
+ function normalizePath(path: string): string {
178
+ return path.replace(/\\/g, '/')
179
+ }
180
+
181
+ function absolutePathToFileURL(path: string, isDirectory: boolean): string {
182
+ const normalized = normalizePath(path)
183
+ const suffix = isDirectory && !normalized.endsWith('/') ? '/' : ''
184
+ if (/^[A-Za-z]:\//.test(normalized)) {
185
+ return new URL(`file:///${normalized}${suffix}`).href
186
+ }
187
+ return new URL(`file://${normalized}${suffix}`).href
188
+ }
189
+
190
+ function getCurrentWorkingDirectory(): string | null {
191
+ const runtime = getHostRuntime()
192
+ try {
193
+ if (typeof runtime.processObj?.cwd === 'function') {
194
+ return runtime.processObj.cwd()
195
+ }
196
+ } catch {
197
+ // Fall through to Deno cwd.
198
+ }
199
+
200
+ try {
201
+ if (typeof runtime.deno?.cwd === 'function') {
202
+ return runtime.deno.cwd()
203
+ }
204
+ } catch {
205
+ // No cwd fallback available.
206
+ }
207
+
208
+ return null
154
209
  }
155
210
 
156
- function unsupportedWriteFD(_fd: number, _buffer: Uint8Array): number {
157
- throw new HostUnsupportedError()
211
+ function fileURLFromScriptPath(path: string): string | null {
212
+ try {
213
+ if (hasURLScheme(path)) {
214
+ return new URL(path).href
215
+ }
216
+
217
+ if (isAbsoluteScriptPath(path)) {
218
+ return absolutePathToFileURL(path, false)
219
+ }
220
+
221
+ const cwd = getCurrentWorkingDirectory()
222
+ if (!cwd) {
223
+ return null
224
+ }
225
+ return new URL(normalizePath(path), absolutePathToFileURL(cwd, true)).href
226
+ } catch {
227
+ return null
228
+ }
158
229
  }
159
230
 
160
231
  function fallbackConsoleWriter(method: 'error' | 'log'): HostTextWrite {
@@ -193,10 +264,7 @@ function detectHostRuntime(): HostRuntime {
193
264
  }
194
265
  }
195
266
 
196
- const platform =
197
- deno?.build?.os ??
198
- processObj?.platform ??
199
- 'unknown'
267
+ const platform = deno?.build?.os ?? processObj?.platform ?? 'unknown'
200
268
 
201
269
  const getEnv = (name: string): string => {
202
270
  if (deno?.env?.get) {
@@ -209,64 +277,67 @@ function detectHostRuntime(): HostRuntime {
209
277
  return processObj?.env?.[name] ?? ''
210
278
  }
211
279
 
212
- let readFD: HostReadFD = unsupportedReadFD
213
- let writeFD: HostWriteFD = unsupportedWriteFD
214
- let writeStdoutText: HostTextWrite = fallbackConsoleWriter('log')
215
- let writeStderrText: HostTextWrite = fallbackConsoleWriter('error')
216
-
217
- if (deno) {
218
- readFD = (fd: number, buffer: Uint8Array): number | null => {
219
- const handle = getStdioHandle(fd)
220
- if (!handle || typeof handle.readSync !== 'function') {
221
- throw new HostUnsupportedError()
222
- }
280
+ const readFD: HostReadFD = (
281
+ fd: number,
282
+ buffer: Uint8Array,
283
+ ): number | null => {
284
+ const handle = getStdioHandle(fd)
285
+ if (handle && typeof handle.readSync === 'function') {
223
286
  return handle.readSync(buffer)
224
287
  }
225
- writeFD = (fd: number, buffer: Uint8Array): number => {
226
- const handle = getStdioHandle(fd)
227
- if (!handle || typeof handle.writeSync !== 'function') {
228
- throw new HostUnsupportedError()
229
- }
288
+ if (nodeFS) {
289
+ return nodeFS.readSync(fd, buffer, 0, buffer.length, null)
290
+ }
291
+ throw new HostUnsupportedError()
292
+ }
293
+ const writeFD: HostWriteFD = (fd: number, buffer: Uint8Array): number => {
294
+ const handle = getStdioHandle(fd)
295
+ if (handle && typeof handle.writeSync === 'function') {
230
296
  return writeAllSync(
231
297
  (chunk: Uint8Array) => handle.writeSync!(chunk),
232
298
  buffer,
233
299
  )
234
300
  }
235
- writeStdoutText = (data: string) => {
236
- const handle = getStdioHandle(1)
237
- if (!handle || typeof handle.writeSync !== 'function') {
238
- fallbackConsoleWriter('log')(data)
239
- return
240
- }
241
- writeAllText((chunk: Uint8Array) => handle.writeSync!(chunk), data)
242
- }
243
- writeStderrText = (data: string) => {
244
- const handle = getStdioHandle(2)
245
- if (!handle || typeof handle.writeSync !== 'function') {
246
- fallbackConsoleWriter('error')(data)
247
- return
248
- }
249
- writeAllText((chunk: Uint8Array) => handle.writeSync!(chunk), data)
250
- }
251
- } else if (nodeFS) {
252
- readFD = (fd: number, buffer: Uint8Array): number | null =>
253
- nodeFS.readSync(fd, buffer, 0, buffer.length, null)
254
- writeFD = (fd: number, buffer: Uint8Array): number =>
255
- writeAllSync(
301
+ if (nodeFS) {
302
+ return writeAllSync(
256
303
  (chunk: Uint8Array) =>
257
304
  nodeFS.writeSync(fd, chunk, 0, chunk.length, null),
258
305
  buffer,
259
306
  )
260
- writeStdoutText = (data: string) =>
307
+ }
308
+ throw new HostUnsupportedError()
309
+ }
310
+ const writeStdoutText: HostTextWrite = (data: string) => {
311
+ const handle = getStdioHandle(1)
312
+ if (handle && typeof handle.writeSync === 'function') {
313
+ writeAllText((chunk: Uint8Array) => handle.writeSync!(chunk), data)
314
+ return
315
+ }
316
+ if (nodeFS) {
261
317
  writeAllText(
262
- (chunk: Uint8Array) => nodeFS.writeSync(1, chunk, 0, chunk.length, null),
318
+ (chunk: Uint8Array) =>
319
+ nodeFS.writeSync(1, chunk, 0, chunk.length, null),
263
320
  data,
264
321
  )
265
- writeStderrText = (data: string) =>
322
+ return
323
+ }
324
+ fallbackConsoleWriter('log')(data)
325
+ }
326
+ const writeStderrText: HostTextWrite = (data: string) => {
327
+ const handle = getStdioHandle(2)
328
+ if (handle && typeof handle.writeSync === 'function') {
329
+ writeAllText((chunk: Uint8Array) => handle.writeSync!(chunk), data)
330
+ return
331
+ }
332
+ if (nodeFS) {
266
333
  writeAllText(
267
- (chunk: Uint8Array) => nodeFS.writeSync(2, chunk, 0, chunk.length, null),
334
+ (chunk: Uint8Array) =>
335
+ nodeFS.writeSync(2, chunk, 0, chunk.length, null),
268
336
  data,
269
337
  )
338
+ return
339
+ }
340
+ fallbackConsoleWriter('error')(data)
270
341
  }
271
342
 
272
343
  return {
@@ -283,16 +354,60 @@ function detectHostRuntime(): HostRuntime {
283
354
  }
284
355
  }
285
356
 
286
- export let hostRuntime = detectHostRuntime()
357
+ export class HostRuntimeOwner {
358
+ private runtime: HostRuntime
359
+
360
+ constructor(
361
+ private readonly detector: HostRuntimeDetector = detectHostRuntime,
362
+ ) {
363
+ this.runtime = detector()
364
+ }
365
+
366
+ current(): HostRuntime {
367
+ return this.runtime
368
+ }
369
+
370
+ reset(): void {
371
+ this.runtime = this.detector()
372
+ }
373
+ }
374
+
375
+ export const hostRuntimeOwner = new HostRuntimeOwner()
376
+
377
+ export function getHostRuntime(): HostRuntime {
378
+ return hostRuntimeOwner.current()
379
+ }
287
380
 
288
381
  export function resetHostRuntimeForTests(): void {
289
- hostRuntime = detectHostRuntime()
382
+ hostRuntimeOwner.reset()
290
383
  }
291
384
 
292
385
  export function writeHostStdoutText(data: string): void {
293
- hostRuntime.writeStdoutText(data)
386
+ getHostRuntime().writeStdoutText(data)
294
387
  }
295
388
 
296
389
  export function writeHostStderrText(data: string): void {
297
- hostRuntime.writeStderrText(data)
390
+ getHostRuntime().writeStderrText(data)
391
+ }
392
+
393
+ export function isMainScript(meta: MainScriptMeta): boolean {
394
+ if (meta.main === true) {
395
+ return true
396
+ }
397
+
398
+ const entryPath = getHostRuntime().processObj?.argv?.[1]
399
+ if (typeof entryPath !== 'string' || entryPath === '') {
400
+ return false
401
+ }
402
+
403
+ const entryURL = fileURLFromScriptPath(entryPath)
404
+ if (!entryURL) {
405
+ return false
406
+ }
407
+
408
+ try {
409
+ return new URL(meta.url).href === entryURL
410
+ } catch {
411
+ return meta.url === entryURL
412
+ }
298
413
  }
@@ -6,3 +6,4 @@ export * from './type.js'
6
6
  export * from './varRef.js'
7
7
  export * from './defer.js'
8
8
  export * from './errors.js'
9
+ export * from './hostio.js'
@@ -0,0 +1,356 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest'
2
+
3
+ import {
4
+ bytesToUint8Array,
5
+ byte,
6
+ cap,
7
+ cloneStructValue,
8
+ callGenericMethod,
9
+ chanRecvWithOk,
10
+ functionValue,
11
+ genericZero,
12
+ goSlice,
13
+ int,
14
+ indexAddress,
15
+ indexRef,
16
+ interfaceValue,
17
+ len,
18
+ makeSlice,
19
+ makeChannel,
20
+ makeMap,
21
+ mapGet,
22
+ mapSet,
23
+ markAsStructValue,
24
+ namedFunction,
25
+ newError,
26
+ pointerValue,
27
+ print,
28
+ println,
29
+ rangeString,
30
+ registerInterfaceType,
31
+ registerStructType,
32
+ resetHostRuntimeForTests,
33
+ sliceToArray,
34
+ TypeKind,
35
+ typeAssert,
36
+ typedNil,
37
+ uint,
38
+ uint64Add,
39
+ uint64And,
40
+ uint64Mul,
41
+ uint64Or,
42
+ uint64Shl,
43
+ uint64Shr,
44
+ uint64Sub,
45
+ uint64Xor,
46
+ uintShr,
47
+ unref,
48
+ unsupportedPointerRef,
49
+ varRef,
50
+ } from './index.js'
51
+
52
+ const originalDeno = (globalThis as any).Deno
53
+ const originalProcess = (globalThis as any).process
54
+
55
+ afterEach(() => {
56
+ vi.restoreAllMocks()
57
+
58
+ if (originalDeno === undefined) {
59
+ delete (globalThis as any).Deno
60
+ } else {
61
+ ;(globalThis as any).Deno = originalDeno
62
+ }
63
+
64
+ if (originalProcess === undefined) {
65
+ delete (globalThis as any).process
66
+ } else {
67
+ ;(globalThis as any).process = originalProcess
68
+ }
69
+
70
+ resetHostRuntimeForTests()
71
+ })
72
+
73
+ describe('builtin runtime contract helpers', () => {
74
+ it('writes print and println through the host runtime owner', () => {
75
+ const writes: Array<{ fd: number; text: string }> = []
76
+ const writeSync = vi.fn(
77
+ (
78
+ fd: number,
79
+ buffer: Uint8Array,
80
+ _offset?: number,
81
+ length?: number,
82
+ _position?: number | null,
83
+ ) => {
84
+ writes.push({
85
+ fd,
86
+ text: new TextDecoder().decode(
87
+ buffer.subarray(0, length ?? buffer.length),
88
+ ),
89
+ })
90
+ return length ?? buffer.length
91
+ },
92
+ )
93
+
94
+ delete (globalThis as any).Deno
95
+ ;(globalThis as any).process = {
96
+ getBuiltinModule: vi.fn(() => ({
97
+ readSync: vi.fn(),
98
+ writeSync,
99
+ })),
100
+ }
101
+ resetHostRuntimeForTests()
102
+
103
+ print('value:', 3)
104
+ println('done')
105
+
106
+ expect(writes).toEqual([
107
+ { fd: 1, text: 'value: 3' },
108
+ { fd: 1, text: 'done\n' },
109
+ ])
110
+ })
111
+
112
+ it('exposes numeric, varref, map, and error helpers', () => {
113
+ expect(int(1.9)).toBe(1)
114
+ expect(int(3n)).toBe(3)
115
+ expect(uint(-1n, 8)).toBe(255)
116
+ expect(byte(257)).toBe(1)
117
+ expect(uint(uint64Shl(1n, 63), 32)).toBe(0)
118
+ expect(uint(uint64Shr(uint64Shl(1n, 63), 60), 32)).toBe(8)
119
+ expect(uint(uint64Mul(0xffffffffffffffffn, 3), 32)).toBe(0xfffffffd)
120
+ expect(uint(uint64Add(0xffffffffffffffffn, 2), 32)).toBe(1)
121
+ expect(uint(uint64Sub(1n, 2), 32)).toBe(0xffffffff)
122
+ expect(uint(uint64And(0xf0n, 0x3cn), 32)).toBe(0x30)
123
+ expect(uint(uint64Or(0xf0n, 0x0fn), 32)).toBe(0xff)
124
+ expect(uint(uint64Xor(0xf0n, 0xffn), 32)).toBe(0x0f)
125
+ expect(uintShr(0x80000000, 31, 32)).toBe(1)
126
+ expect(uintShr(0x80000000, 32, 32)).toBe(0)
127
+ expect(uintShr(0xff, 4, 8)).toBe(15)
128
+
129
+ const value = varRef(4)
130
+ value.value = 8
131
+ expect(unref(value)).toBe(8)
132
+ expect(pointerValue(value)).toBe(8)
133
+ const pointerAssert = typeAssert<typeof value>(value, {
134
+ kind: TypeKind.Pointer,
135
+ elemType: { kind: TypeKind.Basic, name: 'int' },
136
+ })
137
+ expect(pointerAssert).toEqual({ value, ok: true })
138
+ const nilNamedSlice = varRef(null)
139
+ const nilNamedSliceIface = interfaceValue(
140
+ nilNamedSlice,
141
+ '*main.ObjectIdentifier',
142
+ )
143
+ expect(
144
+ typeAssert<typeof nilNamedSlice>(nilNamedSliceIface, {
145
+ kind: TypeKind.Pointer,
146
+ elemType: 'main.ObjectIdentifier',
147
+ }),
148
+ ).toEqual({ value: nilNamedSlice, ok: true })
149
+ expect(pointerValue({ ok: true })).toEqual({ ok: true })
150
+ expect(cloneStructValue({ clone: () => ({ ok: true }) })).toEqual({
151
+ ok: true,
152
+ })
153
+ expect(
154
+ cloneStructValue({ __goscriptClone: () => ({ internal: true }) }),
155
+ ).toEqual({ internal: true })
156
+ expect(() => pointerValue(null)).toThrow('nil pointer dereference')
157
+ const unsupported = unsupportedPointerRef<number>(0)
158
+ expect(() => unsupported.value).toThrow('unsafe pointer dereference')
159
+ expect(() => {
160
+ unsupported.value = 1
161
+ }).toThrow('unsafe pointer dereference')
162
+
163
+ const m = makeMap<string, number>()
164
+ mapSet(m, 'answer', 42)
165
+ expect(mapGet(m, 'answer', 0)).toEqual([42, true])
166
+ expect(mapGet(m, 'missing', 0)).toEqual([0, false])
167
+
168
+ expect(newError('bad')?.Error()).toBe('bad')
169
+ expect(rangeString('a¢€')).toEqual([
170
+ [0, 97],
171
+ [1, 162],
172
+ [3, 8364],
173
+ ])
174
+ })
175
+
176
+ it('exposes addressable slice and array index references', () => {
177
+ const values = [1, 2, 3]
178
+ const second = indexRef(values, 1)
179
+ second.value = 8
180
+ expect(values).toEqual([1, 8, 3])
181
+ expect(pointerValue(second)).toBe(8)
182
+
183
+ const view = goSlice(values, 1, 3)
184
+ const firstInView = indexRef(view, 0)
185
+ firstInView.value = 11
186
+ expect(values).toEqual([1, 11, 3])
187
+ expect(Object.getOwnPropertyDescriptor(view, '0')?.value).toBe(11)
188
+
189
+ const bytes = new Uint8Array([4, 5])
190
+ const firstByte = indexRef<number>(bytes, 0)
191
+ firstByte.value = 9
192
+ expect(Array.from(bytes)).toEqual([9, 5])
193
+
194
+ const byteBacking = makeSlice<number>(8, undefined, 'byte')
195
+ const shortBytes = goSlice(byteBacking as Uint8Array, 0, 2)
196
+ expect(len(shortBytes)).toBe(2)
197
+ expect(cap(shortBytes)).toBe(8)
198
+ const fullBytes = goSlice(shortBytes, 0, 8)
199
+ fullBytes![7] = 12
200
+ expect((byteBacking as Uint8Array)[7]).toBe(12)
201
+
202
+ shortBytes![0] = 14
203
+ expect(bytesToUint8Array(shortBytes)).toEqual(new Uint8Array([14, 0]))
204
+ })
205
+
206
+ it('exposes stable synthetic slice index addresses', () => {
207
+ const values = [1, 2, 3, 4]
208
+ const left = goSlice(values, 1, 3)
209
+ const right = goSlice(values, 2, 4)
210
+ const other = [8, 9]
211
+
212
+ expect(indexAddress(left, 0)).toBe(indexAddress(values, 1))
213
+ expect(indexAddress(left, 1)).toBe(indexAddress(right, 0))
214
+ expect(indexAddress(left, 1)).toBeGreaterThan(indexAddress(left, 0))
215
+ expect(indexAddress(other, 0)).not.toBe(indexAddress(left, 0))
216
+ })
217
+
218
+ it('copies slices into fixed arrays with Go length checks', () => {
219
+ const source = goSlice([1, 2, 3], 1, 3)
220
+ const array = sliceToArray<number>(source, 2)
221
+ array[0] = 9
222
+
223
+ expect(array).toEqual([9, 3])
224
+ expect(source![0]).toBe(2)
225
+ expect(() => sliceToArray<number>(source, 3)).toThrow(
226
+ 'cannot convert slice with length 2 to array with length 3',
227
+ )
228
+
229
+ expect(sliceToArray<number>(new Uint8Array([4, 5, 6]), 2, 'byte')).toEqual(
230
+ new Uint8Array([4, 5]),
231
+ )
232
+ })
233
+
234
+ it('exposes value and type descriptor helpers', () => {
235
+ class Runner {
236
+ public Run(): string {
237
+ return 'ok'
238
+ }
239
+ }
240
+
241
+ const runnerType = registerStructType(
242
+ 'phase5.Runner',
243
+ markAsStructValue(new Runner()),
244
+ [{ name: 'Run', args: [], returns: [{ type: 'string' }] }],
245
+ Runner,
246
+ )
247
+ const runnerInterface = registerInterfaceType(
248
+ 'phase5.RunnerInterface',
249
+ null,
250
+ [{ name: 'Run', args: [], returns: [{ type: 'string' }] }],
251
+ )
252
+
253
+ const value = new Runner()
254
+ expect(markAsStructValue(value)).toBe(value)
255
+ expect(typeAssert<Runner>(value, runnerType)).toEqual({
256
+ ok: true,
257
+ value,
258
+ })
259
+ expect(typeAssert<Runner>(new Runner(), runnerInterface).ok).toBe(true)
260
+ expect(typeAssert<Runner>(null, runnerInterface).ok).toBe(false)
261
+
262
+ const nil = typedNil('*main.Example')
263
+ expect(nil.__isTypedNil).toBe(true)
264
+ expect(nil.__goType).toBe('*main.Example')
265
+ expect(
266
+ typeAssert<Runner | null>(typedNil('*phase5.Runner'), {
267
+ kind: TypeKind.Pointer,
268
+ elemType: 'phase5.Runner',
269
+ }),
270
+ ).toEqual({ value: null, ok: true })
271
+ expect(TypeKind.Pointer).toBe('pointer')
272
+
273
+ class TypedDog {
274
+ public Name(this: TypedDog | null): string {
275
+ if (this === null) {
276
+ return 'unknown dog'
277
+ }
278
+ return 'dog'
279
+ }
280
+ }
281
+
282
+ registerStructType(
283
+ 'phase5.TypedDog',
284
+ new TypedDog(),
285
+ [{ name: 'Name', args: [], returns: [{ type: 'string' }] }],
286
+ TypedDog,
287
+ )
288
+ const dogInterface = registerInterfaceType(
289
+ 'phase5.DogInterface',
290
+ null,
291
+ [{ name: 'Name', args: [], returns: [{ type: 'string' }] }],
292
+ )
293
+ const nilDog = interfaceValue<{ Name(): string } | null>(
294
+ null,
295
+ '*phase5.TypedDog',
296
+ )
297
+ expect(nilDog).not.toBeNull()
298
+ expect(nilDog!.Name()).toBe('unknown dog')
299
+ expect(typeAssert<{ Name(): string }>(nilDog, dogInterface).ok).toBe(true)
300
+ expect(
301
+ typeAssert<TypedDog | null>(nilDog, {
302
+ kind: TypeKind.Pointer,
303
+ elemType: 'phase5.TypedDog',
304
+ }),
305
+ ).toEqual({ value: null, ok: true })
306
+
307
+ const greet = namedFunction((name: string) => `hello ${name}`, 'phase5.Greet')
308
+ expect(typeAssert<typeof greet>(greet, {
309
+ kind: TypeKind.Function,
310
+ name: 'phase5.Greet',
311
+ }).ok).toBe(true)
312
+ expect(
313
+ typeAssert<{ Name: string }>(
314
+ { Name: 'Alice' },
315
+ {
316
+ kind: TypeKind.Struct,
317
+ methods: [],
318
+ fields: {
319
+ Name: {
320
+ type: { kind: TypeKind.Basic, name: 'string' },
321
+ tag: 'json:"name"',
322
+ },
323
+ },
324
+ },
325
+ ).ok,
326
+ ).toBe(true)
327
+ const literal = functionValue((value: number) => String(value), {
328
+ kind: TypeKind.Function,
329
+ params: [{ kind: TypeKind.Basic, name: 'int' }],
330
+ results: [{ kind: TypeKind.Basic, name: 'string' }],
331
+ })
332
+ expect(literal(7)).toBe('7')
333
+ expect(literal).toHaveProperty('__typeInfo')
334
+
335
+ const genericArgs = {
336
+ T: {
337
+ zero: () => 0,
338
+ methods: {
339
+ String: (value: number) => String(value),
340
+ },
341
+ },
342
+ }
343
+ expect(genericZero(genericArgs, 'T', null)).toBe(0)
344
+ expect(callGenericMethod(genericArgs, 'T', 'String', 12)).toBe('12')
345
+ })
346
+
347
+ it('exposes channel helpers used by future lowering', async () => {
348
+ const channel = makeChannel<number>(1, 0, 'both')
349
+ await channel.send(7)
350
+ expect(len(channel)).toBe(1)
351
+ expect(await chanRecvWithOk(channel)).toEqual({ value: 7, ok: true })
352
+ expect(len(channel)).toBe(0)
353
+ channel.close()
354
+ expect(await chanRecvWithOk(channel)).toEqual({ value: 0, ok: false })
355
+ })
356
+ })