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
package/README.md CHANGED
@@ -1,101 +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
- ## 📦 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.
93
143
 
94
- After compiling your Go code to TypeScript, you'll need to set up your project appropriately.
144
+ ## TypeScript Projects
95
145
 
96
- ### 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.
97
150
 
98
- Create or update your `tsconfig.json` with these settings:
151
+ Use this shape as the starting point:
99
152
 
100
153
  ```json
101
154
  {
@@ -103,11 +156,13 @@ Create or update your `tsconfig.json` with these settings:
103
156
  "target": "ES2022",
104
157
  "module": "ESNext",
105
158
  "moduleResolution": "bundler",
106
- "lib": ["ES2022", "esnext.disposable", "dom"],
107
- "baseUrl": "./",
159
+ "lib": ["ES2022", "esnext.disposable", "DOM"],
160
+ "baseUrl": ".",
108
161
  "paths": {
109
- "@goscript/*": ["./path/to/generated/output/@goscript/*"]
162
+ "@goscript/*": ["./output/@goscript/*"]
110
163
  },
164
+ "allowImportingTsExtensions": true,
165
+ "rewriteRelativeImportExtensions": true,
111
166
  "allowSyntheticDefaultImports": true,
112
167
  "esModuleInterop": true,
113
168
  "skipLibCheck": true,
@@ -116,230 +171,199 @@ Create or update your `tsconfig.json` with these settings:
116
171
  }
117
172
  ```
118
173
 
119
- **Important requirements:**
120
-
121
- - **`target: "ES2022"` or newer** - Required for `Disposable` and other features
122
- - **`lib: ["esnext.disposable"]`** - Enables TypeScript's disposable types for resource management
123
- - **`baseUrl` and `paths`** - Allows TypeScript to resolve `@goscript/*` imports
124
- - **`moduleResolution: "bundler"`** - Recommended for modern bundlers
174
+ The important settings are:
125
175
 
126
- You should be able to use any TypeScript bundler to compile the generated TypeScript.
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.
127
180
 
128
- ## 🛠️ Integration & Usage
181
+ If your bundler owns JavaScript emission and TypeScript only typechecks, adding
182
+ `"noEmit": true` is also a good fit.
129
183
 
130
- ### Command Line
184
+ ## Command Line
131
185
 
132
186
  ```bash
133
- goscript compile --package ./my-go-code --output ./dist
187
+ goscript compile \
188
+ --package ./my-go-package \
189
+ --output ./output
134
190
  ```
135
191
 
136
- **Options:**
192
+ Common options:
137
193
 
138
- - `--package <path>` - Go package to compile (default: ".")
139
- - `--output <dir>` - Output directory for TypeScript files
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.
140
200
 
141
- ### Programmatic API
201
+ Run Go package tests through GoScript:
142
202
 
143
- **Go:**
144
-
145
- ```go
146
- import "github.com/aperturerobotics/goscript/compiler"
147
-
148
- conf := &compiler.Config{OutputPath: "./dist"}
149
- comp, err := compiler.NewCompiler(conf, logger, nil)
150
- _, err = comp.CompilePackages(ctx, "your/package/path")
203
+ ```bash
204
+ goscript test --tags goscript ./...
151
205
  ```
152
206
 
153
- **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:
154
210
 
155
- ```typescript
156
- import { compile } from 'goscript'
157
-
158
- await compile({
159
- pkg: './my-go-package',
160
- output: './dist',
161
- })
162
- ```
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.
163
217
 
164
- ### Frontend Frameworks
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.
165
220
 
166
- **React + GoScript:**
221
+ ## APIs
167
222
 
168
- ```typescript
169
- import { NewCalculator } from '@goscript/myapp/calculator'
223
+ Go API:
170
224
 
