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
@@ -56,7 +56,7 @@ export interface Channel<T> {
56
56
  * @param id An identifier for this case in the select statement
57
57
  * @returns Promise that resolves when this case is selected
58
58
  */
59
- selectReceive(id: number): Promise<SelectResult<T>>
59
+ selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>>
60
60
 
61
61
  /**
62
62
  * Used in select statements to create a send operation promise.
@@ -64,7 +64,11 @@ export interface Channel<T> {
64
64
  * @param id An identifier for this case in the select statement
65
65
  * @returns Promise that resolves when this case is selected
66
66
  */
67
- selectSend(value: T, id: number): Promise<SelectResult<boolean>>
67
+ selectSend(
68
+ value: T,
69
+ id: number,
70
+ signal?: AbortSignal,
71
+ ): Promise<SelectResult<boolean>>
68
72
 
69
73
  /**
70
74
  * Checks if the channel has data ready to be received without blocking.
@@ -77,6 +81,16 @@ export interface Channel<T> {
77
81
  * Used for non-blocking select operations.
78
82
  */
79
83
  canSendNonBlocking(): boolean
84
+
85
+ /**
86
+ * Reports the number of buffered values currently queued in the channel.
87
+ */
88
+ len(): number
89
+
90
+ /**
91
+ * Reports the channel buffer capacity.
92
+ */
93
+ cap(): number
80
94
  }
81
95
 
