goscript 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
@@ -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,9 @@ import {
16
19
  Abs,
17
20
  Rel,
18
21
  EvalSymlinks,
22
+ Walk,
23
+ WalkDir,
24
+ SkipDir,
19
25
  Separator,
20
26
  ListSeparator,
21
27
  } from './path.js'
@@ -201,6 +207,80 @@ describe('path/filepath - Path manipulation functions', () => {
201
207
  })
202
208
  })
203
209
 
210
+ describe('Walk', () => {
211
+ it('should visit host filesystem paths in lexical order', async () => {
212
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
213
+ try {
214
+ mkdirSync(join(root, 'a', 'b'), { recursive: true })
215
+ writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
216
+
217
+ const visited: string[] = []
218
+ const err = await Walk(root, (path) => {
219
+ visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
220
+ return null
221
+ })
222
+
223
+ expect(err).toBeNull()
224
+ expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
225
+ } finally {
226
+ rmSync(root, { force: true, recursive: true })
227
+ }
228
+ })
229
+ })
230
+
231
+ describe('WalkDir', () => {
232
+ it('should visit host filesystem dir entries in lexical order', async () => {
233
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walkdir-'))
234
+ try {
235
+ mkdirSync(join(root, 'b'), { recursive: true })
236
+ mkdirSync(join(root, 'a'), { recursive: true })
237
+ writeFileSync(join(root, 'a', 'skipped.txt'), 'skip')
238
+ writeFileSync(join(root, 'b', 'file.txt'), 'ok')
239
+
240
+ const visited: string[] = []
241
+ const err = await WalkDir(root, (path, d, walkErr) => {
242
+ expect(walkErr).toBeNull()
243
+ visited.push(
244
+ `${path.slice(root.length).replace(/^\/?/, '') || '.'}:${d.Name()}:${d.IsDir()}`,
245
+ )
246
+ if (d.Name() === 'a') {
247
+ return SkipDir
248
+ }
249
+ return null
250
+ })
251
+
252
+ expect(err).toBeNull()
253
+ expect(visited).toEqual([
254
+ `.:${root.split('/').pop()}:true`,
255
+ 'a:a:true',
256
+ 'b:b:true',
257
+ 'b/file.txt:file.txt:false',
258
+ ])
259
+ } finally {
260
+ rmSync(root, { force: true, recursive: true })
261
+ }
262
+ })
263
+
264
+ it('should await async host filesystem dir callbacks', async () => {
265
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walkdir-'))
266
+ try {
267
+ writeFileSync(join(root, 'file.txt'), 'ok')
268
+
269
+ const visited: string[] = []
270
+ const err = await WalkDir(root, async (path) => {
271
+ await Promise.resolve()
272
+ visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
273
+ return null
274
+ })
275
+
276
+ expect(err).toBeNull()
277
+ expect(visited).toEqual(['.', 'file.txt'])
278
+ } finally {
279
+ rmSync(root, { force: true, recursive: true })
280
+ }
281
+ })
282
+ })
283
+
204
284
  describe('Constants', () => {
205
285
  it('should have correct separator constants', () => {
206
286
  expect(Separator).toBe(47)
@@ -1,6 +1,23 @@
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
+ import type { DirEntry } from '@goscript/io/fs/fs.js'
6
+ import { FileInfoToDirEntry } from '@goscript/io/fs/readdir.js'
7
+
8
+ type JoinElement = string | $.Slice<string>
9
+
10
+ function normalizeJoinElements(elem: JoinElement[]): string[] {
11
+ if (elem.length === 1 && typeof elem[0] !== 'string') {
12
+ const slice = elem[0]
13
+ const parts: string[] = []
14
+ for (let i = 0; i < $.len(slice); i++) {
15
+ parts.push(slice![i])
16
+ }
17
+ return parts
18
+ }
19
+ return elem as string[]
20
+ }
4
21
 
5
22
  // Path separator constants
6
23
  export const Separator = $.stringToRune('/')
@@ -123,15 +140,16 @@ export function Clean(path: string): string {
123
140
  // are ignored. The result is Cleaned. However, if the argument
124
141
  // list is empty or all its elements are empty, Join returns
125
142
  // an empty string.
126
- export function Join(...elem: string[]): string {
127
- if (elem.length === 0) {
143
+ export function Join(...elem: JoinElement[]): string {
144
+ const partsArg = normalizeJoinElements(elem)
145
+ if (partsArg.length === 0) {
128
146
  return ''
129
147
  }
130
148
 
131
149
  // Filter out empty elements but handle absolute paths
132
150
  const parts: string[] = []
133
151
 
134
- for (const e of elem) {
152
+ for (const e of partsArg) {
135
153
  if (e === '') {
136
154
  continue
137
155
  }
@@ -304,19 +322,234 @@ export function Glob(_pattern: string): [string[], $.GoError] {
304
322
  // prefix; that is, if Walk is called with "dir" and finds a file "a"
305
323
  // in that directory, the walk function will be called with argument
306
324
  // "dir/a". The info argument is the fs.FileInfo for the named path.
307
- export type WalkFunc = (path: string, info: any, err: $.GoError) => $.GoError
308
-
309
- 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'))
325
+ export type WalkFunc = (
326
+ path: string,
327
+ info: any,
328
+ err: $.GoError,
329
+ ) => $.GoError | Promise<$.GoError>
330
+
331
+ export async function Walk(root: string, walkFn: WalkFunc): Promise<$.GoError> {
332
+ return await walkHost(root, walkFn)
312
333
  }
313
334
 
314
- export function WalkDir(_root: string, _walkFn: any): $.GoError {
315
- // No filesystem support
316
- return $.newError('filesystem not supported')
335
+ export type WalkDirFunc = (
336
+ path: string,
337
+ d: DirEntry,
338
+ err: $.GoError,
339
+ ) => $.GoError | Promise<$.GoError>
340
+
341
+ export async function WalkDir(
342
+ root: string,
343
+ walkFn: WalkDirFunc,
344
+ ): Promise<$.GoError> {
345
+ return await walkDirHost(root, walkFn)
317
346
  }
318
347
 
319
348
  // Localize is a stub - in Go it's used for Windows path localization
320
349
  export function Localize(path: string): [string, $.GoError] {
321
350
  return [path, null]
322
351
  }
352
+
353
+ type HostStat = {
354
+ isDirectory?: boolean | (() => boolean)
355
+ mode?: number
356
+ mtimeMs?: number
357
+ size?: number
358
+ }
359
+
360
+ type HostEntry = {
361
+ name: string
362
+ isDir: boolean
363
+ }
364
+
365
+ function hostError(err: unknown): $.GoError {
366
+ const message =
367
+ err instanceof Error ? err.message
368
+ : typeof err === 'string' ? err
369
+ : String(err)
370
+ return { Error: () => message }
371
+ }
372
+
373
+ function statIsDir(stat: HostStat): boolean {
374
+ if (typeof stat.isDirectory === 'function') {
375
+ return stat.isDirectory()
376
+ }
377
+ return !!stat.isDirectory
378
+ }
379
+
380
+ function fileInfo(path: string, stat: HostStat): any {
381
+ return {
382
+ IsDir: () => statIsDir(stat),
383
+ ModTime: () => null,
384
+ Mode: () => (stat.mode ?? 0) + (statIsDir(stat) ? 2147483648 : 0),
385
+ Name: () => Base(path),
386
+ Size: () => stat.size ?? 0,
387
+ Sys: () => stat,
388
+ }
389
+ }
390
+
391
+ function dirEntry(path: string, stat: HostStat): DirEntry {
392
+ return FileInfoToDirEntry(fileInfo(path, stat))
393
+ }
394
+
395
+ function statPath(path: string): [HostStat | null, $.GoError] {
396
+ const runtime = getHostRuntime()
397
+ if (runtime.deno?.statSync) {
398
+ try {
399
+ return [runtime.deno.statSync(path), null]
400
+ } catch (err) {
401
+ return [null, hostError(err)]
402
+ }
403
+ }
404
+
405
+ const nodeFS = runtime.nodeFS
406
+ if (nodeFS?.statSync) {
407
+ try {
408
+ return [nodeFS.statSync(path), null]
409
+ } catch (err) {
410
+ return [null, hostError(err)]
411
+ }
412
+ }
413
+
414
+ return [null, $.newError('filesystem not supported')]
415
+ }
416
+
417
+ function readDir(path: string): [HostEntry[] | null, $.GoError] {
418
+ const runtime = getHostRuntime()
419
+ if (runtime.deno?.readDirSync) {
420
+ try {
421
+ const entries: HostEntry[] = []
422
+ for (const entry of runtime.deno.readDirSync(path)) {
423
+ entries.push({ name: entry.name, isDir: !!entry.isDirectory })
424
+ }
425
+ entries.sort((a, b) => a.name.localeCompare(b.name))
426
+ return [entries, null]
427
+ } catch (err) {
428
+ return [null, hostError(err)]
429
+ }
430
+ }
431
+
432
+ const nodeFS = runtime.nodeFS
433
+ if (nodeFS?.readdirSync) {
434
+ try {
435
+ const entries = nodeFS
436
+ .readdirSync(path, { withFileTypes: true })
437
+ .map((entry: any) => ({
438
+ name: String(entry.name),
439
+ isDir:
440
+ typeof entry.isDirectory === 'function' ?
441
+ entry.isDirectory()
442
+ : false,
443
+ }))
444
+ entries.sort((a, b) => a.name.localeCompare(b.name))
445
+ return [entries, null]
446
+ } catch (err) {
447
+ return [null, hostError(err)]
448
+ }
449
+ }
450
+
451
+ return [null, $.newError('filesystem not supported')]
452
+ }
453
+
454
+ async function walkHost(path: string, walkFn: WalkFunc): Promise<$.GoError> {
455
+ const [stat, statErr] = statPath(path)
456
+ if (statErr !== null) {
457
+ return await walkFn(path, null, statErr)
458
+ }
459
+
460
+ const visitErr = await walkFn(path, fileInfo(path, stat!), null)
461
+ if (visitErr === SkipAll) {
462
+ return null
463
+ }
464
+ if (visitErr !== null) {
465
+ if (visitErr === SkipDir && statIsDir(stat!)) {
466
+ return null
467
+ }
468
+ return visitErr
469
+ }
470
+ if (!statIsDir(stat!)) {
471
+ return null
472
+ }
473
+
474
+ const [entries, readErr] = readDir(path)
475
+ if (readErr !== null) {
476
+ return await walkFn(path, fileInfo(path, stat!), readErr)
477
+ }
478
+ for (const entry of entries!) {
479
+ const err = await walkHost(Join(path, entry.name), walkFn)
480
+ if (err === SkipDir) {
481
+ if (entry.isDir) {
482
+ continue
483
+ }
484
+ return err
485
+ }
486
+ if (err === SkipAll) {
487
+ return null
488
+ }
489
+ if (err !== null) {
490
+ return err
491
+ }
492
+ }
493
+ return null
494
+ }
495
+
496
+ function normalizeWalkDirErr(d: DirEntry, err: $.GoError): $.GoError {
497
+ if (err === SkipAll) {
498
+ return null
499
+ }
500
+ if (err === SkipDir && d?.IsDir?.()) {
501
+ return null
502
+ }
503
+ return err
504
+ }
505
+
506
+ function normalizeRootWalkDirErr(err: $.GoError): $.GoError {
507
+ if (err === SkipAll || err === SkipDir) {
508
+ return null
509
+ }
510
+ return err
511
+ }
512
+
513
+ async function walkDirHost(
514
+ path: string,
515
+ walkFn: WalkDirFunc,
516
+ ): Promise<$.GoError> {
517
+ const [stat, statErr] = statPath(path)
518
+ if (statErr !== null) {
519
+ return normalizeRootWalkDirErr(await walkFn(path, null, statErr))
520
+ }
521
+
522
+ const d = dirEntry(path, stat!)
523
+ const visitErr = await walkFn(path, d, null)
524
+ if (visitErr === SkipAll) {
525
+ return null
526
+ }
527
+ if (visitErr === SkipDir && statIsDir(stat!)) {
528
+ return null
529
+ }
530
+ if (visitErr !== null || !statIsDir(stat!)) {
531
+ return visitErr
532
+ }
533
+
534
+ const [entries, readErr] = readDir(path)
535
+ if (readErr !== null) {
536
+ return normalizeWalkDirErr(d, await walkFn(path, d, readErr))
537
+ }
538
+
539
+ for (const entry of entries!) {
540
+ const err = await walkDirHost(Join(path, entry.name), walkFn)
541
+ if (err === SkipDir) {
542
+ if (entry.isDir) {
543
+ continue
544
+ }
545
+ return err
546
+ }
547
+ if (err === SkipAll) {
548
+ return null
549
+ }
550
+ if (err !== null) {
551
+ return err
552
+ }
553
+ }
554
+ return null
555
+ }
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) {
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import {
4
+ TypeKind,
5
+ arrayToSlice,
6
+ asArray,
7
+ registerStructType,
8
+ } from '../builtin/index.js'
9
+ import { NewAt, TypeOf, ValueOf } from './index.js'
10
+
11
+ class Person {
12
+ public Name = 'Ada'
13
+ public Count = 3
14
+
15
+ public String(): string {
16
+ return this.Name
17
+ }
18
+ }
19
+ ;(Person as any).__typeInfo = { name: 'main.Person' }
20
+
21
+ describe('reflect struct field access', () => {
22
+ it('finds struct fields by name and index', () => {
23
+ registerStructType(
24
+ 'main.Person',
25
+ new Person(),
26
+ [{ name: 'String', args: [], returns: [] }],
27
+ Person,
28
+ {
29
+ Name: 'string',
30
+ Count: { kind: TypeKind.Basic, name: 'int' },
31
+ },
32
+ )
33
+
34
+ const person = new Person()
35
+ const typ = TypeOf(person)
36
+ const [field, ok] = typ.FieldByName('Name')
37
+
38
+ expect(ok).toBe(true)
39
+ expect(field.Name).toBe('Name')
40
+ expect(field.Index).toEqual([0])
41
+ expect(typ.FieldByNameFunc((name) => name === 'Count')[0].Name).toBe(
42
+ 'Count',
43
+ )
44
+ expect(typ.AssignableTo(typ)).toBe(true)
45
+ expect(typ.MethodByName('String')[1]).toBe(true)
46
+ expect(ValueOf(person).FieldByName('Name').String()).toBe('Ada')
47
+ expect(
48
+ ValueOf(person)
49
+ .FieldByIndex(arrayToSlice([1]))
50
+ .Int(),
51
+ ).toBe(3)
52
+ expect(ValueOf(person).FieldByName('Missing').IsValid()).toBe(false)
53
+
54
+ const stringMethod = ValueOf(person).MethodByName('String')
55
+ expect(stringMethod.IsValid()).toBe(true)
56
+ expect(asArray(stringMethod.Call(arrayToSlice([])))[0].String()).toBe('Ada')
57
+
58
+ const nameField = ValueOf(person).FieldByName('Name')
59
+ const namePtr = NewAt(nameField.Type(), nameField.UnsafeAddr() as any)
60
+ namePtr.Elem().SetString('Grace')
61
+ expect(person.Name).toBe('Grace')
62
+ })
63
+ })
@@ -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,
@@ -25,13 +26,17 @@ export {
25
26
  Copy,
26
27
  Indirect,
27
28
  New,
29
+ NewAt,
28
30
  MakeSlice,
29
31
  MakeMap,
32
+ MakeMapWithSize,
30
33
  Append,
34
+ AppendSlice,
31
35
  MakeChan,
32
36
  Select,
33
37
  } from './value.js'
34
38
  export { Swapper } from './swapper.js'
39
+ export { MapIter } from './map.js'
35
40
 
36
41
  // Export new types and constants
37
42
  export {
@@ -51,7 +56,6 @@ export type {
51
56
  SelectDir,
52
57
  SliceHeader,
53
58
  StringHeader,
54
- MapIter,
55
59
  } from './types.js'
56
60
 
57
61
  // Export kind constants
@@ -11,7 +11,7 @@ export function rangeNum<T extends number | uintptr, N extends number | number>(
11
11
 
12
12
  // if the iteration value type is define by
13
13
  // type T built-in type.
14
- return (_yield: ((v: Value) => boolean) | null): void => {
14
+ return async (_yield: ((v: Value) => iter.YieldResult) | null): Promise<void> => {
15
15
  let convert = t!.PkgPath!() != ''
16
16
  // cannot use range T(v) because no core type.
17
17
 
@@ -24,7 +24,7 @@ export function rangeNum<T extends number | uintptr, N extends number | number>(
24
24
  if (convert) {
25
25
  tmp = tmp.Convert(t).clone()
26
26
  }
27
- if (!_yield!(tmp)) {
27
+ if (!await _yield!(tmp)) {
28
28
  return
29
29
  }
30
30
  }
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { MapIter } from './map.js'
2
+ import { AppendSlice, MakeMapWithSize, MapIter, MapOf, TypeOf, ValueOf } from './index.js'
3
3
 
4
4
  describe('MapIter', () => {
5
5
  it('should iterate over map entries with proper typing', () => {
@@ -29,3 +29,44 @@ describe('MapIter', () => {
29
29
  expect(iter.Value().Interface()).toBe(100)
30
30
  })
31
31
  })
32
+
33
+ describe('Value.MapKeys', () => {
34
+ it('returns map keys as reflect values', () => {
35
+ const map = new Map<string, number>()
36
+ map.set('alpha', 1)
37
+ map.set('beta', 2)
38
+
39
+ const keys = ValueOf(map).MapKeys()
40
+
41
+ expect(keys?.map((key) => key.String()).sort()).toEqual(['alpha', 'beta'])
42
+ })
43
+
44
+ it('returns an empty slice for empty maps', () => {
45
+ const emptyMap = new Map<string, number>()
46
+
47
+ expect(ValueOf(emptyMap).MapKeys()).toEqual([])
48
+ })
49
+ })
50
+
51
+ describe('reflect compatibility surface', () => {
52
+ it('constructs maps, ranges entries, and looks up values', () => {
53
+ const typ = MapOf(TypeOf(''), TypeOf(0))
54
+ const mapValue = MakeMapWithSize(typ, 4)
55
+ const raw = mapValue.Interface() as Map<string, number>
56
+ raw.set('alpha', 1)
57
+
58
+ const iter = mapValue.MapRange()
59
+
60
+ expect(iter?.Key().Interface()).toBe('alpha')
61
+ expect(mapValue.MapIndex(ValueOf('alpha')).Interface()).toBe(1)
62
+ expect(mapValue.Type().Comparable()).toBe(false)
63
+ expect(TypeOf('alpha').Comparable()).toBe(true)
64
+ })
65
+
66
+ it('slices and appends slice values', () => {
67
+ const sliced = ValueOf([1, 2, 3, 4]).Slice(1, 3)
68
+ const appended = AppendSlice(sliced, ValueOf([5, 6]))
69
+
70
+ expect(appended.Interface()).toEqual([2, 3, 5, 6])
71
+ })
72
+ })
package/gs/reflect/map.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  StructField,
7
7
  TypeOf,
8
8
  } from './type.js'
9
+ import { Method } from './types.js'
9
10
 
10
11
  // Simple MapOf implementation using JavaScript Map
11
12
  export function MapOf(key: Type, elem: Type): Type {
@@ -27,10 +28,18 @@ class MapType implements Type {
27
28
  return MapKind // Map kind
28
29
  }
29
30
 
31
+ public Comparable(): boolean {
32
+ return false
33
+ }
34
+
30
35
  public Name(): string {
31
36
  return '' // Map types are unnamed composite types
32
37
  }
33
38
 
39
+ public PkgPath(): string {
40
+ return ''
41
+ }
42
+
34
43
  public Size(): number {
35
44
  return 8 // pointer size
36
45
  }
@@ -51,6 +60,16 @@ class MapType implements Type {
51
60
  throw new Error('reflect: Field of non-struct type map')
52
61
  }
53
62
 
63
+ public FieldByName(_name: string): [StructField, boolean] {
64
+ throw new Error('reflect: FieldByName of non-struct type map')
65
+ }
66
+
67
+ public FieldByNameFunc(
68
+ _match: (name: string) => boolean,
69
+ ): [StructField, boolean] {
70
+ throw new Error('reflect: FieldByNameFunc of non-struct type map')
71
+ }
72
+
54
73
  public Implements(u: Type | null): boolean {
55
74
  if (!u) {
56
75
  return false
@@ -62,6 +81,10 @@ class MapType implements Type {
62
81
  return false
63
82
  }
64
83
 
84
+ public AssignableTo(u: Type | null): boolean {
85
+ return u != null && this.String() === u.String()
86
+ }
87
+
65
88
  public OverflowInt(_x: number): boolean {
66
89
  throw new Error('reflect: OverflowInt of non-integer type map')
67
90
  }
@@ -78,6 +101,22 @@ class MapType implements Type {
78
101
  return 0
79
102
  }
80
103
 
104
+ public MethodByName(_name: string): [Method, boolean] {
105
+ return [
106
+ {
107
+ Name: '',
108
+ Type: TypeOf(null),
109
+ Func: () => undefined,
110
+ Index: 0,
111
+ },
112
+ false,
113
+ ]
114
+ }
115
+
116
+ public Len(): number {
117
+ throw new Error('reflect: Len of non-array type map')
118
+ }
119
+
81
120
  public Bits(): number {
82
121
  throw new Error('reflect: Bits of non-sized type map')
83
122
  }