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
@@ -1,4 +1,5 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
+ import { getHostRuntime, type NodeFSModule } from '@goscript/builtin/hostio.js'
2
3
 
3
4
  export const ErrBadPattern = $.newError('syntax error in pattern')
4
5
 
@@ -238,12 +239,186 @@ function matchCharClass(
238
239
  // The only possible returned error is ErrBadPattern, when pattern is malformed.
239
240
  export function Glob(pattern: string): [string[], $.GoError] {
240
241
  try {
241
- // Validate the pattern using the same logic as Match
242
242
  validatePattern(pattern)
243
- // We don't have filesystem access, so return empty array
244
- return [[], null]
243
+ return [globHost(pattern), null]
245
244
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
246
245
  } catch (err) {
247
246
  return [[], ErrBadPattern]
248
247
  }
249
248
  }
249
+
250
+ function hasMeta(path: string): boolean {
251
+ return /[*?[\\]/.test(path)
252
+ }
253
+
254
+ function splitPattern(pattern: string): { absolute: boolean; segments: string[] } {
255
+ const absolute = pattern.startsWith('/')
256
+ const segments = pattern.split('/').filter((segment, index) => {
257
+ if (index === 0 && segment === '') {
258
+ return false
259
+ }
260
+ return segment !== '' && segment !== '.'
261
+ })
262
+ return { absolute, segments }
263
+ }
264
+
265
+ function cleanMatch(path: string): string {
266
+ const absolute = path.startsWith('/')
267
+ const parts: string[] = []
268
+ for (const part of path.split('/')) {
269
+ if (part === '' || part === '.') {
270
+ continue
271
+ }
272
+ if (part === '..') {
273
+ if (parts.length > 0 && parts[parts.length - 1] !== '..') {
274
+ parts.pop()
275
+ } else if (!absolute) {
276
+ parts.push(part)
277
+ }
278
+ continue
279
+ }
280
+ parts.push(part)
281
+ }
282
+ const out = parts.join('/')
283
+ if (absolute) {
284
+ return '/' + out
285
+ }
286
+ return out === '' ? '.' : out
287
+ }
288
+
289
+ function joinPath(dir: string, name: string): string {
290
+ if (dir === '' || dir === '.') {
291
+ return name
292
+ }
293
+ if (dir === '/') {
294
+ return '/' + name
295
+ }
296
+ return dir.replace(/\/+$/, '') + '/' + name
297
+ }
298
+
299
+ type HostDirEntry = { name: string; isDir: boolean }
300
+
301
+ function readDir(path: string): HostDirEntry[] | null {
302
+ const runtime = getHostRuntime()
303
+ const denoObj = runtime.deno
304
+ if (denoObj?.readDirSync) {
305
+ try {
306
+ const entries: HostDirEntry[] = []
307
+ for (const entry of denoObj.readDirSync(path)) {
308
+ entries.push({ name: entry.name, isDir: !!entry.isDirectory })
309
+ }
310
+ entries.sort((a, b) => a.name.localeCompare(b.name))
311
+ return entries
312
+ } catch {
313
+ return null
314
+ }
315
+ }
316
+
317
+ const nodeFS = runtime.nodeFS
318
+ if (nodeFS?.readdirSync) {
319
+ try {
320
+ const entries = nodeFS
321
+ .readdirSync(path, { withFileTypes: true })
322
+ .map((entry: any) => ({
323
+ name: String(entry.name),
324
+ isDir:
325
+ typeof entry.isDirectory === 'function' ?
326
+ entry.isDirectory()
327
+ : false,
328
+ }))
329
+ entries.sort((a, b) => a.name.localeCompare(b.name))
330
+ return entries
331
+ } catch {
332
+ return null
333
+ }
334
+ }
335
+
336
+ return null
337
+ }
338
+
339
+ function exists(path: string): boolean {
340
+ const runtime = getHostRuntime()
341
+ if (runtime.deno?.statSync) {
342
+ try {
343
+ runtime.deno.statSync(path)
344
+ return true
345
+ } catch {
346
+ return false
347
+ }
348
+ }
349
+
350
+ const nodeFS = runtime.nodeFS
351
+ if (nodeFS?.statSync) {
352
+ try {
353
+ nodeFS.statSync(path)
354
+ return true
355
+ } catch {
356
+ return false
357
+ }
358
+ }
359
+
360
+ return false
361
+ }
362
+
363
+ function isDir(path: string, nodeFS?: NodeFSModule | null): boolean {
364
+ const runtime = getHostRuntime()
365
+ if (runtime.deno?.statSync) {
366
+ try {
367
+ return !!runtime.deno.statSync(path).isDirectory
368
+ } catch {
369
+ return false
370
+ }
371
+ }
372
+
373
+ const fs = nodeFS ?? runtime.nodeFS
374
+ if (fs?.statSync) {
375
+ try {
376
+ const stat = fs.statSync(path)
377
+ return typeof stat.isDirectory === 'function' ? stat.isDirectory() : false
378
+ } catch {
379
+ return false
380
+ }
381
+ }
382
+
383
+ return false
384
+ }
385
+
386
+ function globHost(pattern: string): string[] {
387
+ const { absolute, segments } = splitPattern(pattern)
388
+ if (!hasMeta(pattern)) {
389
+ return exists(pattern) ? [cleanMatch(pattern)] : []
390
+ }
391
+
392
+ let prefixes = [absolute ? '/' : '.']
393
+ for (const [index, segment] of segments.entries()) {
394
+ const next: string[] = []
395
+ const last = index === segments.length - 1
396
+ const segmentHasMeta = hasMeta(segment)
397
+ for (const prefix of prefixes) {
398
+ if (!segmentHasMeta) {
399
+ const candidate = joinPath(prefix, segment)
400
+ if (last || isDir(candidate)) {
401
+ next.push(candidate)
402
+ }
403
+ continue
404
+ }
405
+
406
+ const entries = readDir(prefix)
407
+ if (entries === null) {
408
+ continue
409
+ }
410
+ for (const entry of entries) {
411
+ const [matched, err] = Match(segment, entry.name)
412
+ if (err !== null || !matched) {
413
+ continue
414
+ }
415
+ if (last || entry.isDir) {
416
+ next.push(joinPath(prefix, entry.name))
417
+ }
418
+ }
419
+ }
420
+ prefixes = next
421
+ }
422
+
423
+ return prefixes.map(cleanMatch).sort()
424
+ }
@@ -1,4 +1,7 @@
1
1
  import { describe, it, expect } from 'vitest'
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { join } from 'node:path'
2
5
  import {
3
6
  Base,
4
7
  Dir,
@@ -16,6 +19,7 @@ import {
16
19
  Abs,
17
20
  Rel,
18
21
  EvalSymlinks,
22
+ Walk,
19
23
  Separator,
20
24
  ListSeparator,
21
25
  } from './path.js'
@@ -201,6 +205,27 @@ describe('path/filepath - Path manipulation functions', () => {
201
205
  })
202
206
  })
203
207
 
208
+ describe('Walk', () => {
209
+ it('should visit host filesystem paths in lexical order', () => {
210
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
211
+ try {
212
+ mkdirSync(join(root, 'a', 'b'), { recursive: true })
213
+ writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
214
+
215
+ const visited: string[] = []
216
+ const err = Walk(root, (path) => {
217
+ visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
218
+ return null
219
+ })
220
+
221
+ expect(err).toBeNull()
222
+ expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
223
+ } finally {
224
+ rmSync(root, { force: true, recursive: true })
225
+ }
226
+ })
227
+ })
228
+
204
229
  describe('Constants', () => {
205
230
  it('should have correct separator constants', () => {
206
231
  expect(Separator).toBe(47)
@@ -1,6 +1,21 @@
1
1
  // Package filepath implements utility routines for manipulating filename paths
2
2
  // in a way compatible with the target operating system-defined file paths.
3
3
  import * as $ from '@goscript/builtin/index.js'
4
+ import { getHostRuntime } from '@goscript/builtin/hostio.js'
5
+
6
+ type JoinElement = string | $.Slice<string>
7
+
8
+ function normalizeJoinElements(elem: JoinElement[]): string[] {
9
+ if (elem.length === 1 && typeof elem[0] !== 'string') {
10
+ const slice = elem[0]
11
+ const parts: string[] = []
12
+ for (let i = 0; i < $.len(slice); i++) {
13
+ parts.push(slice![i])
14
+ }
15
+ return parts
16
+ }
17
+ return elem as string[]
18
+ }
4
19
 
5
20
  // Path separator constants
6
21
  export const Separator = $.stringToRune('/')
@@ -123,15 +138,16 @@ export function Clean(path: string): string {
123
138
  // are ignored. The result is Cleaned. However, if the argument
124
139
  // list is empty or all its elements are empty, Join returns
125
140
  // an empty string.
126
- export function Join(...elem: string[]): string {
127
- if (elem.length === 0) {
141
+ export function Join(...elem: JoinElement[]): string {
142
+ const partsArg = normalizeJoinElements(elem)
143
+ if (partsArg.length === 0) {
128
144
  return ''
129
145
  }
130
146
 
131
147
  // Filter out empty elements but handle absolute paths
132
148
  const parts: string[] = []
133
149
 
134
- for (const e of elem) {
150
+ for (const e of partsArg) {
135
151
  if (e === '') {
136
152
  continue
137
153
  }
@@ -307,8 +323,7 @@ export function Glob(_pattern: string): [string[], $.GoError] {
307
323
  export type WalkFunc = (path: string, info: any, err: $.GoError) => $.GoError
308
324
 
309
325
  export function Walk(root: string, walkFn: WalkFunc): $.GoError {
310
- // No filesystem support, just call the function with the root
311
- return walkFn(root, null, $.newError('filesystem not supported'))
326
+ return walkHost(root, walkFn)
312
327
  }
313
328
 
314
329
  export function WalkDir(_root: string, _walkFn: any): $.GoError {
@@ -320,3 +335,142 @@ export function WalkDir(_root: string, _walkFn: any): $.GoError {
320
335
  export function Localize(path: string): [string, $.GoError] {
321
336
  return [path, null]
322
337
  }
338
+
339
+ type HostStat = {
340
+ isDirectory?: boolean | (() => boolean)
341
+ mode?: number
342
+ mtimeMs?: number
343
+ size?: number
344
+ }
345
+
346
+ type HostEntry = {
347
+ name: string
348
+ isDir: boolean
349
+ }
350
+
351
+ function hostError(err: unknown): $.GoError {
352
+ const message =
353
+ err instanceof Error ? err.message
354
+ : typeof err === 'string' ? err
355
+ : String(err)
356
+ return { Error: () => message }
357
+ }
358
+
359
+ function statIsDir(stat: HostStat): boolean {
360
+ if (typeof stat.isDirectory === 'function') {
361
+ return stat.isDirectory()
362
+ }
363
+ return !!stat.isDirectory
364
+ }
365
+
366
+ function fileInfo(path: string, stat: HostStat): any {
367
+ return {
368
+ IsDir: () => statIsDir(stat),
369
+ ModTime: () => null,
370
+ Mode: () => (stat.mode ?? 0) + (statIsDir(stat) ? 2147483648 : 0),
371
+ Name: () => Base(path),
372
+ Size: () => stat.size ?? 0,
373
+ Sys: () => stat,
374
+ }
375
+ }
376
+
377
+ function statPath(path: string): [HostStat | null, $.GoError] {
378
+ const runtime = getHostRuntime()
379
+ if (runtime.deno?.statSync) {
380
+ try {
381
+ return [runtime.deno.statSync(path), null]
382
+ } catch (err) {
383
+ return [null, hostError(err)]
384
+ }
385
+ }
386
+
387
+ const nodeFS = runtime.nodeFS
388
+ if (nodeFS?.statSync) {
389
+ try {
390
+ return [nodeFS.statSync(path), null]
391
+ } catch (err) {
392
+ return [null, hostError(err)]
393
+ }
394
+ }
395
+
396
+ return [null, $.newError('filesystem not supported')]
397
+ }
398
+
399
+ function readDir(path: string): [HostEntry[] | null, $.GoError] {
400
+ const runtime = getHostRuntime()
401
+ if (runtime.deno?.readDirSync) {
402
+ try {
403
+ const entries: HostEntry[] = []
404
+ for (const entry of runtime.deno.readDirSync(path)) {
405
+ entries.push({ name: entry.name, isDir: !!entry.isDirectory })
406
+ }
407
+ entries.sort((a, b) => a.name.localeCompare(b.name))
408
+ return [entries, null]
409
+ } catch (err) {
410
+ return [null, hostError(err)]
411
+ }
412
+ }
413
+
414
+ const nodeFS = runtime.nodeFS
415
+ if (nodeFS?.readdirSync) {
416
+ try {
417
+ const entries = nodeFS
418
+ .readdirSync(path, { withFileTypes: true })
419
+ .map((entry: any) => ({
420
+ name: String(entry.name),
421
+ isDir:
422
+ typeof entry.isDirectory === 'function' ?
423
+ entry.isDirectory()
424
+ : false,
425
+ }))
426
+ entries.sort((a, b) => a.name.localeCompare(b.name))
427
+ return [entries, null]
428
+ } catch (err) {
429
+ return [null, hostError(err)]
430
+ }
431
+ }
432
+
433
+ return [null, $.newError('filesystem not supported')]
434
+ }
435
+
436
+ function walkHost(path: string, walkFn: WalkFunc): $.GoError {
437
+ const [stat, statErr] = statPath(path)
438
+ if (statErr !== null) {
439
+ return walkFn(path, null, statErr)
440
+ }
441
+
442
+ const visitErr = walkFn(path, fileInfo(path, stat!), null)
443
+ if (visitErr === SkipAll) {
444
+ return null
445
+ }
446
+ if (visitErr !== null) {
447
+ if (visitErr === SkipDir && statIsDir(stat!)) {
448
+ return null
449
+ }
450
+ return visitErr
451
+ }
452
+ if (!statIsDir(stat!)) {
453
+ return null
454
+ }
455
+
456
+ const [entries, readErr] = readDir(path)
457
+ if (readErr !== null) {
458
+ return walkFn(path, fileInfo(path, stat!), readErr)
459
+ }
460
+ for (const entry of entries!) {
461
+ const err = walkHost(Join(path, entry.name), walkFn)
462
+ if (err === SkipDir) {
463
+ if (entry.isDir) {
464
+ continue
465
+ }
466
+ return err
467
+ }
468
+ if (err === SkipAll) {
469
+ return null
470
+ }
471
+ if (err !== null) {
472
+ return err
473
+ }
474
+ }
475
+ return null
476
+ }
package/gs/path/path.ts CHANGED
@@ -1,5 +1,19 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
2
 
3
+ type JoinElement = string | $.Slice<string>
4
+
5
+ function normalizeJoinElements(elem: JoinElement[]): string[] {
6
+ if (elem.length === 1 && typeof elem[0] !== 'string') {
7
+ const slice = elem[0]
8
+ const parts: string[] = []
9
+ for (let i = 0; i < $.len(slice); i++) {
10
+ parts.push(slice![i])
11
+ }
12
+ return parts
13
+ }
14
+ return elem as string[]
15
+ }
16
+
3
17
  class lazybuf {
4
18
  public get s(): string {
5
19
  return this._fields.s.value
@@ -245,10 +259,11 @@ export function Split(path: string): [string, string] {
245
259
  // The result is Cleaned. However, if the argument list is
246
260
  // empty or all its elements are empty, Join returns
247
261
  // an empty string.
248
- export function Join(...elem: string[]): string {
262
+ export function Join(...elem: JoinElement[]): string {
263
+ const parts = normalizeJoinElements(elem)
249
264
  let size = 0
250
- for (let _i = 0; _i < $.len(elem); _i++) {
251
- const e = elem![_i]
265
+ for (let _i = 0; _i < $.len(parts); _i++) {
266
+ const e = parts![_i]
252
267
  {
253
268
  size += $.len(e)
254
269
  }
@@ -257,8 +272,8 @@ export function Join(...elem: string[]): string {
257
272
  return ''
258
273
  }
259
274
  let buf: string[] = []
260
- for (let _i = 0; _i < $.len(elem); _i++) {
261
- const e = elem![_i]
275
+ for (let _i = 0; _i < $.len(parts); _i++) {
276
+ const e = parts![_i]
262
277
  {
263
278
  if ($.len(buf) > 0 || e != '') {
264
279
  if ($.len(buf) > 0) {
@@ -2,6 +2,7 @@
2
2
  export {
3
3
  TypeOf,
4
4
  TypeFor,
5
+ TypeAssert,
5
6
  ValueOf,
6
7
  Value,
7
8
  Kind_String,
@@ -47,7 +48,6 @@ export {
47
48
  } from './types.js'
48
49
  export type {
49
50
  uintptr,
50
- Pointer,
51
51
  Method,
52
52
  SelectDir,
53
53
  SliceHeader,
@@ -80,6 +80,7 @@ export {
80
80
  Interface,
81
81
  Map,
82
82
  Ptr,
83
+ Pointer,
83
84
  Slice,
84
85
  String,
85
86
  Struct,
@@ -1,5 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { MapIter } from './map.js'
3
+ import { ValueOf } from './type.js'
3
4
 
4
5
  describe('MapIter', () => {
5
6
  it('should iterate over map entries with proper typing', () => {
@@ -29,3 +30,21 @@ describe('MapIter', () => {
29
30
  expect(iter.Value().Interface()).toBe(100)
30
31
  })
31
32
  })
33
+
34
+ describe('Value.MapKeys', () => {
35
+ it('returns map keys as reflect values', () => {
36
+ const map = new Map<string, number>()
37
+ map.set('alpha', 1)
38
+ map.set('beta', 2)
39
+
40
+ const keys = ValueOf(map).MapKeys()
41
+
42
+ expect(keys?.map((key) => key.String()).sort()).toEqual(['alpha', 'beta'])
43
+ })
44
+
45
+ it('returns an empty slice for empty maps', () => {
46
+ const emptyMap = new Map<string, number>()
47
+
48
+ expect(ValueOf(emptyMap).MapKeys()).toEqual([])
49
+ })
50
+ })
package/gs/reflect/map.ts CHANGED
@@ -78,6 +78,10 @@ class MapType implements Type {
78
78
  return 0
79
79
  }
80
80
 
81
+ public Len(): number {
82
+ throw new Error('reflect: Len of non-array type map')
83
+ }
84
+
81
85
  public Bits(): number {
82
86
  throw new Error('reflect: Bits of non-sized type map')
83
87
  }