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,334 @@
1
+ package tsworkspace
2
+
3
+ import (
4
+ "bytes"
5
+ "context"
6
+ "os"
7
+ "os/exec"
8
+ "path/filepath"
9
+ "runtime"
10
+ "slices"
11
+ "strings"
12
+ "time"
13
+
14
+ jsoniter "github.com/aperturerobotics/json-iterator-lite"
15
+ "github.com/pkg/errors"
16
+ )
17
+
18
+ // Phase names a TypeScript workspace execution phase.
19
+ type Phase string
20
+
21
+ const (
22
+ // PhaseWorkspace covers workspace file preparation and tool discovery.
23
+ PhaseWorkspace Phase = "workspace"
24
+ // PhaseTypeCheck covers TypeScript type checking.
25
+ PhaseTypeCheck Phase = "typecheck"
26
+ // PhaseRuntime covers TypeScript runtime execution.
27
+ PhaseRuntime Phase = "runtime"
28
+
29
+ // NodeAmbientTypesFile names the GoScript runtime ambient declarations.
30
+ NodeAmbientTypesFile = "goscript-node.d.ts"
31
+ )
32
+
33
+ // Owner owns TypeScript test workspace files, tool discovery, and execution.
34
+ type Owner struct {
35
+ workDir string
36
+ toolDir string
37
+ }
38
+
39
+ // NewOwner creates a TypeScript workspace owner.
40
+ func NewOwner(workDir, toolDir string) *Owner {
41
+ return &Owner{
42
+ workDir: workDir,
43
+ toolDir: toolDir,
44
+ }
45
+ }
46
+
47
+ // WorkDir returns the workspace directory.
48
+ func (o *Owner) WorkDir() string {
49
+ if o == nil {
50
+ return ""
51
+ }
52
+ return o.workDir
53
+ }
54
+
55
+ // EnsurePackageJSON writes the module package metadata used by Bun.
56
+ func (o *Owner) EnsurePackageJSON() Result {
57
+ return o.WriteFile(PhaseWorkspace, "package.json", "{\"type\":\"module\"}\n")
58
+ }
59
+
60
+ // EnsureNodeAmbientTypes writes host runtime declarations needed by emitted tests.
61
+ func (o *Owner) EnsureNodeAmbientTypes() Result {
62
+ if NodeTypesPresent(o.workDir, o.toolDir) {
63
+ return o.WriteFile(PhaseWorkspace, NodeAmbientTypesFile, "")
64
+ }
65
+ return o.WriteFile(PhaseWorkspace, NodeAmbientTypesFile, nodeAmbientTypes)
66
+ }
67
+
68
+ // WriteFile writes a workspace-relative file.
69
+ func (o *Owner) WriteFile(phase Phase, name string, data string) Result {
70
+ if o == nil || o.workDir == "" {
71
+ return Result{Phase: phase, Error: "TypeScript workspace directory is empty"}
72
+ }
73
+ if err := os.MkdirAll(o.workDir, 0o755); err != nil {
74
+ return Result{Phase: phase, Error: errors.Wrap(err, "create TypeScript workspace").Error()}
75
+ }
76
+ path, err := o.workspacePath(name)
77
+ if err != nil {
78
+ return Result{Phase: phase, Error: err.Error()}
79
+ }
80
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
81
+ return Result{Phase: phase, Error: errors.Wrap(err, "create TypeScript workspace file parent").Error()}
82
+ }
83
+ if err := os.WriteFile(path, []byte(data), 0o644); err != nil {
84
+ return Result{Phase: phase, Error: errors.Wrap(err, "write TypeScript workspace file").Error()}
85
+ }
86
+ return Result{Phase: phase}
87
+ }
88
+
89
+ // WriteJSON writes an indented JSON workspace file.
90
+ func (o *Owner) WriteJSON(phase Phase, name string, value any) Result {
91
+ data, err := renderJSON(value)
92
+ if err != nil {
93
+ return Result{Phase: phase, Error: err.Error()}
94
+ }
95
+ return o.WriteFile(phase, name, data)
96
+ }
97
+
98
+ // RunTool finds and executes a TypeScript workspace tool.
99
+ func (o *Owner) RunTool(ctx context.Context, phase Phase, dir string, name string, args ...string) Result {
100
+ tool, err := o.FindTool(name)
101
+ if err != nil {
102
+ return Result{Phase: phase, Error: err.Error()}
103
+ }
104
+ if dir == "" {
105
+ dir = o.workDir
106
+ }
107
+ start := time.Now()
108
+ cmd := exec.CommandContext(ctx, tool, args...)
109
+ cmd.Dir = dir
110
+ var output bytes.Buffer
111
+ cmd.Stdout = &output
112
+ cmd.Stderr = &output
113
+ err = cmd.Run()
114
+ result := Result{
115
+ Phase: phase,
116
+ Command: append([]string{tool}, args...),
117
+ Output: output.String(),
118
+ Elapsed: time.Since(start),
119
+ }
120
+ if err != nil {
121
+ result.Error = err.Error()
122
+ }
123
+ return result
124
+ }
125
+
126
+ // FindTool locates a TypeScript workspace tool.
127
+ func (o *Owner) FindTool(name string) (string, error) {
128
+ if filepath.IsAbs(name) {
129
+ return name, nil
130
+ }
131
+ starts := []string{o.toolDir, o.workDir, sourceDirectory(), currentWorkingDirectory()}
132
+ for _, start := range starts {
133
+ if start == "" {
134
+ continue
135
+ }
136
+ for current := start; current != ""; current = filepath.Dir(current) {
137
+ candidate := filepath.Join(current, "node_modules", ".bin", name)
138
+ info, err := os.Stat(candidate)
139
+ if err == nil && !info.IsDir() {
140
+ return candidate, nil
141
+ }
142
+ if parent := filepath.Dir(current); parent == current {
143
+ break
144
+ }
145
+ }
146
+ }
147
+ if path, err := exec.LookPath(name); err == nil {
148
+ return path, nil
149
+ }
150
+ return "", errors.New(name + " not found in PATH or ancestor node_modules/.bin")
151
+ }
152
+
153
+ func (o *Owner) workspacePath(name string) (string, error) {
154
+ if filepath.IsAbs(name) {
155
+ return "", errors.Errorf("TypeScript workspace path must be relative: %s", name)
156
+ }
157
+ clean := filepath.Clean(name)
158
+ if clean == "." || clean == ".." || strings.HasPrefix(clean, ".."+string(filepath.Separator)) {
159
+ return "", errors.Errorf("TypeScript workspace path escapes workspace: %s", name)
160
+ }
161
+ return filepath.Join(o.workDir, clean), nil
162
+ }
163
+
164
+ // NodeTypeRoots returns existing @types roots visible from the provided dirs.
165
+ func NodeTypeRoots(dirs ...string) []string {
166
+ seen := make(map[string]bool)
167
+ var roots []string
168
+ for _, start := range append(dirs, currentWorkingDirectory()) {
169
+ if start == "" {
170
+ continue
171
+ }
172
+ for current := start; current != ""; current = filepath.Dir(current) {
173
+ candidate := filepath.Join(current, "node_modules", "@types")
174
+ info, err := os.Stat(candidate)
175
+ if err == nil && info.IsDir() && !seen[candidate] {
176
+ seen[candidate] = true
177
+ roots = append(roots, candidate)
178
+ break
179
+ }
180
+ if parent := filepath.Dir(current); parent == current {
181
+ break
182
+ }
183
+ }
184
+ }
185
+ slices.Sort(roots)
186
+ return roots
187
+ }
188
+
189
+ // NodeTypesPresent reports whether @types/node is visible from any provided directory.
190
+ func NodeTypesPresent(dirs ...string) bool {
191
+ seen := make(map[string]bool)
192
+ for _, start := range dirs {
193
+ if start == "" {
194
+ continue
195
+ }
196
+ for current := start; current != ""; current = filepath.Dir(current) {
197
+ if seen[current] {
198
+ if parent := filepath.Dir(current); parent == current {
199
+ break
200
+ }
201
+ continue
202
+ }
203
+ seen[current] = true
204
+ candidate := filepath.Join(current, "node_modules", "@types", "node")
205
+ info, err := os.Stat(candidate)
206
+ if err == nil && info.IsDir() {
207
+ return true
208
+ }
209
+ if parent := filepath.Dir(current); parent == current {
210
+ break
211
+ }
212
+ }
213
+ }
214
+ return false
215
+ }
216
+
217
+ func currentWorkingDirectory() string {
218
+ wd, err := os.Getwd()
219
+ if err != nil {
220
+ return ""
221
+ }
222
+ return wd
223
+ }
224
+
225
+ func sourceDirectory() string {
226
+ _, file, _, ok := runtime.Caller(0)
227
+ if !ok {
228
+ return ""
229
+ }
230
+ return filepath.Dir(file)
231
+ }
232
+
233
+ const nodeAmbientTypes = `declare const process: {
234
+ env?: Record<string, string | undefined>
235
+ exit?: (code?: number) => never
236
+ }
237
+
238
+ declare var gc: (() => void) | undefined
239
+
240
+ declare namespace NodeJS {
241
+ type Timeout = ReturnType<typeof setTimeout>
242
+ }
243
+
244
+ declare module 'node:fs' {
245
+ export function mkdirSync(...args: unknown[]): unknown
246
+ }
247
+
248
+ declare module 'node:os' {
249
+ export function tmpdir(): string
250
+ }
251
+
252
+ declare module 'node:path' {
253
+ export function join(...parts: string[]): string
254
+ }
255
+ `
256
+
257
+ func renderJSON(value any) (string, error) {
258
+ stream := jsoniter.NewStream(nil, 512, 2)
259
+ if err := writeJSONValue(stream, value); err != nil {
260
+ return "", errors.Wrap(err, "marshal TypeScript workspace JSON")
261
+ }
262
+ stream.WriteRaw("\n")
263
+ if stream.Error != nil {
264
+ return "", errors.Wrap(stream.Error, "marshal TypeScript workspace JSON")
265
+ }
266
+ return string(stream.Buffer()), nil
267
+ }
268
+
269
+ func writeJSONValue(stream *jsoniter.Stream, value any) error {
270
+ switch typed := value.(type) {
271
+ case nil:
272
+ stream.WriteNil()
273
+ case bool:
274
+ stream.WriteBool(typed)
275
+ case string:
276
+ stream.WriteString(typed)
277
+ case []string:
278
+ stream.WriteArrayStart()
279
+ for idx, item := range typed {
280
+ if idx != 0 {
281
+ stream.WriteMore()
282
+ }
283
+ stream.WriteString(item)
284
+ }
285
+ stream.WriteArrayEnd()
286
+ case []any:
287
+ stream.WriteArrayStart()
288
+ for idx, item := range typed {
289
+ if idx != 0 {
290
+ stream.WriteMore()
291
+ }
292
+ if err := writeJSONValue(stream, item); err != nil {
293
+ return err
294
+ }
295
+ }
296
+ stream.WriteArrayEnd()
297
+ case map[string]string:
298
+ return writeJSONObject(stream, typed, func(value string) error {
299
+ stream.WriteString(value)
300
+ return nil
301
+ })
302
+ case map[string][]string:
303
+ return writeJSONObject(stream, typed, func(value []string) error {
304
+ return writeJSONValue(stream, value)
305
+ })
306
+ case map[string]any:
307
+ return writeJSONObject(stream, typed, func(value any) error {
308
+ return writeJSONValue(stream, value)
309
+ })
310
+ default:
311
+ return errors.Errorf("unsupported TypeScript workspace JSON value %T", value)
312
+ }
313
+ return nil
314
+ }
315
+
316
+ func writeJSONObject[T any](stream *jsoniter.Stream, fields map[string]T, writeValue func(T) error) error {
317
+ stream.WriteObjectStart()
318
+ keys := make([]string, 0, len(fields))
319
+ for key := range fields {
320
+ keys = append(keys, key)
321
+ }
322
+ slices.Sort(keys)
323
+ for idx, key := range keys {
324
+ if idx != 0 {
325
+ stream.WriteMore()
326
+ }
327
+ stream.WriteObjectField(key)
328
+ if err := writeValue(fields[key]); err != nil {
329
+ return err
330
+ }
331
+ }
332
+ stream.WriteObjectEnd()
333
+ return nil
334
+ }
@@ -0,0 +1,93 @@
1
+ package tsworkspace
2
+
3
+ import (
4
+ "context"
5
+ "os"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ func TestOwnerWritesWorkspaceFiles(t *testing.T) {
12
+ dir := t.TempDir()
13
+ owner := NewOwner(dir, dir)
14
+
15
+ if result := owner.EnsurePackageJSON(); result.Failed() {
16
+ t.Fatalf("write package json: %s", result.Error)
17
+ }
18
+ if result := owner.WriteJSON(PhaseWorkspace, "tsconfig.json", map[string]any{
19
+ "compilerOptions": map[string]any{
20
+ "strict": true,
21
+ },
22
+ }); result.Failed() {
23
+ t.Fatalf("write tsconfig: %s", result.Error)
24
+ }
25
+
26
+ for _, name := range []string{"package.json", "tsconfig.json"} {
27
+ if _, err := os.Stat(filepath.Join(dir, name)); err != nil {
28
+ t.Fatalf("expected %s: %v", name, err)
29
+ }
30
+ }
31
+ }
32
+
33
+ func TestOwnerRejectsWorkspacePathEscapes(t *testing.T) {
34
+ dir := t.TempDir()
35
+ owner := NewOwner(dir, dir)
36
+
37
+ for _, name := range []string{"../escape.ts", filepath.Join("nested", "..", "..", "escape.ts"), filepath.Join(dir, "escape.ts")} {
38
+ if result := owner.WriteFile(PhaseWorkspace, name, "escape"); !result.Failed() {
39
+ t.Fatalf("expected %s to fail", name)
40
+ }
41
+ }
42
+ }
43
+
44
+ func TestOwnerRunsToolsWithCapturedOutput(t *testing.T) {
45
+ dir := t.TempDir()
46
+ owner := NewOwner(dir, dir)
47
+
48
+ result := owner.RunTool(context.Background(), PhaseRuntime, dir, "go", "env", "GOVERSION")
49
+ if result.Failed() {
50
+ t.Fatalf("run tool: %s\n%s", result.Error, result.Output)
51
+ }
52
+ if result.Output == "" {
53
+ t.Fatalf("expected captured output")
54
+ }
55
+ if len(result.Command) == 0 {
56
+ t.Fatalf("expected command capture")
57
+ }
58
+ }
59
+
60
+ func TestOwnerWritesNodeAmbientTypes(t *testing.T) {
61
+ dir := t.TempDir()
62
+ owner := NewOwner(dir, dir)
63
+
64
+ if result := owner.EnsureNodeAmbientTypes(); result.Failed() {
65
+ t.Fatalf("write node ambient types: %s", result.Error)
66
+ }
67
+ data, err := os.ReadFile(filepath.Join(dir, NodeAmbientTypesFile))
68
+ if err != nil {
69
+ t.Fatalf("read node ambient types: %v", err)
70
+ }
71
+ if !strings.Contains(string(data), "declare module 'node:fs'") {
72
+ t.Fatalf("node ambient types missing node:fs declaration: %s", data)
73
+ }
74
+ }
75
+
76
+ func TestOwnerSkipsNodeAmbientTypesWhenNodeTypesExist(t *testing.T) {
77
+ dir := t.TempDir()
78
+ if err := os.MkdirAll(filepath.Join(dir, "node_modules", "@types", "node"), 0o755); err != nil {
79
+ t.Fatal(err.Error())
80
+ }
81
+ owner := NewOwner(filepath.Join(dir, "work"), dir)
82
+
83
+ if result := owner.EnsureNodeAmbientTypes(); result.Failed() {
84
+ t.Fatalf("write node ambient types: %s", result.Error)
85
+ }
86
+ data, err := os.ReadFile(filepath.Join(dir, "work", NodeAmbientTypesFile))
87
+ if err != nil {
88
+ t.Fatalf("read node ambient types: %v", err)
89
+ }
90
+ if strings.TrimSpace(string(data)) != "" {
91
+ t.Fatalf("node ambient types should be empty when @types/node is already visible: %s", data)
92
+ }
93
+ }
@@ -0,0 +1,17 @@
1
+ package tsworkspace
2
+
3
+ import "time"
4
+
5
+ // Result describes one workspace file or process operation.
6
+ type Result struct {
7
+ Phase Phase
8
+ Command []string
9
+ Output string
10
+ Error string
11
+ Elapsed time.Duration
12
+ }
13
+
14
+ // Failed returns true when the operation failed.
15
+ func (r Result) Failed() bool {
16
+ return r.Error != ""
17
+ }