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
@@ -51,8 +51,11 @@ func (o *TypeScriptEmitOwner) Emit(
51
51
  }}
52
52
  }
53
53
 
54
+ files, diagnostics := o.EmitToMemory(ctx, program)
55
+ if diagnosticsHaveErrors(diagnostics) {
56
+ return nil, diagnostics
57
+ }
54
58
  var compiled []string
55
- var diagnostics []Diagnostic
56
59
  for _, pkg := range program.packages {
57
60
  if err := ctx.Err(); err != nil {
58
61
  diagnostics = append(diagnostics, Diagnostic{
@@ -68,12 +71,14 @@ func (o *TypeScriptEmitOwner) Emit(
68
71
  continue
69
72
  }
70
73
  for _, file := range pkg.files {
71
- path := filepath.Join(pkgDir, file.outputName)
72
- if err := os.WriteFile(path, []byte(o.renderLoweredFile(pkg, file)), 0o644); err != nil {
74
+ filePath := "@goscript/" + pkg.pkgPath + "/" + file.outputName
75
+ path := filepath.Join(req.OutputPath, filepath.FromSlash(filePath))
76
+ if err := os.WriteFile(path, []byte(files[filePath]), 0o644); err != nil {
73
77
  diagnostics = append(diagnostics, emitError("write TypeScript file", path, err))
74
78
  }
75
79
  }
76
- if err := os.WriteFile(filepath.Join(pkgDir, "index.ts"), []byte(renderIndex(pkg)), 0o644); err != nil {
80
+ indexPath := "@goscript/" + pkg.pkgPath + "/index.ts"
81
+ if err := os.WriteFile(filepath.Join(pkgDir, "index.ts"), []byte(files[indexPath]), 0o644); err != nil {
77
82
  diagnostics = append(diagnostics, emitError("write package index", pkg.pkgPath, err))
78
83
  continue
79
84
  }
@@ -82,6 +87,34 @@ func (o *TypeScriptEmitOwner) Emit(
82
87
  return compiled, diagnostics
83
88
  }
84
89
 
90
+ // EmitToMemory renders a lowered program into deterministic slash-path files.
91
+ func (o *TypeScriptEmitOwner) EmitToMemory(
92
+ ctx context.Context,
93
+ program *LoweredProgram,
94
+ ) (map[string]string, []Diagnostic) {
95
+ if err := ctx.Err(); err != nil {
96
+ return nil, []Diagnostic{contextCanceledDiagnostic(err)}
97
+ }
98
+ if program == nil {
99
+ return nil, []Diagnostic{{
100
+ Severity: DiagnosticSeverityError,
101
+ Code: "goscript/emitter:no-program",
102
+ Message: "TypeScript emission requires a lowered program",
103
+ }}
104
+ }
105
+ files := make(map[string]string)
106
+ for _, pkg := range program.packages {
107
+ if err := ctx.Err(); err != nil {
108
+ return files, []Diagnostic{contextCanceledDiagnostic(err)}
109
+ }
110
+ for _, file := range pkg.files {
111
+ files["@goscript/"+pkg.pkgPath+"/"+file.outputName] = o.renderLoweredFile(pkg, file)
112
+ }
113
+ files["@goscript/"+pkg.pkgPath+"/index.ts"] = renderIndex(pkg)
114
+ }
115
+ return files, nil
116
+ }
117
+
85
118
  func (o *TypeScriptEmitOwner) renderLoweredFile(pkg *loweredPackage, file *loweredFile) string {
86
119
  var b strings.Builder
87
120
  if file.sourcePath != "" {
@@ -99,37 +132,137 @@ func (o *TypeScriptEmitOwner) renderLoweredFile(pkg *loweredPackage, file *lower
99
132
  b.WriteString(imp.source)
100
133
  b.WriteString("\"\n")
101
134
  }
135
+ sideEffectImports := make(map[string]bool)
136
+ for _, imp := range file.imports {
137
+ if !imp.sideEffect || sideEffectImports[imp.source] {
138
+ continue
139
+ }
140
+ sideEffectImports[imp.source] = true
141
+ b.WriteString("import \"")
142
+ b.WriteString(imp.source)
143
+ b.WriteString("\"\n")
144
+ }
102
145
  if len(file.imports) != 0 {
103
146
  b.WriteString("\n")
104
147
  }
105
- for idx, decl := range file.decls {
106
- if idx != 0 {
148
+ hasMain := false
149
+ wroteDecl := false
150
+ writeSeparator := func() {
151
+ if wroteDecl {
107
152
  b.WriteString("\n")
108
153
  }
154
+ wroteDecl = true
155
+ }
156
+ writeDecl := func(decl loweredDecl) {
109
157
  if decl.structType != nil {
158
+ writeSeparator()
110
159
  renderStruct(&b, decl.structType, o.runtimeOwner)
111
- continue
160
+ return
112
161
  }
113
162
  if decl.function != nil {
163
+ writeSeparator()
114
164
  renderFunction(&b, decl.function)
115
- if pkg.name == "main" && decl.function.name == "main" {
116
- b.WriteString("\n\nif (")
117
- b.WriteString(o.runtimeOwner.QualifiedHelper(RuntimeHelperIsMainScript))
118
- b.WriteString("(import.meta)) {\n")
119
- b.WriteString("\tawait main()\n")
120
- b.WriteString("}\n")
165
+ if decl.function.name == "main" {
166
+ hasMain = true
121
167
  }
122
- continue
168
+ return
123
169
  }
170
+ writeSeparator()
124
171
  b.WriteString(decl.code)
125
172
  b.WriteString("\n")
126
173
  }
174
+ for _, decl := range file.decls {
175
+ if decl.typeIndexExport != "" && decl.code != "" {
176
+ writeDecl(decl)
177
+ }
178
+ }
179
+ for _, decl := range sortedStructDecls(file.decls) {
180
+ if decl.structType != nil {
181
+ writeDecl(decl)
182
+ }
183
+ }
184
+ for _, decl := range file.decls {
185
+ if decl.structType != nil || (decl.typeIndexExport != "" && decl.code != "") {
186
+ continue
187
+ }
188
+ writeDecl(decl)
189
+ }
190
+ if pkg.name == "main" && hasMain {
191
+ writeSeparator()
192
+ b.WriteString("if (")
193
+ b.WriteString(o.runtimeOwner.QualifiedHelper(RuntimeHelperIsMainScript))
194
+ b.WriteString("(import.meta)) {\n")
195
+ b.WriteString("\tawait main()\n")
196
+ b.WriteString("}\n")
197
+ }
127
198
  return b.String()
128
199
  }
129
200
 
201
+ func sortedStructDecls(decls []loweredDecl) []loweredDecl {
202
+ structs := make([]loweredDecl, 0)
203
+ names := make(map[string]bool)
204
+ for _, decl := range decls {
205
+ if decl.structType == nil {
206
+ continue
207
+ }
208
+ structs = append(structs, decl)
209
+ names[decl.structType.name] = true
210
+ }
211
+ if len(structs) < 2 {
212
+ return structs
213
+ }
214
+ byName := make(map[string]loweredDecl, len(structs))
215
+ for _, decl := range structs {
216
+ byName[decl.structType.name] = decl
217
+ }
218
+ visiting := make(map[string]bool, len(structs))
219
+ visited := make(map[string]bool, len(structs))
220
+ sorted := make([]loweredDecl, 0, len(structs))
221
+ var visit func(loweredDecl)
222
+ visit = func(decl loweredDecl) {
223
+ name := decl.structType.name
224
+ if visited[name] || visiting[name] {
225
+ return
226
+ }
227
+ visiting[name] = true
228
+ for _, dep := range structZeroValueDeps(decl.structType, names) {
229
+ if depDecl, ok := byName[dep]; ok {
230
+ visit(depDecl)
231
+ }
232
+ }
233
+ visiting[name] = false
234
+ visited[name] = true
235
+ sorted = append(sorted, decl)
236
+ }
237
+ for _, decl := range structs {
238
+ visit(decl)
239
+ }
240
+ return sorted
241
+ }
242
+
243
+ func structZeroValueDeps(structType *loweredStruct, names map[string]bool) []string {
244
+ var deps []string
245
+ for _, field := range structType.fields {
246
+ if !field.structValue {
247
+ continue
248
+ }
249
+ for name := range names {
250
+ if name == structType.name {
251
+ continue
252
+ }
253
+ if strings.Contains(field.zero, "new "+name+"(") {
254
+ deps = append(deps, name)
255
+ }
256
+ }
257
+ }
258
+ return deps
259
+ }
260
+
130
261
  func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *RuntimeContractOwner) {
131
262
  varRef := runtimeOwner.QualifiedHelper(RuntimeHelperVarRef)
132
263
  markStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperMarkAsStructValue)
264
+ cloneStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneStructValue)
265
+ cloneArrayValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneArrayValue)
133
266
  registerStructType := runtimeOwner.QualifiedHelper(RuntimeHelperRegisterStructType)
134
267
  if structType.exported {
135
268
  b.WriteString("export ")
@@ -184,9 +317,20 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
184
317
  b.WriteString(field.name)
185
318
  b.WriteString(" ? ")
186
319
  b.WriteString(markStructValue)
320
+ b.WriteString("(")
321
+ b.WriteString(cloneStructValue)
322
+ b.WriteString("(init.")
323
+ b.WriteString(field.name)
324
+ b.WriteString(")) : ")
325
+ b.WriteString(field.zero)
326
+ } else if field.arrayValue {
327
+ b.WriteString("init?.")
328
+ b.WriteString(field.name)
329
+ b.WriteString(" !== undefined ? ")
330
+ b.WriteString(cloneArrayValue)
187
331
  b.WriteString("(init.")
188
332
  b.WriteString(field.name)
189
- b.WriteString(".clone()) : ")
333
+ b.WriteString(") : ")
190
334
  b.WriteString(field.zero)
191
335
  } else {
192
336
  b.WriteString("init?.")
@@ -201,7 +345,9 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
201
345
  b.WriteString("\n")
202
346
  }
203
347
  b.WriteString("\t\t}\n\t}\n\n")
204
- b.WriteString("\tpublic clone(): ")
348
+ b.WriteString("\tpublic ")
349
+ b.WriteString(structType.cloneMethod)
350
+ b.WriteString("(): ")
205
351
  b.WriteString(structType.name)
206
352
  b.WriteString(" {\n\t\tconst cloned = new ")
207
353
  b.WriteString(structType.name)
@@ -214,9 +360,16 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
214
360
  b.WriteString("(")
215
361
  if field.structValue {
216
362
  b.WriteString(markStructValue)
363
+ b.WriteString("(")
364
+ b.WriteString(cloneStructValue)
365
+ b.WriteString("(this._fields.")
366
+ b.WriteString(field.name)
367
+ b.WriteString(".value))")
368
+ } else if field.arrayValue {
369
+ b.WriteString(cloneArrayValue)
217
370
  b.WriteString("(this._fields.")
218
371
  b.WriteString(field.name)
219
- b.WriteString(".value.clone())")
372
+ b.WriteString(".value)")
220
373
  } else {
221
374
  b.WriteString("this._fields.")
222
375
  b.WriteString(field.name)
@@ -240,15 +393,19 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
240
393
  b.WriteString("(\n")
241
394
  b.WriteString("\t\t")
242
395
  b.WriteString(strconvQuote(structType.typeName))
243
- b.WriteString(",\n\t\tnew ")
396
+ b.WriteString(",\n\t\t() => new ")
244
397
  b.WriteString(structType.name)
245
398
  b.WriteString("(),\n\t\t[")
246
399
  for idx, method := range structType.methods {
247
400
  if idx != 0 {
248
401
  b.WriteString(", ")
249
402
  }
403
+ methodName := method.name
404
+ if method.runtimeName != "" {
405
+ methodName = method.runtimeName
406
+ }
250
407
  b.WriteString("{ name: ")
251
- b.WriteString(strconvQuote(method.name))
408
+ b.WriteString(strconvQuote(methodName))
252
409
  b.WriteString(", args: [], returns: [] }")
253
410
  }
254
411
  b.WriteString("],\n\t\t")
@@ -260,7 +417,7 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
260
417
  }
261
418
  b.WriteString(strconvQuote(field.name))
262
419
  b.WriteString(": ")
263
- b.WriteString(runtimeStructFieldInfoExpr(field.runtimeType, field.tag))
420
+ b.WriteString(runtimeStructFieldInfoExpr(field.runtimeType, field.runtimeName, field.tag))
264
421
  }
265
422
  b.WriteString("}\n\t)\n")
266
423
  b.WriteString("}\n")
@@ -294,6 +451,7 @@ func renderFunction(b *strings.Builder, fn *loweredFunction) {
294
451
  }
295
452
  b.WriteString("function ")
296
453
  b.WriteString(fn.name)
454
+ renderFunctionTypeParams(b, fn)
297
455
  b.WriteString("(")
298
456
  for idx, param := range fn.params {
299
457
  if idx != 0 {
@@ -308,10 +466,22 @@ func renderFunction(b *strings.Builder, fn *loweredFunction) {
308
466
  b.WriteString(" {\n")
309
467
  if fn.receiverAlias != "" && fn.receiverAlias != "_" {
310
468
  writeIndent(b, 1)
311
- b.WriteString("const ")
469
+ if fn.receiverMutable {
470
+ b.WriteString("let ")
471
+ } else {
472
+ b.WriteString("const ")
473
+ }
312
474
  b.WriteString(fn.receiverAlias)
313
- b.WriteString(" = this\n")
475
+ if fn.receiverType != "" {
476
+ b.WriteString(": ")
477
+ b.WriteString(fn.receiverType)
478
+ }
479
+ b.WriteString(" = ")
480
+ b.WriteString(receiverValue(fn))
481
+ b.WriteString("\n")
314
482
  }
483
+ renderStmts(b, fn.paramBindings, 1)
484
+ renderNamedResults(b, fn.namedResults, 1)
315
485
  renderDeferStack(b, fn.deferState, 1)
316
486
  renderStmts(b, fn.body, 1)
317
487
  b.WriteString("}\n")
@@ -324,6 +494,7 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
324
494
  b.WriteString("async ")
325
495
  }
326
496
  b.WriteString(fn.name)
497
+ renderFunctionTypeParams(b, fn)
327
498
  b.WriteString("(")
328
499
  for idx, param := range fn.params {
329
500
  if idx != 0 {
@@ -338,16 +509,62 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
338
509
  b.WriteString(" {\n")
339
510
  if fn.receiverAlias != "" && fn.receiverAlias != "_" {
340
511
  writeIndent(b, 2)
341
- b.WriteString("const ")
512
+ if fn.receiverMutable {
513
+ b.WriteString("let ")
514
+ } else {
515
+ b.WriteString("const ")
516
+ }
342
517
  b.WriteString(fn.receiverAlias)
343
- b.WriteString(" = this\n")
518
+ if fn.receiverType != "" {
519
+ b.WriteString(": ")
520
+ b.WriteString(fn.receiverType)
521
+ }
522
+ b.WriteString(" = ")
523
+ b.WriteString(receiverValue(fn))
524
+ b.WriteString("\n")
344
525
  }
526
+ renderStmts(b, fn.paramBindings, 2)
527
+ renderNamedResults(b, fn.namedResults, 2)
345
528
  renderDeferStack(b, fn.deferState, 2)
346
529
  renderStmts(b, fn.body, 2)
347
530
  writeIndent(b, 1)
348
531
  b.WriteString("}\n")
349
532
  }
350
533
 
534
+ func renderFunctionTypeParams(b *strings.Builder, fn *loweredFunction) {
535
+ if len(fn.typeParams) == 0 {
536
+ return
537
+ }
538
+ b.WriteString("<")
539
+ for idx, typeParam := range fn.typeParams {
540
+ if idx != 0 {
541
+ b.WriteString(", ")
542
+ }
543
+ b.WriteString(typeParam)
544
+ }
545
+ b.WriteString(">")
546
+ }
547
+
548
+ func receiverValue(fn *loweredFunction) string {
549
+ if fn.receiverValue != "" {
550
+ return fn.receiverValue
551
+ }
552
+ return "this"
553
+ }
554
+
555
+ func renderNamedResults(b *strings.Builder, results []loweredNamedResult, indent int) {
556
+ for _, result := range results {
557
+ writeIndent(b, indent)
558
+ b.WriteString("let ")
559
+ b.WriteString(result.name)
560
+ b.WriteString(": ")
561
+ b.WriteString(result.typ)
562
+ b.WriteString(" = ")
563
+ b.WriteString(result.zero)
564
+ b.WriteString("\n")
565
+ }
566
+ }
567
+
351
568
  func renderDeferStack(b *strings.Builder, state *loweredDeferState, indent int) {
352
569
  if state == nil || !state.used {
353
570
  return
@@ -361,7 +578,7 @@ func renderDeferStack(b *strings.Builder, state *loweredDeferState, indent int)
361
578
  }
362
579
 
363
580
  func renderStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
364
- for _, stmt := range stmts {
581
+ for idx, stmt := range stmts {
365
582
  renderLeadingLines(b, stmt.leading, indent)
366
583
  if stmt.rangeFunc != nil {
367
584
  renderRangeFunc(b, stmt.rangeFunc, indent)
@@ -380,7 +597,7 @@ func renderStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
380
597
  continue
381
598
  }
382
599
  writeIndent(b, indent)
383
- if stmt.text == "" && len(stmt.children) != 0 {
600
+ if stmt.text == "" && (stmt.hasBlock || len(stmt.children) != 0) {
384
601
  b.WriteString("{\n")
385
602
  renderStmts(b, stmt.children, indent+1)
386
603
  writeIndent(b, indent)
@@ -388,7 +605,10 @@ func renderStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
388
605
  continue
389
606
  }
390
607
  writeIndentedText(b, stmt.text, indent)
391
- if len(stmt.children) == 0 {
608
+ if !stmt.hasBlock && len(stmt.children) == 0 {
609
+ if idx+1 < len(stmts) && needsASIBarrier(stmt, stmts[idx+1]) {
610
+ b.WriteString(";")
611
+ }
392
612
  b.WriteString("\n")
393
613
  continue
394
614
  }
@@ -407,6 +627,23 @@ func renderStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
407
627
  }
408
628
  }
409
629
 
630
+ func needsASIBarrier(current loweredStmt, next loweredStmt) bool {
631
+ if current.text == "" ||
632
+ current.hasBlock ||
633
+ len(current.children) != 0 ||
634
+ current.rangeFunc != nil ||
635
+ current.switchStmt != nil ||
636
+ current.selectStmt != nil ||
637
+ current.typeSwitch != nil {
638
+ return false
639
+ }
640
+ if strings.HasSuffix(strings.TrimSpace(current.text), ";") {
641
+ return false
642
+ }
643
+ nextText := strings.TrimLeft(next.text, " \t")
644
+ return strings.HasPrefix(nextText, "(") || strings.HasPrefix(nextText, "[")
645
+ }
646
+
410
647
  func renderLeadingLines(b *strings.Builder, lines []string, indent int) {
411
648
  for _, line := range lines {
412
649
  if strings.TrimSpace(line) == "" {
@@ -438,39 +675,66 @@ func renderSwitch(b *strings.Builder, stmt *loweredSwitch, indent int) {
438
675
  b.WriteString(stmt.value)
439
676
  b.WriteString(") {\n")
440
677
  for _, switchCase := range stmt.cases {
441
- for _, value := range switchCase.values {
678
+ if switchCase.defaultCase {
442
679
  writeIndent(b, indent+1)
443
- b.WriteString("case ")
444
- b.WriteString(value)
445
- b.WriteString(":\n")
680
+ b.WriteString("default:\n")
681
+ } else {
682
+ for _, value := range switchCase.values {
683
+ writeIndent(b, indent+1)
684
+ b.WriteString("case ")
685
+ b.WriteString(value)
686
+ b.WriteString(":\n")
687
+ }
446
688
  }
447
- renderSwitchBody(b, switchCase.body, indent+1)
448
- }
449
- if len(stmt.defaultBody) != 0 {
450
- writeIndent(b, indent+1)
451
- b.WriteString("default:\n")
452
- renderSwitchBody(b, stmt.defaultBody, indent+1)
689
+ renderSwitchBody(b, switchCase.body, switchCase.fallsThrough, indent+1)
453
690
  }
454
691
  writeIndent(b, indent)
455
692
  b.WriteString("}\n")
456
693
  }
457
694
 
458
- func renderSwitchBody(b *strings.Builder, body []loweredStmt, indent int) {
695
+ func renderSwitchBody(b *strings.Builder, body []loweredStmt, fallsThrough bool, indent int) {
459
696
  writeIndent(b, indent)
460
697
  b.WriteString("{\n")
461
698
  renderStmts(b, body, indent+1)
462
- writeIndent(b, indent+1)
463
- b.WriteString("break\n")
699
+ if !fallsThrough {
700
+ writeIndent(b, indent+1)
701
+ b.WriteString("break\n")
702
+ }
464
703
  writeIndent(b, indent)
465
704
  b.WriteString("}\n")
466
705
  }
467
706
 
468
707
  func renderRangeFunc(b *strings.Builder, stmt *loweredRangeFunc, indent int) {
708
+ if stmt.returnBranch != nil {
709
+ writeIndent(b, indent)
710
+ b.WriteString("let ")
711
+ b.WriteString(stmt.returnBranch.hasReturn)
712
+ b.WriteString(" = false\n")
713
+ if stmt.returnBranch.value != "" {
714
+ writeIndent(b, indent)
715
+ b.WriteString("let ")
716
+ b.WriteString(stmt.returnBranch.value)
717
+ b.WriteString(": ")
718
+ b.WriteString(stmt.returnBranch.resultType)
719
+ b.WriteString(" | undefined\n")
720
+ }
721
+ }
469
722
  writeIndent(b, indent)
470
- b.WriteString(";(() => {\n")
723
+ if stmt.async {
724
+ b.WriteString(";await (async () => {\n")
725
+ } else {
726
+ b.WriteString(";(() => {\n")
727
+ }
471
728
  writeIndent(b, indent+1)
729
+ if stmt.async {
730
+ b.WriteString("await ")
731
+ }
472
732
  b.WriteString(stmt.value)
473
- b.WriteString("!((")
733
+ b.WriteString("!(")
734
+ if stmt.async {
735
+ b.WriteString("async ")
736
+ }
737
+ b.WriteString("(")
474
738
  b.WriteString(strings.Join(stmt.params, ", "))
475
739
  b.WriteString(") => {\n")
476
740
  renderStmts(b, stmt.body, indent+2)
@@ -480,6 +744,66 @@ func renderRangeFunc(b *strings.Builder, stmt *loweredRangeFunc, indent int) {
480
744
  b.WriteString("})\n")
481
745
  writeIndent(b, indent)
482
746
  b.WriteString("})()\n")
747
+ if stmt.returnBranch == nil {
748
+ return
749
+ }
750
+ writeIndent(b, indent)
751
+ b.WriteString("if (")
752
+ b.WriteString(stmt.returnBranch.hasReturn)
753
+ b.WriteString(")")
754
+ if stmt.parentBranch != nil {
755
+ b.WriteString(" {\n")
756
+ writeIndent(b, indent+1)
757
+ b.WriteString(stmt.parentBranch.hasReturn)
758
+ b.WriteString(" = true\n")
759
+ if stmt.parentBranch.value != "" && stmt.returnBranch.value != "" {
760
+ writeIndent(b, indent+1)
761
+ b.WriteString(stmt.parentBranch.value)
762
+ b.WriteString(" = ")
763
+ b.WriteString(stmt.returnBranch.value)
764
+ b.WriteString("!\n")
765
+ }
766
+ writeIndent(b, indent+1)
767
+ b.WriteString("return false\n")
768
+ writeIndent(b, indent)
769
+ b.WriteString("}\n")
770
+ return
771
+ }
772
+ if stmt.returnBranch.value == "" {
773
+ b.WriteString(" {\n")
774
+ writeIndent(b, indent+1)
775
+ b.WriteString("return\n")
776
+ writeIndent(b, indent)
777
+ b.WriteString("}\n")
778
+ return
779
+ }
780
+ b.WriteString(" {\n")
781
+ writeIndent(b, indent+1)
782
+ b.WriteString("return ")
783
+ b.WriteString(stmt.returnBranch.value)
784
+ b.WriteString("!")
785
+ b.WriteString("\n")
786
+ writeIndent(b, indent)
787
+ b.WriteString("}\n")
788
+ }
789
+
790
+ func renderNamedStructConversion(expr *loweredNamedStructConversionExpr) string {
791
+ if expr == nil {
792
+ return "undefined"
793
+ }
794
+ if expr.castOnly {
795
+ return "(" + expr.value.text + " as unknown as " + expr.castTarget + ")"
796
+ }
797
+ fields := make([]string, 0, len(expr.fields))
798
+ for _, field := range expr.fields {
799
+ fields = append(fields, field.name+": "+expr.temp+"."+field.name)
800
+ }
801
+ body := "const " + expr.temp + " = " + expr.value.text + "; return " +
802
+ expr.helper + "(new " + expr.target + "({" + strings.Join(fields, ", ") + "}))"
803
+ if expr.value.async {
804
+ return "(await (async () => { " + body + " })())"
805
+ }
806
+ return "(() => { " + body + " })()"
483
807
  }
484
808
 
485
809
  func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
@@ -489,10 +813,14 @@ func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
489
813
  b.WriteString(", ")
490
814
  b.WriteString(stmt.value)
491
815
  b.WriteString("] = await $.selectStatement<any, ")
492
- b.WriteString(stmt.resultType)
816
+ if stmt.external {
817
+ b.WriteString("any")
818
+ } else {
819
+ b.WriteString(stmt.resultType)
820
+ }
493
821
  b.WriteString(">([\n")
494
822
  for idx, switchCase := range stmt.cases {
495
- renderSelectCase(b, switchCase, indent+1)
823
+ renderSelectCase(b, switchCase, stmt.external, stmt.result, indent+1)
496
824
  if idx != len(stmt.cases)-1 {
497
825
  b.WriteString(",")
498
826
  }
@@ -506,6 +834,10 @@ func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
506
834
  }
507
835
  b.WriteString(hasDefault)
508
836
  b.WriteString(")\n")
837
+ if stmt.external {
838
+ renderSelectExternalBodies(b, stmt, indent)
839
+ return
840
+ }
509
841
  writeIndent(b, indent)
510
842
  b.WriteString("if (")
511
843
  b.WriteString(stmt.hasReturn)
@@ -516,9 +848,46 @@ func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
516
848
  b.WriteString("\n")
517
849
  writeIndent(b, indent)
518
850
  b.WriteString("}\n")
851
+ if stmt.returns {
852
+ writeIndent(b, indent)
853
+ b.WriteString("throw new Error(\"unreachable select\")\n")
854
+ }
519
855
  }
520
856
 
521
- func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, indent int) {
857
+ func renderSelectExternalBodies(b *strings.Builder, stmt *loweredSelect, indent int) {
858
+ writeIndent(b, indent)
859
+ b.WriteString("switch (")
860
+ b.WriteString(stmt.value)
861
+ b.WriteString("?.id) {\n")
862
+ for _, switchCase := range stmt.cases {
863
+ writeIndent(b, indent+1)
864
+ b.WriteString("case ")
865
+ b.WriteString(strconv.Itoa(switchCase.id))
866
+ b.WriteString(":\n")
867
+ writeIndent(b, indent+2)
868
+ b.WriteString("{\n")
869
+ writeIndent(b, indent+3)
870
+ b.WriteString("const ")
871
+ b.WriteString(stmt.result)
872
+ b.WriteString(" = ")
873
+ b.WriteString(stmt.value)
874
+ b.WriteString("\n")
875
+ renderStmts(b, switchCase.prelude, indent+3)
876
+ renderStmts(b, switchCase.body, indent+3)
877
+ writeIndent(b, indent+3)
878
+ b.WriteString("break\n")
879
+ writeIndent(b, indent+2)
880
+ b.WriteString("}\n")
881
+ }
882
+ writeIndent(b, indent)
883
+ b.WriteString("}\n")
884
+ if stmt.returns {
885
+ writeIndent(b, indent)
886
+ b.WriteString("throw new Error(\"unreachable select\")\n")
887
+ }
888
+ }
889
+
890
+ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external bool, resultName string, indent int) {
522
891
  writeIndent(b, indent)
523
892
  b.WriteString("{\n")
524
893
  writeIndent(b, indent+1)
@@ -544,79 +913,197 @@ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, indent i
544
913
  b.WriteString(",\n")
545
914
  }
546
915
  writeIndent(b, indent+1)
547
- b.WriteString("onSelected: async (result) => {\n")
916
+ b.WriteString("onSelected: async (")
917
+ b.WriteString(resultName)
918
+ b.WriteString(") => {\n")
919
+ if external {
920
+ writeIndent(b, indent+2)
921
+ b.WriteString("return ")
922
+ b.WriteString(resultName)
923
+ b.WriteString("\n")
924
+ writeIndent(b, indent+1)
925
+ b.WriteString("}\n")
926
+ writeIndent(b, indent)
927
+ b.WriteString("}")
928
+ return
929
+ }
548
930
  renderStmts(b, switchCase.prelude, indent+2)
549
- renderStmts(b, switchCase.body, indent+2)
931
+ renderSelectCaseStmts(b, switchCase.body, indent+2)
550
932
  writeIndent(b, indent+1)
551
933
  b.WriteString("}\n")
552
934
  writeIndent(b, indent)
553
935
  b.WriteString("}")
554
936
  }
555
937
 
938
+ func renderSelectCaseStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
939
+ for idx, stmt := range stmts {
940
+ renderLeadingLines(b, stmt.leading, indent)
941
+ if stmt.rangeFunc != nil {
942
+ renderRangeFunc(b, stmt.rangeFunc, indent)
943
+ continue
944
+ }
945
+ if stmt.switchStmt != nil {
946
+ renderSwitch(b, stmt.switchStmt, indent)
947
+ continue
948
+ }
949
+ if stmt.selectStmt != nil {
950
+ renderSelect(b, stmt.selectStmt, indent)
951
+ continue
952
+ }
953
+ if stmt.typeSwitch != nil {
954
+ renderTypeSwitch(b, stmt.typeSwitch, indent)
955
+ continue
956
+ }
957
+ writeIndent(b, indent)
958
+ if stmt.text == "" && (stmt.hasBlock || len(stmt.children) != 0) {
959
+ b.WriteString("{\n")
960
+ renderSelectCaseStmts(b, stmt.children, indent+1)
961
+ writeIndent(b, indent)
962
+ b.WriteString("}\n")
963
+ continue
964
+ }
965
+ if strings.TrimSpace(stmt.text) == "return" {
966
+ b.WriteString("return $.selectVoidReturn()\n")
967
+ continue
968
+ }
969
+ writeIndentedText(b, stmt.text, indent)
970
+ if !stmt.hasBlock && len(stmt.children) == 0 {
971
+ if idx+1 < len(stmts) && needsASIBarrier(stmt, stmts[idx+1]) {
972
+ b.WriteString(";")
973
+ }
974
+ b.WriteString("\n")
975
+ continue
976
+ }
977
+ b.WriteString(" {\n")
978
+ renderSelectCaseStmts(b, stmt.children, indent+1)
979
+ writeIndent(b, indent)
980
+ b.WriteString("}")
981
+ if len(stmt.elseBody) == 0 {
982
+ b.WriteString("\n")
983
+ continue
984
+ }
985
+ b.WriteString(" else {\n")
986
+ renderSelectCaseStmts(b, stmt.elseBody, indent+1)
987
+ writeIndent(b, indent)
988
+ b.WriteString("}\n")
989
+ }
990
+ }
991
+
556
992
  func renderTypeSwitch(b *strings.Builder, stmt *loweredTypeSwitch, indent int) {
557
993
  writeIndent(b, indent)
558
- b.WriteString("$.typeSwitch(\n")
994
+ b.WriteString("{\n")
559
995
  writeIndent(b, indent+1)
996
+ b.WriteString("const __goscriptTypeSwitchValue = ")
560
997
  b.WriteString(stmt.value)
561
- b.WriteString(",\n")
998
+ b.WriteString("\n")
562
999
  writeIndent(b, indent+1)
563
- b.WriteString("[\n")
564
- for caseIdx, switchCase := range stmt.cases {
1000
+ b.WriteString("switch (true) {\n")
1001
+ for _, switchCase := range stmt.cases {
1002
+ renderTypeSwitchCase(b, stmt.varName, stmt.varRef, switchCase, indent+2)
1003
+ }
1004
+ if len(stmt.defaultBody) != 0 {
565
1005
  writeIndent(b, indent+2)
566
- b.WriteString("{\n")
1006
+ b.WriteString("default:\n")
1007
+ renderTypeSwitchInlineBody(b, stmt.varName, stmt.varRef || stmt.defaultRef, "any", "__goscriptTypeSwitchValue", stmt.defaultBody, indent+3)
567
1008
  writeIndent(b, indent+3)
568
- b.WriteString("types: [")
1009
+ b.WriteString("break\n")
1010
+ }
1011
+ writeIndent(b, indent+1)
1012
+ b.WriteString("}\n")
1013
+ writeIndent(b, indent)
1014
+ b.WriteString("}\n")
1015
+ }
1016
+
1017
+ func renderTypeSwitchCase(b *strings.Builder, varName string, varRef bool, switchCase loweredTypeSwitchCase, indent int) {
1018
+ if len(switchCase.types) == 0 {
1019
+ return
1020
+ }
1021
+ writeIndent(b, indent)
1022
+ b.WriteString("case ")
1023
+ if len(switchCase.types) == 1 {
1024
+ b.WriteString("$.typeAssert<")
1025
+ b.WriteString(typeSwitchAssertType(switchCase, 0))
1026
+ b.WriteString(">(__goscriptTypeSwitchValue, ")
1027
+ b.WriteString(switchCase.types[0])
1028
+ b.WriteString(").ok")
1029
+ } else {
569
1030
  for idx, typ := range switchCase.types {
570
1031
  if idx != 0 {
571
- b.WriteString(", ")
1032
+ b.WriteString(" || ")
572
1033
  }
1034
+ b.WriteString("$.is(__goscriptTypeSwitchValue, ")
573
1035
  b.WriteString(typ)
1036
+ b.WriteString(")")
574
1037
  }
575
- b.WriteString("],\n")
576
- writeIndent(b, indent+3)
577
- b.WriteString("body: ")
578
- renderTypeSwitchBody(b, stmt.varName, "", switchCase.body, indent+3)
579
- writeIndent(b, indent+2)
580
- b.WriteString("}")
581
- if caseIdx != len(stmt.cases)-1 {
582
- b.WriteString(",")
583
- }
584
- b.WriteString("\n")
585
1038
  }
1039
+ b.WriteString(":\n")
1040
+ value := "__goscriptTypeSwitchValue"
1041
+ if len(switchCase.types) == 1 {
1042
+ value = "$.typeAssert<" + typeSwitchAssertType(switchCase, 0) +
1043
+ ">(__goscriptTypeSwitchValue, " + switchCase.types[0] + ").value"
1044
+ }
1045
+ renderTypeSwitchInlineBody(b, varName, varRef || switchCase.varRef, typeSwitchCaseVariableType(switchCase), value, switchCase.body, indent+1)
586
1046
  writeIndent(b, indent+1)
587
- b.WriteString("]")
588
- if len(stmt.defaultBody) != 0 {
589
- b.WriteString(",\n")
590
- writeIndent(b, indent+1)
591
- renderTypeSwitchBody(b, stmt.varName, stmt.value, stmt.defaultBody, indent+1)
1047
+ b.WriteString("break\n")
1048
+ }
1049
+
1050
+ func typeSwitchAssertType(switchCase loweredTypeSwitchCase, idx int) string {
1051
+ if idx < len(switchCase.tsTypes) && switchCase.tsTypes[idx] != "" {
1052
+ return switchCase.tsTypes[idx]
592
1053
  }
593
- if len(stmt.defaultBody) == 0 {
594
- b.WriteString("\n")
1054
+ return "any"
1055
+ }
1056
+
1057
+ func typeSwitchCaseVariableType(switchCase loweredTypeSwitchCase) string {
1058
+ if len(switchCase.types) == 1 {
1059
+ return typeSwitchAssertType(switchCase, 0)
595
1060
  }
596
- writeIndent(b, indent)
597
- b.WriteString(")\n")
1061
+ return ""
598
1062
  }
599
1063
 
600
- func renderTypeSwitchBody(
1064
+ func renderTypeSwitchInlineBody(
601
1065
  b *strings.Builder,
602
1066
  varName string,
603
- defaultValue string,
1067
+ varRef bool,
1068
+ varType string,
1069
+ value string,
604
1070
  body []loweredStmt,
605
1071
  indent int,
606
1072
  ) {
607
- header := "() => {\n"
608
- if varName != "" && defaultValue == "" {
609
- header = "(" + varName + ") => {\n"
1073
+ if varName == "" {
1074
+ writeIndent(b, indent)
1075
+ b.WriteString("{\n")
1076
+ renderStmts(b, body, indent+1)
1077
+ writeIndent(b, indent)
1078
+ b.WriteString("}\n")
1079
+ return
610
1080
  }
611
- b.WriteString(header)
612
- if varName != "" && defaultValue != "" {
613
- writeIndent(b, indent+1)
614
- b.WriteString("let ")
615
- b.WriteString(varName)
616
- b.WriteString(" = ")
617
- b.WriteString(defaultValue)
618
- b.WriteString("\n")
1081
+ writeIndent(b, indent)
1082
+ b.WriteString("{\n")
1083
+ writeIndent(b, indent+1)
1084
+ b.WriteString("let ")
1085
+ b.WriteString(varName)
1086
+ if varRef {
1087
+ if varType == "" {
1088
+ varType = "any"
1089
+ }
1090
+ b.WriteString(": $.VarRef<")
1091
+ b.WriteString(varType)
1092
+ b.WriteString("> = $.varRef(")
1093
+ b.WriteString(value)
1094
+ b.WriteString(")\n")
1095
+ renderStmts(b, body, indent+1)
1096
+ writeIndent(b, indent)
1097
+ b.WriteString("}\n")
1098
+ return
619
1099
  }
1100
+ if varType != "" {
1101
+ b.WriteString(": ")
1102
+ b.WriteString(varType)
1103
+ }
1104
+ b.WriteString(" = ")
1105
+ b.WriteString(value)
1106
+ b.WriteString("\n")
620
1107
  renderStmts(b, body, indent+1)
621
1108
  writeIndent(b, indent)
622
1109
  b.WriteString("}\n")
@@ -625,6 +1112,9 @@ func renderTypeSwitchBody(
625
1112
  func renderIndex(pkg *loweredPackage) string {
626
1113
  var lines []string
627
1114
  for _, file := range pkg.files {
1115
+ if file.sideEffect {
1116
+ lines = append(lines, "import \"./"+file.outputName+"\"")
1117
+ }
628
1118
  exports := slices.Clone(file.exports)
629
1119
  slices.Sort(exports)
630
1120
  if len(exports) != 0 {