171
- function CalculatorApp() {
172
- const [calc] = useState(() => NewCalculator())
173
-
174
- const handleAdd = () => {
175
- const result = calc.Add(5, 3)
176
- setResult(result)
177
- }
225
+ ```go
226
+ package main
178
227
 
179
- 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
+ }
180
245
  }
181
246
  ```
182
247
 
183
- **Vue + GoScript:**
248
+ Node/Bun API:
184
249
 
185
- ```vue
186
- <script setup lang="ts">
187
- import { NewUser, FindUserByEmail } from '@goscript/myapp/user'
188
-
189
- const users = ref([NewUser(1, 'Alice', 'alice@example.com')])
250
+ ```ts
251
+ import { compile } from 'goscript'
190
252
 
191
- const searchUser = (email: string) => {
192
- return FindUserByEmail(users.value, email)
193
- }
194
- </script>
253
+ await compile({
254
+ pkg: '.',
255
+ output: './output',
256
+ dir: process.cwd(),
257
+ })
195
258
  ```
196
259
 
197
- ## 💡 See It In Action
198
-
199
- 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.
200
-
201
- ### Example: User Management
202
-
203
- **Go Code** (`user.go`):
260
+ WASM adapter package:
204
261
 
205
262
  ```go
206
263
  package main
207
264
 
208
- type User struct {
209
- ID int `json:"id"`
210
- Name string `json:"name"`
211
- Email string `json:"email"`
212
- }
265
+ import "github.com/aperturerobotics/goscript/compiler/wasm"
213
266
 
214
- func (u *User) IsValid() bool {
215
- return u.Name != "" && u.Email != ""
216
- }
267
+ func main() {
268
+ ts, err := wasm.CompileSource(`
269
+ package main
217
270
 
218
- func NewUser(id int, name, email string) *User {
219
- return &User{ID: id, Name: name, Email: email}
271
+ func main() {
272
+ println("hello from GoScript")
220
273
  }
221
-
222
- func FindUserByEmail(users []*User, email string) *User {
223
- for _, user := range users {
224
- if user.Email == email {
225
- return user
226
- }
227
- }
228
- return nil
274
+ `, "main")
275
+ if err != nil {
276
+ panic(err)
277
+ }
278
+ _ = ts
229
279
  }
230
280
  ```
231
281
 
232
- **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.
233
285
 
234
- ```bash
235
- 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
236
298
  ```
237
299
 
238
- **Generated TypeScript** (`user.gs.ts`):
300
+ Each step owns one durable rule boundary:
239
301
 
240
- ```typescript
241
- export class User {
242
- public ID: number = 0
243
- public Name: string = ''
244
- 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.
245
309
 
246
- public IsValid(): boolean {
247
- const u = this
248
- return u.Name !== '' && u.Email !== ''
249
- }
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.
250
312
 
251
- constructor(init?: Partial<User>) {
252
- if (init) Object.assign(this, init)
253
- }
254
- }
313
+ ## Running from Source
255
314
 
256
- export function NewUser(id: number, name: string, email: string): User {
257
- return new User({ ID: id, Name: name, Email: email })
258
- }
315
+ Install dependencies:
259
316
 
260
- export function FindUserByEmail(users: User[], email: string): User | null {
261
- for (let user of users) {
262
- if (user.Email === email) {
263
- return user
264
- }
265
- }
266
- return null
267
- }
317
+ ```bash
318
+ bun install
268
319
  ```
269
320
 
270
- **Use in your frontend:**
321
+ Run the core checks:
271
322
 
272
- ```typescript
273
- import { NewUser, FindUserByEmail } from '@goscript/myapp/user'
323
+ ```bash
324
+ bun run test
325
+ bun run lint
326
+ bun run build
327
+ ```
274
328
 
275
- // Same logic, now in TypeScript!
276
- const users = [
277
- NewUser(1, 'Alice', 'alice@example.com'),
278
- NewUser(2, 'Bob', 'bob@example.com'),
279
- ]
329
+ Run the simple package example:
280
330
 
281
- const alice = FindUserByEmail(users, 'alice@example.com')
282
- console.log(alice?.IsValid()) // true
331
+ ```bash
332
+ bun run example
283
333
  ```
284
334
 
285
- ### Example: Async Processing with Channels
286
-
287
- **Go Code:**
335
+ Build the static website and browser demo assets:
288
336
 
289
- ```go
290
- func ProcessMessages(messages []string) chan string {
291
- results := make(chan string, len(messages))
292
-
293
- for _, msg := range messages {
294
- go func(m string) {
295
- // Simulate processing
296
- processed := "✓ " + m
297
- results <- processed
298
- }(msg)
299
- }
300
-
301
- return results
302
- }
337
+ ```bash
338
+ bun run website:build
303
339
  ```
304
340
 
305
- **Generated TypeScript:**
306
-
307
- ```typescript
308
- export function ProcessMessages(messages: string[]): $.Channel<string> {
309
- 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.
310
344
 
311
- for (let msg of messages) {
312
- queueMicrotask(async (m: string) => {
313
- let processed = '✓ ' + m
314
- await results.send(processed)
315
- })(msg)
316
- }
345
+ ## Examples
317
346
 
318
- return results
319
- }
320
- ```
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.
321
350
 
322
- **Use with async/await:**
351
+ ## Contributing
323
352
 
324
- ```typescript
325
- 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.
326
356
 
327
- async function handleMessages() {
328
- const channel = ProcessMessages(['hello', 'world', 'goscript'])
357
+ Use the repo scripts rather than direct package-manager commands:
329
358
 
330
- // Receive processed messages
331
- for (let i = 0; i < 3; i++) {
332
- const result = await channel.receive()
333
- console.log(result) // "✓ hello", "✓ world", "✓ goscript"
334
- }
335
- }
359
+ ```bash
360
+ bun run test
361
+ bun run lint
362
+ bun run build
336
363
  ```
337
364
 
338
- ## 🤝 How You Can Help
339
-
340
- - Try GoScript on your code and [report issues](https://github.com/aperturerobotics/goscript/issues)
341
- - Check the [compliance tests](./tests/README.md) for current progress
342
- - Contribute test cases for edge cases you discover
365
+ Please open issues for unsupported Go shapes, runtime gaps, and standard-library
366
+ override gaps.
343
367
 
344
368
  ## License
345
369