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
@@ -0,0 +1,193 @@
1
+ package main
2
+
3
+ import (
4
+ "context"
5
+ "io"
6
+ "strconv"
7
+ "strings"
8
+ "time"
9
+
10
+ "github.com/aperturerobotics/cli"
11
+ "github.com/aperturerobotics/goscript/compiler/gotest"
12
+ "github.com/pkg/errors"
13
+ )
14
+
15
+ func testCommands() []*cli.Command {
16
+ return []*cli.Command{newTestCommand()}
17
+ }
18
+
19
+ func newTestCommand() *cli.Command {
20
+ var tags cli.StringSlice
21
+ var run string
22
+ var count int
23
+ var short bool
24
+ var timeout time.Duration
25
+ var verbose bool
26
+ var outputRoot string
27
+ var workDir string
28
+ var dir string
29
+
30
+ return &cli.Command{
31
+ Name: "test",
32
+ Category: "test",
33
+ Usage: "compile and run Go package tests through GoScript",
34
+ Action: func(c *cli.Context) error {
35
+ req := &gotest.Request{
36
+ Dir: dir,
37
+ Patterns: c.Args().Slice(),
38
+ BuildTags: tags.Value(),
39
+ Run: run,
40
+ Count: count,
41
+ Short: short,
42
+ Timeout: timeout,
43
+ Verbose: verbose,
44
+ WorkDir: workDir,
45
+ OutputRoot: outputRoot,
46
+ }
47
+ result, err := gotest.NewRunner().Run(c.Context, req)
48
+ if err != nil {
49
+ return err
50
+ }
51
+ if err := printTestResult(c.Context, c.App.Writer, result); err != nil {
52
+ return err
53
+ }
54
+ if !result.Passed() {
55
+ return errors.New("goscript test failed")
56
+ }
57
+ return nil
58
+ },
59
+ Flags: []cli.Flag{
60
+ &cli.StringSliceFlag{
61
+ Name: "tags",
62
+ Usage: "comma-separated Go build tags",
63
+ Destination: &tags,
64
+ },
65
+ &cli.StringFlag{
66
+ Name: "run",
67
+ Usage: "run only tests matching the regexp",
68
+ Destination: &run,
69
+ },
70
+ &cli.IntFlag{
71
+ Name: "count",
72
+ Usage: "run each selected test this many times",
73
+ Destination: &count,
74
+ Value: 1,
75
+ },
76
+ &cli.BoolFlag{
77
+ Name: "short",
78
+ Usage: "report true from testing.Short",
79
+ Destination: &short,
80
+ },
81
+ &cli.DurationFlag{
82
+ Name: "timeout",
83
+ Usage: "maximum time for the package-test run",
84
+ Destination: &timeout,
85
+ Value: 30 * time.Second,
86
+ },
87
+ &cli.BoolFlag{
88
+ Name: "v",
89
+ Aliases: []string{"verbose"},
90
+ Usage: "emit verbose test output",
91
+ Destination: &verbose,
92
+ },
93
+ &cli.StringFlag{
94
+ Name: "output",
95
+ Usage: "generated TypeScript output root",
96
+ Destination: &outputRoot,
97
+ },
98
+ &cli.StringFlag{
99
+ Name: "workdir",
100
+ Usage: "generated test workspace directory",
101
+ Destination: &workDir,
102
+ },
103
+ &cli.StringFlag{
104
+ Name: "dir",
105
+ Usage: "Go module working directory",
106
+ Destination: &dir,
107
+ },
108
+ },
109
+ }
110
+ }
111
+
112
+ func printTestResult(ctx context.Context, w io.Writer, result *gotest.Result) error {
113
+ if err := ctx.Err(); err != nil {
114
+ return err
115
+ }
116
+ if result == nil {
117
+ return errors.New("goscript test result is nil")
118
+ }
119
+ for _, pkg := range result.Packages {
120
+ if strings.TrimSpace(pkg.Output) != "" {
121
+ if _, err := io.WriteString(w, strings.TrimSpace(pkg.Output)+"\n"); err != nil {
122
+ return err
123
+ }
124
+ }
125
+ switch pkg.Action {
126
+ case gotest.ActionPass:
127
+ if _, err := io.WriteString(w, "ok \t"+pkg.PackagePath+"\t"+formatElapsed(pkg.Elapsed)+"\n"); err != nil {
128
+ return err
129
+ }
130
+ case gotest.ActionSkip:
131
+ if _, err := io.WriteString(w, "? \t"+pkg.PackagePath+"\t[no test files]\n"); err != nil {
132
+ return err
133
+ }
134
+ case gotest.ActionFail:
135
+ line := "FAIL\t" + pkg.PackagePath
136
+ if pkg.Owner != "" {
137
+ line += "\towner=" + string(pkg.Owner)
138
+ }
139
+ if phase := failedPhase(pkg.Phases); phase != "" {
140
+ line += "\tphase=" + phase
141
+ }
142
+ if _, err := io.WriteString(w, line+"\n"); err != nil {
143
+ return err
144
+ }
145
+ if strings.TrimSpace(pkg.Error) != "" {
146
+ if _, err := io.WriteString(w, strings.TrimSpace(pkg.Error)+"\n"); err != nil {
147
+ return err
148
+ }
149
+ }
150
+ }
151
+ }
152
+ if result.WorkDir != "" {
153
+ if _, err := io.WriteString(w, "goscript test workdir: "+result.WorkDir+"\n"); err != nil {
154
+ return err
155
+ }
156
+ }
157
+ return nil
158
+ }
159
+
160
+ func failedPhase(phases gotest.PackagePhases) string {
161
+ switch {
162
+ case phases.Workspace == gotest.PhaseStatusFail:
163
+ return "workspace"
164
+ case phases.Compile == gotest.PhaseStatusFail:
165
+ return "compile"
166
+ case phases.Emit == gotest.PhaseStatusFail:
167
+ return "emit"
168
+ case phases.TypeCheck == gotest.PhaseStatusFail:
169
+ return "typecheck"
170
+ case phases.Runtime == gotest.PhaseStatusFail:
171
+ return "runtime"
172
+ default:
173
+ return ""
174
+ }
175
+ }
176
+
177
+ func formatElapsed(elapsed time.Duration) string {
178
+ if elapsed <= 0 {
179
+ return "0.000s"
180
+ }
181
+ millis := elapsed.Milliseconds()
182
+ seconds := millis / 1000
183
+ remainder := millis % 1000
184
+ return strconv.FormatInt(seconds, 10) + "." + leftPadMillis(remainder) + "s"
185
+ }
186
+
187
+ func leftPadMillis(value int64) string {
188
+ raw := strconv.FormatInt(value, 10)
189
+ for len(raw) < 3 {
190
+ raw = "0" + raw
191
+ }
192
+ return raw
193
+ }
@@ -0,0 +1,76 @@
1
+ package main
2
+
3
+ import (
4
+ "bytes"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ func TestTestCommandHelp(t *testing.T) {
11
+ var out bytes.Buffer
12
+ app := newApp()
13
+ app.Writer = &out
14
+
15
+ err := app.Run([]string{"goscript", "test", "--help"})
16
+ if err != nil {
17
+ t.Fatalf("test help failed: %v", err)
18
+ }
19
+ help := out.String()
20
+ for _, expected := range []string{"compile and run Go package tests through GoScript", "--tags", "--run", "--count", "--short", "--timeout"} {
21
+ if !strings.Contains(help, expected) {
22
+ t.Fatalf("help output missing %q:\n%s", expected, help)
23
+ }
24
+ }
25
+ }
26
+
27
+ func TestTestCommandRunsPackageTest(t *testing.T) {
28
+ dir := t.TempDir()
29
+ writeFile(t, filepath.Join(dir, "go.mod"), "module example.test/cmdtest\n\ngo 1.25.3\n")
30
+ writeFile(t, filepath.Join(dir, "value.go"), strings.Join([]string{
31
+ "package cmdtest",
32
+ "func Value() int { return 7 }",
33
+ "",
34
+ }, "\n"))
35
+ writeFile(t, filepath.Join(dir, "value_test.go"), strings.Join([]string{
36
+ "package cmdtest",
37
+ "import \"testing\"",
38
+ "func TestValue(t *testing.T) {",
39
+ "\tif Value() != 7 {",
40
+ "\t\tt.Fatal(\"bad value\")",
41
+ "\t}",
42
+ "}",
43
+ "",
44
+ }, "\n"))
45
+
46
+ var out bytes.Buffer
47
+ app := newApp()
48
+ app.Writer = &out
49
+ err := app.Run([]string{
50
+ "goscript",
51
+ "test",
52
+ "--dir",
53
+ dir,
54
+ "--workdir",
55
+ filepath.Join(dir, ".tmp", "cmd-test"),
56
+ "-v",
57
+ ".",
58
+ })
59
+ if err != nil {
60
+ t.Fatalf("test command failed: %v\n%s", err, out.String())
61
+ }
62
+ if !strings.Contains(out.String(), "ok \texample.test/cmdtest") {
63
+ t.Fatalf("expected ok package output, got:\n%s", out.String())
64
+ }
65
+ }
66
+
67
+ func TestTestCommandRejectsUnsupportedFlags(t *testing.T) {
68
+ app := newApp()
69
+ err := app.Run([]string{"goscript", "test", "--cover", "."})
70
+ if err == nil {
71
+ t.Fatalf("expected unsupported flag to fail")
72
+ }
73
+ if !strings.Contains(err.Error(), "flag provided but not defined") {
74
+ t.Fatalf("unexpected unsupported flag error: %v", err)
75
+ }
76
+ }
@@ -10,83 +10,84 @@ import (
10
10
  "github.com/sirupsen/logrus"
11
11
  )
12
12
 
13
- var (
14
- cliCompiler *compiler.Compiler
15
- cliCompilerConfig compiler.Config
16
- cliCompilerPkg cli.StringSlice
17
- cliCompilerBuildFlags cli.StringSlice
18
- )
13
+ func compileCommands() []*cli.Command {
14
+ return []*cli.Command{newCompileCommand()}
15
+ }
19
16
 
20
- // CompileCommands are commands related to compiling code.
21
- var CompileCommands = []*cli.Command{{
22
- Name: "compile",
23
- Category: "compile",
24
- Usage: "compile a Go package to TypeScript",
25
- Action: compilePackage,
26
- Before: func(c *cli.Context) (err error) {
27
- logger := logrus.New()
28
- logger.SetLevel(logrus.DebugLevel)
29
- le := logrus.NewEntry(logger)
30
- cliCompiler, err = compiler.NewCompiler(&cliCompilerConfig, le, nil)
31
- return
32
- },
33
- Flags: []cli.Flag{
34
- &cli.StringSliceFlag{
35
- Name: "package",
36
- Usage: "the package(s) to compile",
37
- Aliases: []string{"p", "packages"},
38
- EnvVars: []string{"GOSCRIPT_PACKAGES"},
39
- Destination: &cliCompilerPkg,
40
- },
41
- &cli.StringFlag{
42
- Name: "output",
43
- Usage: "the output typescript path to use",
44
- Destination: &cliCompilerConfig.OutputPath,
45
- Value: "./output",
46
- EnvVars: []string{"GOSCRIPT_OUTPUT"},
47
- },
48
- &cli.StringFlag{
49
- Name: "dir",
50
- Usage: "the working directory to use for the compiler (default: current directory)",
51
- Destination: &cliCompilerConfig.Dir,
52
- Value: "",
53
- EnvVars: []string{"GOSCRIPT_DIR"},
54
- },
55
- &cli.StringSliceFlag{
56
- Name: "build-flags",
57
- Aliases: []string{"b", "buildflags", "build-flag", "buildflag"},
58
- Usage: "Go build flags (tags) to use during analysis",
59
- Destination: &cliCompilerBuildFlags,
60
- EnvVars: []string{"GOSCRIPT_BUILD_FLAGS"},
61
- },
62
- &cli.BoolFlag{
63
- Name: "disable-emit-builtin",
64
- Usage: "disable emitting built-in packages that have handwritten equivalents",
65
- Destination: &cliCompilerConfig.DisableEmitBuiltin,
66
- Value: false,
67
- EnvVars: []string{"GOSCRIPT_DISABLE_EMIT_BUILTIN"},
17
+ func newCompileCommand() *cli.Command {
18
+ var config compiler.Config
19
+ var packages cli.StringSlice
20
+ var buildFlags cli.StringSlice
21
+
22
+ return &cli.Command{
23
+ Name: "compile",
24
+ Category: "compile",
25
+ Usage: "compile a Go package to TypeScript",
26
+ Action: func(c *cli.Context) error {
27
+ config.BuildFlags = slices.Clone(buildFlags.Value())
28
+ return compilePackage(c.Context, &config, packages.Value())
68
29
  },
69
- &cli.BoolFlag{
70
- Name: "all-dependencies",
71
- Usage: "compile all dependencies of the requested packages",
72
- Aliases: []string{"all-deps", "deps"},
73
- Destination: &cliCompilerConfig.AllDependencies,
74
- Value: false,
75
- EnvVars: []string{"GOSCRIPT_ALL_DEPENDENCIES"},
30
+ Flags: []cli.Flag{
31
+ &cli.StringSliceFlag{
32
+ Name: "package",
33
+ Usage: "the package(s) to compile",
34
+ Aliases: []string{"p", "packages"},
35
+ EnvVars: []string{"GOSCRIPT_PACKAGES"},
36
+ Destination: &packages,
37
+ },
38
+ &cli.StringFlag{
39
+ Name: "output",
40
+ Usage: "the output typescript path to use",
41
+ Destination: &config.OutputPath,
42
+ Value: "./output",
43
+ EnvVars: []string{"GOSCRIPT_OUTPUT"},
44
+ },
45
+ &cli.StringFlag{
46
+ Name: "dir",
47
+ Usage: "the working directory to use for the compiler (default: current directory)",
48
+ Destination: &config.Dir,
49
+ Value: "",
50
+ EnvVars: []string{"GOSCRIPT_DIR"},
51
+ },
52
+ &cli.StringSliceFlag{
53
+ Name: "build-flags",
54
+ Aliases: []string{"b", "buildflags", "build-flag", "buildflag"},
55
+ Usage: "Go build flags (tags) to use during analysis",
56
+ Destination: &buildFlags,
57
+ EnvVars: []string{"GOSCRIPT_BUILD_FLAGS"},
58
+ },
59
+ &cli.BoolFlag{
60
+ Name: "disable-emit-builtin",
61
+ Usage: "disable emitting built-in packages that have handwritten equivalents",
62
+ Destination: &config.DisableEmitBuiltin,
63
+ Value: false,
64
+ EnvVars: []string{"GOSCRIPT_DISABLE_EMIT_BUILTIN"},
65
+ },
66
+ &cli.BoolFlag{
67
+ Name: "all-dependencies",
68
+ Usage: "compile all dependencies of the requested packages",
69
+ Aliases: []string{"all-deps", "deps"},
70
+ Destination: &config.AllDependencies,
71
+ Value: false,
72
+ EnvVars: []string{"GOSCRIPT_ALL_DEPENDENCIES"},
73
+ },
76
74
  },
77
- },
78
- }}
75
+ }
76
+ }
79
77
 
80
78
  // compilePackage tries to compile the package.
81
- func compilePackage(c *cli.Context) error {
82
- pkgs := cliCompilerPkg.Value()
79
+ func compilePackage(ctx context.Context, config *compiler.Config, pkgs []string) error {
83
80
  if len(pkgs) == 0 {
84
81
  return errors.New("package(s) must be specified")
85
82
  }
86
83
 
87
- // build flags
88
- cliCompilerConfig.BuildFlags = slices.Clone(cliCompilerBuildFlags.Value())
89
-
90
- _, err := cliCompiler.CompilePackages(context.Background(), pkgs...)
84
+ logger := logrus.New()
85
+ logger.SetLevel(logrus.DebugLevel)
86
+ le := logrus.NewEntry(logger)
87
+ comp, err := compiler.NewCompiler(config, le, nil)
88
+ if err != nil {
89
+ return err
90
+ }
91
+ _, err = comp.CompilePackages(ctx, pkgs...)
91
92
  return err
92
93
  }
@@ -0,0 +1,79 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ func TestCompileCommandForwardsBuildFlags(t *testing.T) {
11
+ dir := t.TempDir()
12
+ outputDir := filepath.Join(dir, "output")
13
+ writeFile(t, filepath.Join(dir, "go.mod"), "module example.test/cli\n\ngo 1.25.3\n")
14
+ writeFile(t, filepath.Join(dir, "default.go"), strings.Join([]string{
15
+ "//go:build !customtag",
16
+ "",
17
+ "package main",
18
+ `const selected = "default"`,
19
+ "",
20
+ }, "\n"))
21
+ writeFile(t, filepath.Join(dir, "tagged.go"), strings.Join([]string{
22
+ "//go:build customtag",
23
+ "",
24
+ "package main",
25
+ `const selected = "custom"`,
26
+ "",
27
+ }, "\n"))
28
+ writeFile(t, filepath.Join(dir, "main.go"), strings.Join([]string{
29
+ "package main",
30
+ "func main() {",
31
+ " println(selected)",
32
+ "}",
33
+ "",
34
+ }, "\n"))
35
+
36
+ app := newApp()
37
+ err := app.Run([]string{
38
+ "goscript",
39
+ "compile",
40
+ "--package",
41
+ ".",
42
+ "--output",
43
+ outputDir,
44
+ "--dir",
45
+ dir,
46
+ "--build-flags",
47
+ "-tags=customtag",
48
+ })
49
+ if err != nil {
50
+ t.Fatalf("compile command failed: %v", err)
51
+ }
52
+
53
+ generatedPath := filepath.Join(outputDir, "@goscript", "example.test", "cli", "main.gs.ts")
54
+ generated, err := os.ReadFile(generatedPath)
55
+ if err != nil {
56
+ t.Fatalf("read generated file: %v", err)
57
+ }
58
+ if !strings.Contains(string(generated), `./tagged.gs.ts`) {
59
+ t.Fatalf("expected main output to import tagged source, got:\n%s", generated)
60
+ }
61
+ taggedPath := filepath.Join(outputDir, "@goscript", "example.test", "cli", "tagged.gs.ts")
62
+ tagged, err := os.ReadFile(taggedPath)
63
+ if err != nil {
64
+ t.Fatalf("read tagged generated file: %v", err)
65
+ }
66
+ if !strings.Contains(string(tagged), `"custom"`) {
67
+ t.Fatalf("expected tagged generated file to use tagged source, got:\n%s", tagged)
68
+ }
69
+ if strings.Contains(string(tagged), `"default"`) {
70
+ t.Fatalf("tagged generated file used source excluded by build tag:\n%s", tagged)
71
+ }
72
+ }
73
+
74
+ func writeFile(t *testing.T, path string, content string) {
75
+ t.Helper()
76
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
77
+ t.Fatalf("write %s: %v", path, err)
78
+ }
79
+ }
@@ -10,6 +10,14 @@ import (
10
10
  var version = "dev"
11
11
 
12
12
  func main() {
13
+ app := newApp()
14
+ if err := app.Run(os.Args); err != nil {
15
+ _, _ = os.Stderr.WriteString(err.Error() + "\n")
16
+ os.Exit(1)
17
+ }
18
+ }
19
+
20
+ func newApp() *cli.App {
13
21
  app := cli.NewApp()
14
22
  app.Version = version
15
23
 
@@ -18,10 +26,8 @@ func main() {
18
26
  }
19
27
 
20
28
  app.Usage = "GoScript compiles Go to Typescript."
21
- app.Commands = append(app.Commands, CompileCommands...)
29
+ app.Commands = append(app.Commands, compileCommands()...)
30
+ app.Commands = append(app.Commands, testCommands()...)
22
31
 
23
- if err := app.Run(os.Args); err != nil {
24
- _, _ = os.Stderr.WriteString(err.Error() + "\n")
25
- os.Exit(1)
26
- }
32
+ return app
27
33
  }
@@ -0,0 +1,38 @@
1
+ package compiler
2
+
3
+ import "slices"
4
+
5
+ import "strings"
6
+
7
+ const goScriptBuildTag = "goscript"
8
+
9
+ func goScriptBuildFlags(flags []string) []string {
10
+ normalized := append([]string(nil), flags...)
11
+ for i, flag := range normalized {
12
+ switch {
13
+ case flag == "-tags" && i+1 < len(normalized):
14
+ normalized[i+1] = appendBuildTag(normalized[i+1], goScriptBuildTag)
15
+ return normalized
16
+ case strings.HasPrefix(flag, "-tags="):
17
+ normalized[i] = "-tags=" + appendBuildTag(strings.TrimPrefix(flag, "-tags="), goScriptBuildTag)
18
+ return normalized
19
+ }
20
+ }
21
+ return append(normalized, "-tags="+goScriptBuildTag)
22
+ }
23
+
24
+ func appendBuildTag(value string, tag string) string {
25
+ tags := strings.FieldsFunc(value, func(r rune) bool {
26
+ return r == ',' || r == ' ' || r == '\t' || r == '\n'
27
+ })
28
+ if slices.Contains(tags, tag) {
29
+ return value
30
+ }
31
+ if strings.TrimSpace(value) == "" {
32
+ return tag
33
+ }
34
+ if strings.ContainsAny(value, " \t\n") {
35
+ return value + " " + tag
36
+ }
37
+ return value + "," + tag
38
+ }