82
96
  /**
@@ -91,6 +105,27 @@ export interface SelectCase<T> {
91
105
  onSelected?: (result: SelectResult<T>) => Promise<any>
92
106
  }
93
107
 
108
+ const selectVoidReturnMarker = '__goscriptSelectVoidReturn'
109
+
110
+ export interface SelectVoidReturn {
111
+ readonly [selectVoidReturnMarker]: true
112
+ }
113
+
114
+ export function selectVoidReturn(): SelectVoidReturn {
115
+ return { [selectVoidReturnMarker]: true }
116
+ }
117
+
118
+ function selectHandlerResult<V>(handlerResult: any): [boolean, V] {
119
+ if (
120
+ handlerResult &&
121
+ typeof handlerResult === 'object' &&
122
+ handlerResult[selectVoidReturnMarker] === true
123
+ ) {
124
+ return [true, undefined as V]
125
+ }
126
+ return [handlerResult !== undefined, handlerResult as V]
127
+ }
128
+
94
129
  /**
95
130
  * Helper for 'select' statements. Takes an array of select cases
96
131
  * and resolves when one of them completes, following Go's select rules.
@@ -146,13 +181,13 @@ export async function selectStatement<T, V = void>(
146
181
  const handlerResult = await selectedCase.onSelected(
147
182
  result as SelectResult<T>,
148
183
  )
149
- return [handlerResult !== undefined, handlerResult as V]
184
+ return selectHandlerResult<V>(handlerResult)
150
185
  }
151
186
  } else {
152
187
  const result = await selectedCase.channel.selectReceive(selectedCase.id)
153
188
  if (selectedCase.onSelected) {
154
189
  const handlerResult = await selectedCase.onSelected(result)
155
- return [handlerResult !== undefined, handlerResult as V]
190
+ return selectHandlerResult<V>(handlerResult)
156
191
  }
157
192
  }
158
193
  } else {
@@ -173,22 +208,27 @@ export async function selectStatement<T, V = void>(
173
208
  ok: false,
174
209
  id: -1,
175
210
  } as SelectResult<T>)
176
- return [handlerResult !== undefined, handlerResult as V]
211
+ return selectHandlerResult<V>(handlerResult)
177
212
  }
178
213
  return [false, undefined as V] // Return after executing the default case
179
214
  }
180
215
 
181
216
  // 3. If no operations are ready and no default case, block until one is ready
182
217
  // Use Promise.race on the blocking promises
218
+ const abort = new AbortController()
183
219
  const blockingPromises = cases
184
220
  .filter((c) => c.id !== -1) // Exclude default case
185
221
  .filter((c) => c.channel !== null) // Exclude nil channels (they would block forever)
186
222
  .map((caseObj) => {
187
223
  // At this point caseObj.channel is guaranteed to be non-null
188
224
  if (caseObj.isSend) {
189
- return caseObj.channel!.selectSend(caseObj.value, caseObj.id)
225
+ return caseObj.channel!.selectSend(
226
+ caseObj.value,
227
+ caseObj.id,
228
+ abort.signal,
229
+ )
190
230
  } else {
191
- return caseObj.channel!.selectReceive(caseObj.id)
231
+ return caseObj.channel!.selectReceive(caseObj.id, abort.signal)
192
232
  }
193
233
  })
194
234
 
@@ -199,11 +239,12 @@ export async function selectStatement<T, V = void>(
199
239
  }
200
240
 
201
241
  const result = await Promise.race(blockingPromises)
242
+ abort.abort()
202
243
  // Execute onSelected handler for the selected case
203
244
  const selectedCase = cases.find((c) => c.id === result.id)
204
245
  if (selectedCase && selectedCase.onSelected) {
205
246
  const handlerResult = await selectedCase.onSelected(result)
206
- return [handlerResult !== undefined, handlerResult as V]
247
+ return selectHandlerResult<V>(handlerResult)
207
248
  }
208
249
 
209
250
  // No explicit return needed here, as the function will implicitly return after the await
@@ -425,7 +466,10 @@ class BufferedChannel<T> implements Channel<T> {
425
466
  })
426
467
  }
427
468
 
428
- async selectReceive(id: number): Promise<SelectResult<T>> {
469
+ async selectReceive(
470
+ id: number,
471
+ signal?: AbortSignal,
472
+ ): Promise<SelectResult<T>> {
429
473
  if (this.buffer.length > 0) {
430
474
  const value = this.buffer.shift()!
431
475
  if (this.senders.length > 0) {
@@ -447,15 +491,43 @@ class BufferedChannel<T> implements Channel<T> {
447
491
  }
448
492
 
449
493
  return new Promise<SelectResult<T>>((resolve) => {
450
- this.receiversWithOk.push({
494
+ const state = { done: false }
495
+ const receiversWithOk = this.receiversWithOk
496
+ const task = {
451
497
  resolveReceive: (result: ChannelReceiveResult<T>) => {
452
- resolve({ ...result, id })
498
+ if (!state.done) {
499
+ state.done = true
500
+ cleanup()
501
+ resolve({ ...result, id })
502
+ }
453
503
  },
454
- })
504
+ }
505
+ function cleanup() {
506
+ signal?.removeEventListener('abort', onAbort)
507
+ const idx = receiversWithOk.indexOf(task)
508
+ if (idx >= 0) {
509
+ receiversWithOk.splice(idx, 1)
510
+ }
511
+ }
512
+ function onAbort() {
513
+ if (!state.done) {
514
+ state.done = true
515
+ cleanup()
516
+ }
517
+ }
518
+ if (signal?.aborted) {
519
+ return
520
+ }
521
+ signal?.addEventListener('abort', onAbort, { once: true })
522
+ this.receiversWithOk.push(task)
455
523
  })
456
524
  }
457
525
 
458
- async selectSend(value: T, id: number): Promise<SelectResult<boolean>> {
526
+ async selectSend(
527
+ value: T,
528
+ id: number,
529
+ signal?: AbortSignal,
530
+ ): Promise<SelectResult<boolean>> {
459
531
  if (this.closed) {
460
532
  // A select case sending on a closed channel panics in Go.
461
533
  // This will cause Promise.race in selectStatement to reject.
@@ -479,11 +551,43 @@ class BufferedChannel<T> implements Channel<T> {
479
551
  }
480
552
 
481
553
  return new Promise<SelectResult<boolean>>((resolve, reject) => {
482
- this.senders.push({
554
+ const state = { done: false }
555
+ const senders = this.senders
556
+ const task = {
483
557
  value,
484
- resolveSend: () => resolve({ value: true, ok: true, id }),
485
- rejectSend: (e) => reject(e), // Propagate error if channel closes
486
- })
558
+ resolveSend: () => {
559
+ if (!state.done) {
560
+ state.done = true
561
+ cleanup()
562
+ resolve({ value: true, ok: true, id })
563
+ }
564
+ },
565
+ rejectSend: (e: Error) => {
566
+ if (!state.done) {
567
+ state.done = true
568
+ cleanup()
569
+ reject(e)
570
+ }
571
+ },
572
+ }
573
+ function cleanup() {
574
+ signal?.removeEventListener('abort', onAbort)
575
+ const idx = senders.indexOf(task)
576
+ if (idx >= 0) {
577
+ senders.splice(idx, 1)
578
+ }
579
+ }
580
+ function onAbort() {
581
+ if (!state.done) {
582
+ state.done = true
583
+ cleanup()
584
+ }
585
+ }
586
+ if (signal?.aborted) {
587
+ return
588
+ }
589
+ signal?.addEventListener('abort', onAbort, { once: true })
590
+ this.senders.push(task)
487
591
  })
488
592
  }
489
593
 
@@ -530,6 +634,14 @@ class BufferedChannel<T> implements Channel<T> {
530
634
  this.receiversWithOk.length > 0
531
635
  )
532
636
  }
637
+
638
+ len(): number {
639
+ return this.buffer.length
640
+ }
641
+
642
+ cap(): number {
643
+ return this.capacity
644
+ }
533
645
  }
534
646
 
535
647
  /**
@@ -553,8 +665,14 @@ export interface ChannelRef<T> {
553
665
  close(): void
554
666
  canSendNonBlocking(): boolean
555
667
  canReceiveNonBlocking(): boolean
556
- selectSend(value: T, id: number): Promise<SelectResult<boolean>>
557
- selectReceive(id: number): Promise<SelectResult<T>>
668
+ selectSend(
669
+ value: T,
670
+ id: number,
671
+ signal?: AbortSignal,
672
+ ): Promise<SelectResult<boolean>>
673
+ selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>>
674
+ len(): number
675
+ cap(): number
558
676
  }
559
677
 
560
678
  /**
@@ -590,12 +708,24 @@ export class BidirectionalChannelRef<T> implements ChannelRef<T> {
590
708
  return this.channel.canReceiveNonBlocking()
591
709
  }
592
710
 
593
- selectSend(value: T, id: number): Promise<SelectResult<boolean>> {
594
- return this.channel.selectSend(value, id)
711
+ selectSend(
712
+ value: T,
713
+ id: number,
714
+ signal?: AbortSignal,
715
+ ): Promise<SelectResult<boolean>> {
716
+ return this.channel.selectSend(value, id, signal)
717
+ }
718
+
719
+ selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>> {
720
+ return this.channel.selectReceive(id, signal)
721
+ }
722
+
723
+ len(): number {
724
+ return this.channel.len()
595
725
  }
596
726
 
597
- selectReceive(id: number): Promise<SelectResult<T>> {
598
- return this.channel.selectReceive(id)
727
+ cap(): number {
728
+ return this.channel.cap()
599
729
  }
600
730
  }
601
731
 
@@ -621,8 +751,12 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
621
751
  return this.channel.canSendNonBlocking()
622
752
  }
623
753
 
624
- selectSend(value: T, id: number): Promise<SelectResult<boolean>> {
625
- return this.channel.selectSend(value, id)
754
+ selectSend(
755
+ value: T,
756
+ id: number,
757
+ signal?: AbortSignal,
758
+ ): Promise<SelectResult<boolean>> {
759
+ return this.channel.selectSend(value, id, signal)
626
760
  }
627
761
 
628
762
  // Disallow receive operations
@@ -638,9 +772,17 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
638
772
  return false
639
773
  }
640
774
 
641
- selectReceive(_id: number): Promise<SelectResult<T>> {
775
+ selectReceive(_id: number, _signal?: AbortSignal): Promise<SelectResult<T>> {
642
776
  throw new Error('Cannot receive from send-only channel')
643
777
  }
778
+
779
+ len(): number {
780
+ return this.channel.len()
781
+ }
782
+
783
+ cap(): number {
784
+ return this.channel.cap()
785
+ }
644
786
  }
645
787
 
646
788
  /**
@@ -664,8 +806,8 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
664
806
  return this.channel.canReceiveNonBlocking()
665
807
  }
666
808
 
667
- selectReceive(id: number): Promise<SelectResult<T>> {
668
- return this.channel.selectReceive(id)
809
+ selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>> {
810
+ return this.channel.selectReceive(id, signal)
669
811
  }
670
812
 
671
813
  // Disallow send operations
@@ -682,9 +824,21 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
682
824
  return false
683
825
  }
684
826
 
685
- selectSend(_value: T, _id: number): Promise<SelectResult<boolean>> {
827
+ selectSend(
828
+ _value: T,
829
+ _id: number,
830
+ _signal?: AbortSignal,
831
+ ): Promise<SelectResult<boolean>> {
686
832
  throw new Error('Cannot send to receive-only channel')
687
833
  }
834
+
835
+ len(): number {
836
+ return this.channel.len()
837
+ }
838
+
839
+ cap(): number {
840
+ return this.channel.cap()
841
+ }
688
842
  }
689
843
 
690
844
  /**
@@ -51,8 +51,19 @@ export class AsyncDisposableStack implements AsyncDisposable {
51
51
  */
