goscript 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
package/README.md CHANGED
@@ -1,106 +1,154 @@
1
- # GoScript
2
-
3
- [![GoDoc Widget]][GoDoc] [![Go Report Card Widget]][Go Report Card] [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/aperturerobotics/goscript)
4
-
5
- [GoDoc]: https://godoc.org/github.com/aperturerobotics/goscript
6
- [GoDoc Widget]: https://godoc.org/github.com/aperturerobotics/goscript?status.svg
7
- [Go Report Card Widget]: https://goreportcard.com/badge/github.com/aperturerobotics/goscript
8
- [Go Report Card]: https://goreportcard.com/report/github.com/aperturerobotics/goscript
9
-
10
- ## What is GoScript?
11
-
12
- GoScript is an experimental **Go to TypeScript compiler** that translates Go code to TypeScript at the AST level. The goal is to enable sharing algorithms and business logic between Go backends and TypeScript frontends.
13
-
14
- > Right now goscript looks pretty cool if you problem is "I want this self-sufficient algorithm be available in Go and JS runtimes". gopherjs's ambition, however, has always been "any valid Go program can run in a browser". There is a lot that goes on in gopherjs that is necessary for supporting the standard library, which goes beyond cross-language translation.
1
+ <div align="center">
2
+ <h1>GoScript</h1>
3
+
4
+ <h3>Readable TypeScript output for Go packages</h3>
5
+
6
+ <p>
7
+ Compile Go packages into TypeScript modules for shared application logic.<br/>
8
+ Built for Bun, modern bundlers, browser demos, and package-level workflows.<br/>
9
+ </p>
10
+
11
+ <p>
12
+ <a href="https://godoc.org/github.com/aperturerobotics/goscript">
13
+ <img src="https://godoc.org/github.com/aperturerobotics/goscript?status.svg" alt="GoDoc" />
14
+ </a>
15
+ <a href="https://goreportcard.com/report/github.com/aperturerobotics/goscript">
16
+ <img src="https://goreportcard.com/badge/github.com/aperturerobotics/goscript" alt="Go Report Card" />
17
+ </a>
18
+ <a href="https://deepwiki.com/aperturerobotics/goscript">
19
+ <img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki" />
20
+ </a>
21
+ </p>
22
+ </div>
23
+
24
+ ## Overview
25
+
26
+ **GoScript** is an experimental Go-to-TypeScript compiler.
27
+
28
+ GoScript compiles Go packages from inside a Go module and writes deterministic
29
+ TypeScript packages under `@goscript/<go-package>/`. The compiler keeps package
30
+ loading, semantic modeling, lowering, TypeScript emission, runtime helpers, and
31
+ handwritten override packages as explicit pipeline stages so generated output is
32
+ readable and semantic decisions have one owner.
33
+
34
+ > "Right now goscript looks pretty cool if [your] problem is 'I want this
35
+ > self-sufficient algorithm [to] be available in Go and JS runtimes.'"
15
36
  >
