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
@@ -2,6 +2,15 @@ import type { Slice, SliceProxy } from './slice.js'
2
2
  import { writeHostStdoutText } from './hostio.js'
3
3
  import { formatPrintedArgs } from './print.js'
4
4
  import { isSliceProxy } from './slice.js'
5
+ import { isVarRef, type VarRef } from './varRef.js'
6
+
7
+ /**
8
+ * Implementation of Go's built-in print function
9
+ * @param args Arguments to print
10
+ */
11
+ export function print(...args: any[]): void {
12
+ writeHostStdoutText(args.length === 0 ? '' : formatPrintedArgs(args))
13
+ }
5
14
 
6
15
  /**
7
16
  * Implementation of Go's built-in println function
@@ -26,7 +35,7 @@ export function panic(...args: any[]): never {
26
35
  * For maps, it deletes all entries.
27
36
  * @param v The slice or map to clear
28
37
  */
29
- export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
38
+ export function clear<T>(v: Slice<T> | Map<unknown, unknown> | null): void {
30
39
  if (v === null || v === undefined) {
31
40
  return
32
41
  }
@@ -34,12 +43,40 @@ export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
34
43
  v.clear()
35
44
  return
36
45
  }
46
+ if (v instanceof Uint8Array) {
47
+ v.fill(0)
48
+ return
49
+ }
50
+ if (isSliceProxy(v)) {
51
+ const zero = clearZeroValue(v)
52
+ for (let i = 0; i < v.length; i++) {
53
+ v[i] = zero
54
+ }
55
+ return
56
+ }
37
57
  if (Array.isArray(v)) {
38
- v.fill(null as T)
58
+ v.fill(clearZeroValue(v))
39
59
  return
40
60
  }
41
61
  }
42
62
 
63
+ function clearZeroValue<T>(v: T[]): T {
64
+ for (const item of v) {
65
+ if (item !== null && item !== undefined) {
66
+ switch (typeof item) {
67
+ case 'number':
68
+ return 0 as T
69
+ case 'string':
70
+ return '' as T
71
+ case 'boolean':
72
+ return false as T
73
+ }
74
+ break
75
+ }
76
+ }
77
+ return null as T
78
+ }
79
+
43
80
  /**
44
81
  * assignStruct copies all field values from source struct to target struct.
45
82
  * Used for pointer dereference assignment: *p = value
@@ -69,13 +106,155 @@ export function assignStruct<T>(target: T, source: T): void {
69
106
  }
70
107
  }
71
108
 
109
+ /**
110
+ * pointerValue unwraps a Go pointer value for generated field, method, and
111
+ * dereference access. Struct pointers may be represented directly as class
112
+ * instances or indirectly as VarRef values when the pointer came from taking a
113
+ * variable's address.
114
+ */
115
+ export function pointerValue<T>(value: T | VarRef<T> | null | undefined): T {
116
+ if (value === null || value === undefined) {
117
+ throw new Error(
118
+ 'runtime error: invalid memory address or nil pointer dereference',
119
+ )
120
+ }
121
+ if (isVarRef(value)) {
122
+ return value.value as T
123
+ }
124
+ return value
125
+ }
126
+
127
+ export function arrayEqual(a: unknown, b: unknown): boolean {
128
+ return comparableEqual(a, b)
129
+ }
130
+
131
+ function comparableEqual(a: unknown, b: unknown): boolean {
132
+ if (a === b) {
133
+ return true
134
+ }
135
+ if (a === null || a === undefined || b === null || b === undefined) {
136
+ return false
137
+ }
138
+ if (isArrayLike(a) && isArrayLike(b)) {
139
+ if (a.length !== b.length) {
140
+ return false
141
+ }
142
+ for (let i = 0; i < a.length; i++) {
143
+ if (!comparableEqual(a[i], b[i])) {
144
+ return false
145
+ }
146
+ }
147
+ return true
148
+ }
149
+ if (hasGoType(a) || hasGoType(b)) {
150
+ if (!hasGoType(a) || !hasGoType(b) || a.__goType !== b.__goType) {
151
+ return false
152
+ }
153
+ if (a.__isTypedNil || b.__isTypedNil) {
154
+ return a.__isTypedNil === true && b.__isTypedNil === true
155
+ }
156
+ }
157
+ if (isStructValue(a) && isStructValue(b)) {
158
+ return fieldsEqual(a._fields, b._fields)
159
+ }
160
+ return false
161
+ }
162
+
163
+ function isArrayLike(value: unknown): value is ArrayLike<unknown> {
164
+ return Array.isArray(value) || value instanceof Uint8Array
165
+ }
166
+
167
+ function hasGoType(value: unknown): value is {
168
+ __goType: string
169
+ __isTypedNil?: boolean
170
+ } {
171
+ return (
172
+ typeof value === 'object' &&
173
+ value !== null &&
174
+ typeof (value as { __goType?: unknown }).__goType === 'string'
175
+ )
176
+ }
177
+
178
+ function isStructValue(value: unknown): value is {
179
+ _fields: Record<string, VarRef<unknown>>
180
+ } {
181
+ return (
182
+ typeof value === 'object' &&
183
+ value !== null &&
184
+ typeof (value as { _fields?: unknown })._fields === 'object' &&
185
+ (value as { _fields?: unknown })._fields !== null
186
+ )
187
+ }
188
+
189
+ function fieldsEqual(
190
+ a: Record<string, VarRef<unknown>>,
191
+ b: Record<string, VarRef<unknown>>,
192
+ ): boolean {
193
+ const aKeys = Object.keys(a)
194
+ const bKeys = Object.keys(b)
195
+ if (aKeys.length !== bKeys.length) {
196
+ return false
197
+ }
198
+ for (const key of aKeys) {
199
+ if (!(key in b) || !comparableEqual(a[key].value, b[key].value)) {
200
+ return false
201
+ }
202
+ }
203
+ return true
204
+ }
205
+
206
+ export interface Complex {
207
+ real: number
208
+ imag: number
209
+ }
210
+
211
+ export function complex(real: number, imag: number): Complex {
212
+ return { real, imag }
213
+ }
214
+
215
+ export function real(value: number | Complex | null | undefined): number {
216
+ if (typeof value === 'number') {
217
+ return value
218
+ }
219
+ return value?.real ?? 0
220
+ }
221
+
222
+ export function imag(value: number | Complex | null | undefined): number {
223
+ if (typeof value === 'number') {
224
+ return 0
225
+ }
226
+ return value?.imag ?? 0
227
+ }
228
+
72
229
  // Bytes represents all valid []byte representations in TypeScript