52
52
  async [Symbol.asyncDispose](): Promise<void> {
53
53
  // Execute in LIFO order, awaiting each potentially async function
54
- for (let i = this.stack.length - 1; i >= 0; --i) {
55
- await this.stack[i]()
54
+ while (this.stack.length) {
55
+ const fn = this.stack.pop()!
56
+ await fn()
57
+ }
58
+ }
59
+
60
+ [Symbol.dispose](): void {
61
+ while (this.stack.length) {
62
+ const fn = this.stack.pop()!
63
+ const result = fn()
64
+ if (result && typeof (result as Promise<void>).then === "function") {
65
+ throw new Error("async deferred function disposed synchronously")
66
+ }
56
67
  }
57
68
  }
58
69
  }
@@ -36,6 +36,7 @@ function runtimeFixture(platform: string): HostRuntime {
36
36
  deno: null,
37
37
  getEnv: () => '',
38
38
  getStdioHandle: () => null,
39
+ nodeCrypto: null,
39
40
  nodeFS: null,
40
41
  platform,
41
42
  processObj: null,
@@ -54,6 +54,16 @@ export type NodeFSModule = {
54
54
  ): void
55
55
  }
56
56
 
57
+ export type NodeCryptoHash = {
58
+ copy?(): NodeCryptoHash
59
+ update(data: Uint8Array): NodeCryptoHash
60
+ digest(): Uint8Array
61
+ }
62
+
63
+ export type NodeCryptoModule = {
64
+ createHash(algorithm: string): NodeCryptoHash
65
+ }
66
+
57
67
  export type DenoStream = {
58
68
  readSync?(buffer: Uint8Array): number | null
59
69
  writeSync?(buffer: Uint8Array): number
@@ -74,6 +84,7 @@ type HostTextWrite = (data: string) => void
74
84
 
75
85
  export type HostRuntime = {
76
86
  deno: any | null
87
+ nodeCrypto: NodeCryptoModule | null
77
88
  nodeFS: NodeFSModule | null
78
89
  platform: string
79
90
  processObj: any | null
@@ -166,6 +177,31 @@ function detectNodeFS(processObj: any | null): NodeFSModule | null {
166
177
  return null
167
178
  }
168
179
 
180
+ function detectNodeCrypto(processObj: any | null): NodeCryptoModule | null {
181
+ if (processObj && typeof processObj.getBuiltinModule === 'function') {
182
+ const module = processObj.getBuiltinModule('crypto')
183
+ if (module && typeof module.createHash === 'function') {
184
+ return module as NodeCryptoModule
185
+ }
186
+ }
187
+
188
+ const requireFn = getDynamicRequire()
189
+ if (requireFn) {
190
+ for (const specifier of ['node:crypto', 'crypto']) {
191
+ try {
192
+ const module = requireFn(specifier) as NodeCryptoModule | null
193
+ if (module && typeof module.createHash === 'function') {
194
+ return module
195
+ }
196
+ } catch {
197
+ // Try the next fallback.
198
+ }
199
+ }
200
+ }
201
+
202
+ return null
203
+ }
204
+
169
205
  function hasURLScheme(path: string): boolean {
170
206
  return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(path)
171
207
  }
@@ -247,6 +283,7 @@ function detectHostRuntime(): HostRuntime {
247
283
  const deno = globalObj.Deno ?? null
248
284
  const processObj = globalObj.process ?? null
249
285
  const nodeFS = detectNodeFS(processObj)
286
+ const nodeCrypto = detectNodeCrypto(processObj)
250
287
 
251
288
  const getStdioHandle = (fd: number): DenoFileLike | null => {
252
289
  if (!deno) {
@@ -344,6 +381,7 @@ function detectHostRuntime(): HostRuntime {
344
381
  deno,
345
382
  getEnv,
346
383
  getStdioHandle,
384
+ nodeCrypto,
347
385
  nodeFS,
348
386
  platform,
349
387
  processObj,
package/gs/builtin/map.ts CHANGED
@@ -1,3 +1,6 @@
1
+ import { comparableEqual } from './builtin.js'
2
+ import { GoBinaryString, stringEqual } from './slice.js'
3
+
1
4
  /**
2
5
  * Creates a new map (TypeScript Map).
3
6
  * @returns A new TypeScript Map.
@@ -18,9 +21,9 @@ export function mapGet<K, V, D>(
18
21
  key: K,
19
22
  defaultValue: D,
20
23
  ): [V, true] | [D, false] {
21
- const exists = map?.has(key)
22
- if (exists) {
23
- return [map!.get(key)!, true]
24
+ const entry = findMapEntry(map, key)
25
+ if (entry.found) {
26
+ return [entry.value, true]
24
27
  } else {
25
28
  return [defaultValue, false]
26
29
  }
@@ -36,7 +39,8 @@ export const mapSet = <K, V>(map: Map<K, V> | null, key: K, value: V): void => {
36
39
  if (!map) {
37
40
  throw new Error('assign to nil map')
38
41
  }
39
- map.set(key, value)
42
+ const entry = findMapEntry(map, key)
43
+ map.set(entry.found ? entry.key : key, value)
40
44
  }
41
45
 
42
46
  /**
@@ -45,7 +49,10 @@ export const mapSet = <K, V>(map: Map<K, V> | null, key: K, value: V): void => {
45
49
  * @param key The key to delete.
46
50
  */
47
51
  export const deleteMapEntry = <K, V>(map: Map<K, V> | null, key: K): void => {
48
- map?.delete(key)
52
+ const entry = findMapEntry(map, key)
53
+ if (entry.found) {
54
+ map!.delete(entry.key)
55
+ }
49
56
  }
50
57
 
51
58
  /**
@@ -55,5 +62,38 @@ export const deleteMapEntry = <K, V>(map: Map<K, V> | null, key: K): void => {
55
62
  * @returns True if the key exists, false otherwise.
56
63
  */
57
64
  export const mapHas = <K, V>(map: Map<K, V> | null, key: K): boolean => {
58
- return map?.has(key) ?? false
65
+ return findMapEntry(map, key).found
66
+ }
67
+
68
+ function findMapEntry<K, V>(
69
+ map: Map<K, V> | null,
70
+ key: K,
71
+ ): { found: false } | { found: true; key: K; value: V } {
72
+ if (!map) {
73
+ return { found: false }
74
+ }
75
+ if (map.has(key)) {
76
+ return { found: true, key, value: map.get(key)! }
77
+ }
78
+ if (isGoStringKey(key)) {
79
+ for (const [candidate, value] of map.entries()) {
80
+ if (isGoStringKey(candidate) && stringEqual(candidate as string, key as string)) {
81
+ return { found: true, key: candidate, value }
82
+ }
83
+ }
84
+ return { found: false }
85
+ }
86
+ if (key === null || (typeof key !== 'object' && typeof key !== 'function')) {
87
+ return { found: false }
88
+ }
89
+ for (const [candidate, value] of map.entries()) {
90
+ if (candidate !== key && comparableEqual(candidate, key)) {
91
+ return { found: true, key: candidate, value }
92
+ }
93
+ }
94
+ return { found: false }
95
+ }
96
+
97
+ function isGoStringKey(value: unknown): value is string | GoBinaryString {
98
+ return typeof value === 'string' || value instanceof GoBinaryString
59
99
  }
@@ -68,7 +68,10 @@ function formatValue(
68
68
  try {
69
69
  if (value instanceof Map) {
70
70
  return formatArray(
71
- Array.from(value.entries()).map(([k, v]) => `${formatValue(k, depth + 1, true, seen)} => ${formatValue(v, depth + 1, true, seen)}`),
71
+ Array.from(value.entries()).map(
72
+ ([k, v]) =>
73
+ `${formatValue(k, depth + 1, true, seen)} => ${formatValue(v, depth + 1, true, seen)}`,
74
+ ),
72
75
  depth,
73
76
  seen,
74
77
  )
@@ -113,7 +116,11 @@ function formatUint8Array(value: Uint8Array): string {
113
116
  return `Uint8Array(${value.length}) [ ${Array.from(value).join(', ')} ]`
114
117
  }
115
118
 
116
- function formatArray(value: readonly any[], depth: number, seen: WeakSet<object>): string {
119
+ function formatArray(
120
+ value: readonly any[],
121
+ depth: number,
122
+ seen: WeakSet<object>,
123
+ ): string {
117
124
  if (value.length === 0) {
118
125
  return '[]'
119
126
  }
@@ -150,5 +157,7 @@ function getObjectEntries(value: Record<string, any>): [string, any][] {
150
157
  })
151
158
  }
152
159
 
153
- return Object.entries(value).filter(([, entry]) => typeof entry !== 'function')
160
+ return Object.entries(value).filter(
161
+ ([, entry]) => typeof entry !== 'function',
162
+ )
154
163
  }