16
- > &mdash; [nevkontakte](https://gophers.slack.com/archives/C039C0R2T/p1745870396945719), developer of [GopherJS](https://github.com/gopherjs/gopherjs)
17
-
18
- ### 🎯 Why GoScript?
19
-
20
- Write once, run everywhere. Share your Go algorithms, business logic, and data structures seamlessly between your backend and frontend without maintaining two codebases.
21
-
22
- **Use cases:**
23
-
24
- - Sharing business logic between Go services and web apps
25
- - Porting Go algorithms to run in browsers
26
- - Building TypeScript libraries from existing Go code
27
-
28
- Go has powerful concurrency support and an excellent standard library. GoScript brings these capabilities to TypeScript with as simple and readable of a translation as possible.
29
-
30
- **✅ What works:**
31
-
32
- - Structs, interfaces, methods, and functions with full value semantics
33
- - Channels and goroutines (translated to async/await with function coloring)
34
- - Pointers and addressability (via VarRef system)
35
- - Slices, maps, and built-in types
36
- - Control flow (if, for, switch, select, range, defer, etc.)
37
- - Type assertions and interface implementations
38
- - Closures and anonymous functions
39
- - Generics
40
- - Reflection
41
- - Encoding: encoding/json
42
- - Most of the standard library
43
-
44
- **🚧 In progress:**
45
-
46
- - Reflection edge cases
47
- - Full standard library coverage
48
- - Various other edge cases (see GitHub issues)
49
-
50
- **Important Notes**
51
-
52
- - Uses JavaScript `number` type (64-bit float, not Go's int types)
53
- - No pointer arithmetic (`uintptr`) or `unsafe` package
54
- - No complex numbers
55
-
56
- 📖 **Learn more:** [Design document](./design/DESIGN.md) | [Architecture explainer](./docs/explainer.md) | [Compliance tests](./tests/README.md)
57
-
58
- 🐛 **Found an issue?** Please [open an issue](https://github.com/aperturerobotics/goscript/issues).
59
-
60
- ## 🚀 Try It
61
-
62
- ### Prerequisites
63
-
64
- GoScript requires [Bun](https://bun.sh) to be installed for running compliance tests:
37
+ > - [nevkontakte](https://gophers.slack.com/archives/C039C0R2T/p1745870396945719),
38
+ > developer of [GopherJS](https://github.com/gopherjs/gopherjs)
39
+
40
+ That contrast is the project shape. GopherJS aims to make any valid Go program
41
+ run in a browser. GoScript starts from the narrower but common product need:
42
+ move self-contained Go logic into TypeScript projects without maintaining a
43
+ second implementation.
44
+
45
+ ### Why GoScript?
46
+
47
+ Use GoScript when you want to share Go algorithms, data structures, validation
48
+ logic, or selected runtime code with TypeScript and browser environments without
49
+ maintaining a second implementation by hand. The first supported target is a
50
+ useful, well-defined subset of Go that produces readable TypeScript and avoids
51
+ unsafe-heavy runtime behavior. The long-term goal is to expand that subset until
52
+ ordinary Go programs can run through GoScript, but that is not the first
53
+ compatibility bar.
54
+
55
+ Good fits today include:
56
+
57
+ - Sharing validation, formatting, parsing, and business rules between Go services and TypeScript applications
58
+ - Publishing TypeScript packages from Go data structures and algorithms
59
+ - Running selected Go runtime code in Bun, browser demos, and modern bundlers
60
+ - Building package-level test workflows that exercise generated TypeScript instead of handwritten ports
61
+
62
+ GoScript is not currently a drop-in browser runtime for every valid Go program.
63
+ The project prioritizes clear generated TypeScript, explicit runtime contracts,
64
+ and focused support for Go language features that can be modeled cleanly in
65
+ TypeScript.
66
+
67
+ Useful docs:
68
+
69
+ - [Architecture explainer](./docs/explainer.md)
70
+ - [Compiler design](./design/DESIGN.md)
71
+ - [Compliance tests](./tests/README.md)
72
+ - [Runtime packages](./gs/README.md)
73
+
74
+ ## Current Surface
75
+
76
+ ### Works Today
77
+
78
+ The package compiler currently supports:
79
+
80
+ - Go package loading through `go/packages` with `GOOS=js` and `GOARCH=wasm`
81
+ - Go build tags through CLI build flags, including `goscript`-selected code paths
82
+ - Structs, methods, interfaces, type assertions, typed nils, and value copying
83
+ - Pointers and address-taken variables through the `VarRef` runtime model
84
+ - Arrays, slices, maps, strings, named types, complex values, and selected builtins
85
+ - Generics through generated type-argument dictionaries for supported call,
86
+ method, and descriptor shapes
87
+ - Goroutines, channels, `select`, `defer`, async calls, async function values,
88
+ async callbacks, async interfaces, and async package tests
89
+ - Package initialization, cross-file imports, package indexes, dependency
90
+ output, and package-scoped test graph variants
91
+ - Handwritten `gs/` runtime and standard-library override packages for the
92
+ browser/WASM-oriented subset
93
+ - `goscript test`, which compiles selected Go package tests to TypeScript,
94
+ typechecks the generated workspace, runs it with Bun, and reports package
95
+ failures with owner classifications
96
+ - Browser/WASM compilation for import-free single-file demos
97
+
98
+ ### Intentional Limits
99
+
100
+ - CLI, Go API, and Node API inputs are package patterns, not direct `main.go` files.
101
+ - Browser source compilation is import-free only. Imported code should use the package workflow.
102
+ - `unsafe`, pointer arithmetic, cgo, and arbitrary Go runtime behavior are not
103
+ part of the first supported target.
104
+ - JavaScript `number` is used for numeric output, so it does not preserve every Go integer edge case.
105
+ - Standard-library coverage is practical and override-driven, not complete.
106
+ - Package-test execution intentionally supports a growing GoScript-compatible
107
+ subset of `testing`, not the complete `go test` flag surface.
108
+
109
+ ## Getting Started
110
+
111
+ Install Bun for TypeScript tests, examples, and website builds:
65
112
 
66
113
  ```bash
67
- # Install Bun
68
114
  curl -fsSL https://bun.sh/install | bash
69
115
  ```
70
116
 
71
- ### Installation
72
-
73
- **Option 1: Go Install**
117
+ Install the CLI:
74
118
 
75
119
  ```bash
76
120
  go install github.com/aperturerobotics/goscript/cmd/goscript@latest
77
121
  ```
78
122
 
79
- **Option 2: NPM** (if available)
123
+ Compile a Go package from a module directory:
80
124
 
81
125
  ```bash
82
- npm install -g goscript
126
+ goscript compile --package . --output ./output
83
127
  ```
84
128
 
85
- ### Compilation
129
+ The output tree looks like this:
86
130
 
87
- ```bash
88
- # Try compiling your Go package to TypeScript
89
- goscript compile --package . --output ./dist
131
+ ```text
132
+ output/
133
+ └── @goscript/
134
+ ├── builtin/
135
+ └── example.com/my/module/
136
+ ├── index.ts
137
+ └── main.gs.ts
90
138
  ```
91
139
 
92
- GoScript v2 compiles Go packages from inside a Go module. Direct single-file
93
- inputs such as `main.go` and browser/WASM source-string compilation are not
94
- supported yet; those paths return structured diagnostics before output is
95
- written.
96
-
97
- ## 📦 Using Generated Code in Your Project
140
+ For a generated `package main`, GoScript emits a main-script guard so the module
141
+ can run directly in Bun or a bundler that resolves `@goscript/*` imports. See
142
+ [example/simple](./example/simple) for the smallest compile-and-run workflow.
98
143
 
99
- After compiling your Go code to TypeScript, you'll need to set up your project appropriately.
144
+ ## TypeScript Projects
100
145
 
101
- ### TypeScript Configuration
146
+ Generated package indexes re-export generated files such as `./main.gs.ts`, and
147
+ some package-local imports also use explicit `.ts` specifiers. Your TypeScript
148
+ project needs to allow those imports and map `@goscript/*` to the generated
149
+ output root.
102
150
 
103
- Create or update your `tsconfig.json` with these settings:
151
+ Use this shape as the starting point:
104
152
 
105
153
  ```json
106
154
  {
@@ -108,11 +156,13 @@ Create or update your `tsconfig.json` with these settings:
108
156
  "target": "ES2022",
109
157
  "module": "ESNext",
110
158
  "moduleResolution": "bundler",
111
- "lib": ["ES2022", "esnext.disposable", "dom"],
112
- "baseUrl": "./",
159
+ "lib": ["ES2022", "esnext.disposable", "DOM"],
160
+ "baseUrl": ".",
113
161
  "paths": {
114
- "@goscript/*": ["./path/to/generated/output/@goscript/*"]
162
+ "@goscript/*": ["./output/@goscript/*"]
115
163
  },
164
+ "allowImportingTsExtensions": true,
165
+ "rewriteRelativeImportExtensions": true,
116
166
  "allowSyntheticDefaultImports": true,
117
167
  "esModuleInterop": true,
118
168
  "skipLibCheck": true,
@@ -121,237 +171,199 @@ Create or update your `tsconfig.json` with these settings:
121
171
  }
122
172
  ```
123
173
 
124
- **Important requirements:**
174
+ The important settings are:
125
175
 
126
- - **`target: "ES2022"` or newer** - Required for `Disposable` and other features
127
- - **`lib: ["esnext.disposable"]`** - Enables TypeScript's disposable types for resource management
128
- - **`baseUrl` and `paths`** - Allows TypeScript to resolve `@goscript/*` imports
129
- - **`moduleResolution: "bundler"`** - Recommended for modern bundlers
176
+ - `moduleResolution: "bundler"` so `@goscript/*` package imports resolve like a modern app build.
177
+ - `allowImportingTsExtensions: true` because generated indexes and same-package imports can reference `.ts` files directly.
178
+ - `rewriteRelativeImportExtensions: true` if TypeScript is emitting JavaScript instead of only typechecking.
179
+ - `paths` pointing at the generated `@goscript/` tree.
130
180
 
131
- You should be able to use any TypeScript bundler to compile the generated TypeScript.
181
+ If your bundler owns JavaScript emission and TypeScript only typechecks, adding
182
+ `"noEmit": true` is also a good fit.
132
183
 
133
- For a generated `package main`, GoScript emits a main-script guard so the
134
- generated module can be executed directly by a TypeScript runtime or bundler
135
- that resolves `@goscript/*` imports. The `example/simple` package shows the
136
- supported compile-and-run workflow.
137
-
138
- ## 🛠️ Integration & Usage
139
-
140
- ### Command Line
184
+ ## Command Line
141
185
 
142
186
  ```bash
143
- goscript compile --package ./my-go-code --output ./dist
187
+ goscript compile \
188
+ --package ./my-go-package \
189
+ --output ./output
144
190
  ```
145
191
 
146
- **Options:**
147
-
148
- - `--package <path>` - Go package pattern to compile
149
- - `--output <dir>` - Output directory for TypeScript files
150
- - `--dir <dir>` - Working directory for module/package loading
151
- - `--build-flags <flag>` - Go package loader build flag, repeatable
192
+ Common options:
152
193
 
153
- ### Programmatic API
194
+ - `--package <pattern>`: Go package pattern to compile. Repeat for multiple packages.
195
+ - `--output <dir>`: output directory for the generated TypeScript tree.
196
+ - `--dir <dir>`: working directory for module/package loading.
197
+ - `--build-flags <flag>`: Go build flag, repeatable.
198
+ - `--all-dependencies`: compile dependency packages instead of only requested packages.
199
+ - `--disable-emit-builtin`: skip copying handwritten `gs/` runtime packages.
154
200
 
155
- **Go:**
156
-
157
- ```go
158
- import "github.com/aperturerobotics/goscript/compiler"
201
+ Run Go package tests through GoScript:
159
202
 
160
- conf := &compiler.Config{OutputPath: "./dist"}
161
- comp, err := compiler.NewCompiler(conf, logger, nil)
162
- _, err = comp.CompilePackages(ctx, "your/package/path")
203
+ ```bash
204
+ goscript test --tags goscript ./...
163
205
  ```
164
206
 
165
- **Node.js:**
207
+ `goscript test` loads package test variants, compiles each selected package
208
+ through the normal GoScript pipeline, writes a TypeScript test runner, typechecks
209
+ the generated workspace, and runs it with Bun. Useful options:
166
210
 
167
- ```typescript
168
- import { compile } from 'goscript'
211
+ - `--tags <tags>`: comma-separated Go build tags.
212
+ - `--run <regexp>`: run only matching Go test names.
213
+ - `--count <n>`: run selected tests multiple times.
214
+ - `--timeout <duration>`: maximum package-test runtime.
215
+ - `--workdir <dir>`: generated test workspace directory.
216
+ - `--output <dir>`: generated TypeScript output root.
169
217
 
170
- await compile({
171
- pkg: './my-go-package',
172
- output: './dist',
173
- })
174
- ```
218
+ The output is shaped like `go test` where possible and adds an `owner=...`
219
+ classification for failures that occur before the generated tests run.
175
220
 
176
- ### Frontend Frameworks
221
+ ## APIs
177
222
 
178
- **React + GoScript:**
223
+ Go API:
179
224
 
180
- ```typescript
181
- import { NewCalculator } from '@goscript/myapp/calculator'
182
-
183
- function CalculatorApp() {
184
- const [calc] = useState(() => NewCalculator())
185
-
186
- const handleAdd = () => {
187
- const result = calc.Add(5, 3)
188
- setResult(result)
189
- }
225
+ ```go
226
+ package main
190
227
 
191
- return <button onClick={handleAdd}>Add 5 + 3</button>
228
+ import (
229
+ "context"
230
+
231
+ "github.com/aperturerobotics/goscript/compiler"
232
+ )
233
+
234
+ func main() {
235
+ comp, err := compiler.NewCompiler(&compiler.Config{
236
+ Dir: ".",
237
+ OutputPath: "./output",
238
+ }, nil, nil)
239
+ if err != nil {
240
+ panic(err)
241
+ }
242
+ if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
243
+ panic(err)
244
+ }
192
245
  }
193
246
  ```
194
247
 
195
- **Vue + GoScript:**
196
-
197
- ```vue
198
- <script setup lang="ts">
199
- import { NewUser, FindUserByEmail } from '@goscript/myapp/user'
248
+ Node/Bun API:
200
249
 
201
- const users = ref([NewUser(1, 'Alice', 'alice@example.com')])
250
+ ```ts
251
+ import { compile } from 'goscript'
202
252
 
203
- const searchUser = (email: string) => {
204
- return FindUserByEmail(users.value, email)
205
- }
206
- </script>
253
+ await compile({
254
+ pkg: '.',
255
+ output: './output',
256
+ dir: process.cwd(),
257
+ })
207
258
  ```
208
259
 
209
- ## 💡 See It In Action
210
-
211
- See the [example/app](./example/app) for a full todo list application using GoScript with tRPC, Drizzle ORM, and React, or [example/simple](./example/simple) for a comprehensive demo of language features.
212
-
213
- ### Example: User Management
214
-
215
- **Go Code** (`user.go`):
260
+ WASM adapter package:
216
261
 
217
262
  ```go
218
263
  package main
219
264
 
220
- type User struct {
221
- ID int `json:"id"`
222
- Name string `json:"name"`
223
- Email string `json:"email"`
224
- }
265
+ import "github.com/aperturerobotics/goscript/compiler/wasm"
225
266
 
226
- func (u *User) IsValid() bool {
227
- return u.Name != "" && u.Email != ""
228
- }
267
+ func main() {
268
+ ts, err := wasm.CompileSource(`
269
+ package main
229
270
 
230
- func NewUser(id int, name, email string) *User {
231
- return &User{ID: id, Name: name, Email: email}
271
+ func main() {
272
+ println("hello from GoScript")
232
273
  }
233
-
234
- func FindUserByEmail(users []*User, email string) *User {
235
- for _, user := range users {
236
- if user.Email == email {
237
- return user
238
- }
239
- }
240
- return nil
274
+ `, "main")
275
+ if err != nil {
276
+ panic(err)
277
+ }
278
+ _ = ts
241
279
  }
242
280
  ```
243
281
 
244
- **Compile it:**
282
+ The website compiles this package into the browser build. Browser source
283
+ compilation accepts import-free single-file demos. Package imports return a
284
+ structured diagnostic; compile imported code with the package workflow.
245
285
 
246
- ```bash
247
- goscript compile --package . --output ./dist
286
+ ## Architecture
287
+
288
+ GoScript v2 uses a linear compiler pipeline:
289
+
290
+ ```text
291
+ public adapter
292
+ -> compile request
293
+ -> package graph
294
+ -> semantic model
295
+ -> lowered program
296
+ -> TypeScript emitter
297
+ -> runtime/override package copy
248
298
  ```
249
299
 
250
- **Generated TypeScript** (`user.gs.ts`):
300
+ Each step owns one durable rule boundary:
251
301
 
252
- ```typescript
253
- export class User {
254
- public ID: number = 0
255
- public Name: string = ''
256
- public Email: string = ''
302
+ - `CompileRequestOwner` validates adapter input, module roots, output paths, and build flags.
303
+ - `PackageGraphOwner` loads Go packages and records dependency edges.
304
+ - `SemanticModelOwner` computes type, value, import, addressability, interface, and async facts.
305
+ - `LoweringOwner` turns Go syntax plus semantic facts into compiler-owned IR.
306
+ - `TypeScriptEmitOwner` renders deterministic, semicolon-free TypeScript from IR only.
307
+ - `RuntimeContractOwner` owns generated helper names and `@goscript/builtin` import policy.
308
+ - `OverrideRegistryOwner` discovers and copies handwritten runtime and standard-library packages.
257
309
 
258
- public IsValid(): boolean {
259
- const u = this
260
- return u.Name !== '' && u.Email !== ''
261
- }
310
+ This keeps semantic decisions out of the text emitter and makes generated output
311
+ changes easier to trace back to the owner that made the decision.
262
312
 
263
- constructor(init?: Partial<User>) {
264
- if (init) Object.assign(this, init)
265
- }
266
- }
313
+ ## Running from Source
267
314
 
268
- export function NewUser(id: number, name: string, email: string): User {
269
- return new User({ ID: id, Name: name, Email: email })
270
- }
315
+ Install dependencies:
271
316
 
272
- export function FindUserByEmail(users: User[], email: string): User | null {
273
- for (let user of users) {
274
- if (user.Email === email) {
275
- return user
276
- }
277
- }
278
- return null
279
- }
317
+ ```bash
318
+ bun install
280
319
  ```
281
320
 
282
- **Use in your frontend:**
321
+ Run the core checks:
283
322
 
284
- ```typescript
285
- import { NewUser, FindUserByEmail } from '@goscript/myapp/user'
323
+ ```bash
324
+ bun run test
325
+ bun run lint
326
+ bun run build
327
+ ```
286
328
 
287
- // Same logic, now in TypeScript!
288
- const users = [
289
- NewUser(1, 'Alice', 'alice@example.com'),
290
- NewUser(2, 'Bob', 'bob@example.com'),
291
- ]
329
+ Run the simple package example:
292
330
 
293
- const alice = FindUserByEmail(users, 'alice@example.com')
294
- console.log(alice?.IsValid()) // true
331
+ ```bash
332
+ bun run example
295
333
  ```
296
334
 
297
- ### Example: Async Processing with Channels
298
-
299
- **Go Code:**
335
+ Build the static website and browser demo assets:
300
336
 
301
- ```go
302
- func ProcessMessages(messages []string) chan string {
303
- results := make(chan string, len(messages))
304
-
305
- for _, msg := range messages {
306
- go func(m string) {
307
- // Simulate processing
308
- processed := "✓ " + m
309
- results <- processed
310
- }(msg)
311
- }
312
-
313
- return results
314
- }
337
+ ```bash
338
+ bun run website:build
315
339
  ```
316
340
 
317
- **Generated TypeScript:**
318
-
319
- ```typescript
320
- export function ProcessMessages(messages: string[]): $.Channel<string> {
321
- let results = $.makeChannel<string>(messages.length, '')
341
+ The website playground can compile and run import-free single-file demos in the
342
+ browser. Compliance examples and imported-package examples are precompiled by the
343
+ website build.
322
344
 
323
- for (let msg of messages) {
324
- queueMicrotask(async (m: string) => {
325
- let processed = '✓ ' + m
326
- await results.send(processed)
327
- })(msg)
328
- }
345
+ ## Examples
329
346
 
330
- return results
331
- }
332
- ```
347
+ - [example/simple](./example/simple): smallest package compile-and-run workflow.
348
+ - [example/app](./example/app): full-stack application example using generated TypeScript.
349
+ - [tests/tests](./tests/tests): inherited compliance fixtures and generated output snapshots.
333
350
 
334
- **Use with async/await:**
351
+ ## Contributing
335
352
 
336
- ```typescript
337
- import { ProcessMessages } from '@goscript/myapp/processor'
353
+ GoScript is experimental. Small compatibility shims are usually the wrong fix;
354
+ prefer adding focused compiler or compliance tests that name the missing semantic
355
+ owner, then implement the owner-level behavior.
338
356
 
339
- async function handleMessages() {
340
- const channel = ProcessMessages(['hello', 'world', 'goscript'])
357
+ Use the repo scripts rather than direct package-manager commands:
341
358
 
342
- // Receive processed messages
343
- for (let i = 0; i < 3; i++) {
344
- const result = await channel.receive()
345
- console.log(result) // "✓ hello", "✓ world", "✓ goscript"
346
- }
347
- }
359
+ ```bash
360
+ bun run test
361
+ bun run lint
362
+ bun run build
348
363
  ```
349
364
 
350
- ## 🤝 How You Can Help
351
-
352
- - Try GoScript on your code and [report issues](https://github.com/aperturerobotics/goscript/issues)
353
- - Check the [compliance tests](./tests/README.md) for current progress
354
- - Contribute test cases for edge cases you discover
365
+ Please open issues for unsupported Go shapes, runtime gaps, and standard-library
366
+ override gaps.
355
367
 
356
368
  ## License
357
369