73
230
  // This includes Uint8Array (the preferred representation) and $.Slice<number> (which includes null)
74
231
  export type Bytes = Uint8Array | Slice<number>
75
232
 
76
233
  // int converts a value to a Go int type, handling proper signed integer conversion
77
234
  // This ensures that values like 2147483648 (2^31) are properly handled according to Go semantics
78
- export function int(value: number): number {
235
+ export function int(value: number | bigint, bits = 0): number {
236
+ if (typeof value === 'bigint') {
237
+ if (bits > 0 && bits <= 64) {
238
+ return Number(BigInt.asIntN(bits, value))
239
+ }
240
+ return Number(value)
241
+ }
242
+ if (bits > 0 && bits < 64) {
243
+ const modulo = 2 ** bits
244
+ const sign = 2 ** (bits - 1)
245
+ let truncated = Math.trunc(value)
246
+ if (!Number.isFinite(truncated)) {
247
+ return truncated
248
+ }
249
+ truncated %= modulo
250
+ if (truncated < 0) {
251
+ truncated += modulo
252
+ }
253
+ if (truncated >= sign) {
254
+ truncated -= modulo
255
+ }
256
+ return truncated
257
+ }
79
258
  // In Go, int is typically 64-bit on 64-bit systems, but for compatibility with JavaScript
80
259
  // we need to handle the conversion properly. The issue is that JavaScript's number type
81
260
  // can represent values larger than 32-bit signed integers, but when cast in certain contexts
@@ -88,6 +267,86 @@ export function int(value: number): number {
88
267
  return Math.trunc(value)
89
268
  }
90
269
 
270
+ // uint converts a value to an unsigned Go integer width.
271
+ export function uint(value: number | bigint, bits = 64): number {
272
+ if (typeof value === 'bigint') {
273
+ const normalized = BigInt.asUintN(Math.min(bits, 64), value)
274
+ if (bits >= 64) {
275
+ return normalized as unknown as number
276
+ }
277
+ return Number(normalized)
278
+ }
279
+ const modulo = bits >= 64 ? 2 ** 64 : 2 ** bits
280
+ let truncated = Math.trunc(value)
281
+ if (!Number.isFinite(truncated)) {
282
+ return truncated
283
+ }
284
+ truncated %= modulo
285
+ if (truncated < 0) {
286
+ truncated += modulo
287
+ }
288
+ return truncated
289
+ }
290
+
291
+ export function uint64Shl(value: number | bigint, shift: number | bigint): number {
292
+ return uint64Result(uint64Value(value) << BigInt(Math.trunc(Number(shift))))
293
+ }
294
+
295
+ export function uint64Shr(value: number | bigint, shift: number | bigint): number {
296
+ return uint64Result(uint64Value(value) >> BigInt(Math.trunc(Number(shift))))
297
+ }
298
+
299
+ export function uintShr(
300
+ value: number | bigint,
301
+ shift: number | bigint,
302
+ bits = 32,
303
+ ): number {
304
+ const width = Math.min(bits, 32)
305
+ const amount = Math.trunc(Number(shift))
306
+ if (amount < 0) {
307
+ throw new Error('runtime error: negative shift amount')
308
+ }
309
+ if (amount >= width) {
310
+ return 0
311
+ }
312
+ return uint(value, width) >>> amount
313
+ }
314
+
315
+ export function uint64Mul(left: number | bigint, right: number | bigint): number {
316
+ return uint64Result(uint64Value(left) * uint64Value(right))
317
+ }
318
+
319
+ export function uint64Add(left: number | bigint, right: number | bigint): number {
320
+ return uint64Result(uint64Value(left) + uint64Value(right))
321
+ }
322
+
323
+ export function uint64Sub(left: number | bigint, right: number | bigint): number {
324
+ return uint64Result(uint64Value(left) - uint64Value(right))
325
+ }
326
+
327
+ export function uint64And(left: number | bigint, right: number | bigint): number {
328
+ return uint64Result(uint64Value(left) & uint64Value(right))
329
+ }
330
+
331
+ export function uint64Or(left: number | bigint, right: number | bigint): number {
332
+ return uint64Result(uint64Value(left) | uint64Value(right))
333
+ }
334
+
335
+ export function uint64Xor(left: number | bigint, right: number | bigint): number {
336
+ return uint64Result(uint64Value(left) ^ uint64Value(right))
337
+ }
338
+
339
+ function uint64Value(value: number | bigint): bigint {
340
+ if (typeof value === 'bigint') {
341
+ return BigInt.asUintN(64, value)
342
+ }
343
+ return BigInt.asUintN(64, BigInt(Math.trunc(value)))
344
+ }
345
+
346
+ function uint64Result(value: bigint): number {
347
+ return BigInt.asUintN(64, value) as unknown as number
348
+ }
349
+
91
350
  /**
92
351
  * Normalizes various byte representations into a `Uint8Array` for protobuf compatibility.
93
352
  *
@@ -221,17 +480,16 @@ export function bytesToArray(bytes: Bytes | null): number[] {
221
480
  return Array.from(bytes)
222
481
  }
223
482
 
224
- if (Array.isArray(bytes)) {
225
- return bytes
226
- }
227
-
228
- // Handle SliceProxy
229
483
  if (isSliceProxy(bytes)) {
230
484
  const proxy = bytes as SliceProxy<number>
231
485
  const meta = proxy.__meta__
232
486
  return meta.backing.slice(meta.offset, meta.offset + meta.length)
233
487
  }
234
488
 
489
+ if (Array.isArray(bytes)) {
490
+ return bytes
491
+ }
492
+
235
493
  throw new Error(`Cannot convert bytes of type ${typeof bytes} to array`)
236
494
  }
237
495
 
@@ -77,6 +77,11 @@ export interface Channel<T> {
77
77
  * Used for non-blocking select operations.
78
78
  */
79
79
  canSendNonBlocking(): boolean
80
+
81
+ /**
82
+ * Reports the number of buffered values currently queued in the channel.
83
+ */
84
+ len(): number
80
85
  }
81
86
 
82
87
  /**
@@ -530,6 +535,10 @@ class BufferedChannel<T> implements Channel<T> {
530
535
  this.receiversWithOk.length > 0
531
536
  )
532
537
  }
538
+
539
+ len(): number {
540
+ return this.buffer.length
541
+ }
533
542
  }
534
543
 
535
544
  /**
@@ -555,6 +564,7 @@ export interface ChannelRef<T> {
555
564
  canReceiveNonBlocking(): boolean
556
565
  selectSend(value: T, id: number): Promise<SelectResult<boolean>>
557
566
  selectReceive(id: number): Promise<SelectResult<T>>
567
+ len(): number
558
568
  }
559
569
 
560
570
  /**
@@ -597,6 +607,10 @@ export class BidirectionalChannelRef<T> implements ChannelRef<T> {
597
607
  selectReceive(id: number): Promise<SelectResult<T>> {
598
608
  return this.channel.selectReceive(id)
599
609
  }
610
+
611
+ len(): number {
612
+ return this.channel.len()
613
+ }
600
614
  }
601
615
 
602
616
  /**
@@ -641,6 +655,10 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
641
655
  selectReceive(_id: number): Promise<SelectResult<T>> {
642
656
  throw new Error('Cannot receive from send-only channel')
643
657
  }
658
+
659
+ len(): number {
660
+ return this.channel.len()
661
+ }
644
662
  }
645
663
 
646
664
  /**
@@ -685,6 +703,10 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
685
703
  selectSend(_value: T, _id: number): Promise<SelectResult<boolean>> {
686
704
  throw new Error('Cannot send to receive-only channel')
687
705
  }
706
+
707
+ len(): number {
708
+ return this.channel.len()
709
+ }
688
710
  }
689
711
 
690
712
  /**
@@ -1,6 +1,10 @@
1
1
  import { afterEach, describe, expect, it, vi } from 'vitest'
2
2
 
3
3
  import {
4
+ getHostRuntime,
5
+ HostRuntimeOwner,
6
+ type HostRuntime,
7
+ isMainScript,
4
8
  resetHostRuntimeForTests,
5
9
  writeHostStderrText,
6
10
  writeHostStdoutText,
@@ -10,6 +14,8 @@ const originalDeno = (globalThis as any).Deno
10
14
  const originalProcess = (globalThis as any).process
11
15
 
12
16
  afterEach(() => {
17
+ vi.restoreAllMocks()
18
+
13
19
  if (originalDeno === undefined) {
14
20
  delete (globalThis as any).Deno
15
21
  } else {
@@ -25,6 +31,40 @@ afterEach(() => {
25
31
  resetHostRuntimeForTests()
26
32
  })
27
33
 
34
+ function runtimeFixture(platform: string): HostRuntime {
35
+ return {
36
+ deno: null,
37
+ getEnv: () => '',
38
+ getStdioHandle: () => null,
39
+ nodeFS: null,
40
+ platform,
41
+ processObj: null,
42
+ readFD: () => null,
43
+ writeFD: () => 0,
44
+ writeStderrText: () => {},
45
+ writeStdoutText: () => {},
46
+ }
47
+ }
48
+
49
+ describe('hostio runtime owner', () => {
50
+ it('caches host capability detection until reset', () => {
51
+ let detects = 0
52
+ const owner = new HostRuntimeOwner(() => {
53
+ detects++
54
+ return runtimeFixture(`host-${detects}`)
55
+ })
56
+
57
+ expect(owner.current().platform).toBe('host-1')
58
+ expect(owner.current().platform).toBe('host-1')
59
+ expect(detects).toBe(1)
60
+
61
+ owner.reset()
62
+
63
+ expect(owner.current().platform).toBe('host-2')
64
+ expect(detects).toBe(2)
65
+ })
66
+ })
67
+
28
68
  describe('hostio text writes', () => {
29
69
  it('uses sync node fs writes for stdout and stderr', () => {
30
70
  const writes: Array<{ fd: number; bytes: number[] }> = []
@@ -66,4 +106,141 @@ describe('hostio text writes', () => {
66
106
  expect((globalThis as any).process.stdout.write).not.toHaveBeenCalled()
67
107
  expect((globalThis as any).process.stderr.write).not.toHaveBeenCalled()
68
108
  })
109
+
110
+ it('falls back to node fs when Deno is present without sync stdio', () => {
111
+ const writes: Array<{ fd: number; bytes: number[] }> = []
112
+ const writeSync = vi.fn(
113
+ (
114
+ fd: number,
115
+ buffer: Uint8Array,
116
+ _offset?: number,
117
+ length?: number,
118
+ _position?: number | null,
119
+ ) => {
120
+ writes.push({
121
+ bytes: Array.from(buffer.subarray(0, length ?? buffer.length)),
122
+ fd,
123
+ })
124
+ return length ?? buffer.length
125
+ },
126
+ )
127
+
128
+ ;(globalThis as any).Deno = {
129
+ stderr: {},
130
+ stdout: {},
131
+ }
132
+ ;(globalThis as any).process = {
133
+ getBuiltinModule: vi.fn(() => ({
134
+ readSync: vi.fn(),
135
+ writeSync,
136
+ })),
137
+ }
138
+ resetHostRuntimeForTests()
139
+
140
+ writeHostStdoutText('bun\n')
141
+ writeHostStderrText('err\n')
142
+
143
+ expect(writeSync).toHaveBeenCalledTimes(2)
144
+ expect(writes).toEqual([
145
+ { bytes: [98, 117, 110, 10], fd: 1 },
146
+ { bytes: [101, 114, 114, 10], fd: 2 },
147
+ ])
148
+ expect(getHostRuntime().platform).toBe('unknown')
149
+ })
150
+
151
+ it('prefers Deno sync stdio when it is available', () => {
152
+ const denoWrites: Array<{ bytes: number[]; stream: string }> = []
153
+ const nodeWriteSync = vi.fn()
154
+ const denoWriteSync = vi.fn((buffer: Uint8Array) => {
155
+ denoWrites.push({
156
+ bytes: Array.from(buffer),
157
+ stream: 'stdout',
158
+ })
159
+ return buffer.length
160
+ })
161
+
162
+ ;(globalThis as any).Deno = {
163
+ build: { os: 'darwin' },
164
+ stdout: { writeSync: denoWriteSync },
165
+ }
166
+ ;(globalThis as any).process = {
167
+ getBuiltinModule: vi.fn(() => ({
168
+ readSync: vi.fn(),
169
+ writeSync: nodeWriteSync,
170
+ })),
171
+ }
172
+ resetHostRuntimeForTests()
173
+
174
+ writeHostStdoutText('deno\n')
175
+
176
+ expect(denoWriteSync).toHaveBeenCalledTimes(1)
177
+ expect(nodeWriteSync).not.toHaveBeenCalled()
178
+ expect(denoWrites).toEqual([
179
+ { bytes: [100, 101, 110, 111, 10], stream: 'stdout' },
180
+ ])
181
+ expect(getHostRuntime().platform).toBe('darwin')
182
+ })
183
+
184
+ it('uses console fallback in browser-like hosts', () => {
185
+ const consoleLog = vi.spyOn(console, 'log').mockImplementation(() => {})
186
+
187
+ delete (globalThis as any).Deno
188
+ delete (globalThis as any).process
189
+ resetHostRuntimeForTests()
190
+
191
+ writeHostStdoutText('browser\n')
192
+
193
+ expect(getHostRuntime().platform).toBe('unknown')
194
+ expect(getHostRuntime().nodeFS).toBeNull()
195
+ expect(consoleLog).toHaveBeenCalledWith('browser')
196
+ })
197
+ })
198
+
199
+ describe('hostio isMainScript', () => {
200
+ it('returns true when the runtime marks the module as main', () => {
201
+ expect(
202
+ isMainScript({
203
+ main: true,
204
+ url: 'file:///tmp/example.gs.ts',
205
+ }),
206
+ ).toBe(true)
207
+ })
208
+
209
+ it('matches process argv[1] against the module url', () => {
210
+ delete (globalThis as any).Deno
211
+ ;(globalThis as any).process = {
212
+ argv: ['bun', './dist/app.gs.ts'],
213
+ cwd: vi.fn(() => '/tmp/project'),
214
+ getBuiltinModule: vi.fn(() => ({
215
+ readSync: vi.fn(),
216
+ writeSync: vi.fn(),
217
+ })),
218
+ }
219
+ resetHostRuntimeForTests()
220
+
221
+ expect(
222
+ isMainScript({
223
+ url: 'file:///tmp/project/dist/app.gs.ts',
224
+ }),
225
+ ).toBe(true)
226
+ })
227
+
228
+ it('returns false when the module was imported instead of executed', () => {
229
+ delete (globalThis as any).Deno
230
+ ;(globalThis as any).process = {
231
+ argv: ['bun', './runner.ts'],
232
+ cwd: vi.fn(() => '/tmp/project'),
233
+ getBuiltinModule: vi.fn(() => ({
234
+ readSync: vi.fn(),
235
+ writeSync: vi.fn(),
236
+ })),
237
+ }
238
+ resetHostRuntimeForTests()
239
+
240
+ expect(
241
+ isMainScript({
242
+ url: 'file:///tmp/project/dist/app.gs.ts',
243
+ }),
244
+ ).toBe(false)
245
+ })
69
246
  })