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
@@ -21,12 +21,41 @@ export function println(...args: any[]): void {
21
21
  writeHostStdoutText(message)
22
22
  }
23
23
 
24
+ export class GoPanic extends Error {
25
+ constructor(public readonly value: unknown) {
26
+ super(`panic: ${formatPanicValue(value)}`)
27
+ }
28
+ }
29
+
24
30
  /**
25
31
  * Implementation of Go's built-in panic function
26
32
  * @param args Arguments passed to panic
27
33
  */
28
- export function panic(...args: any[]): never {
29
- throw new Error(`panic: ${args.map((arg) => String(arg)).join(' ')}`)
34
+ export function panic(...args: unknown[]): never {
35
+ const value = args.length === 1 ? args[0] : args
36
+ throw new GoPanic(value)
37
+ }
38
+
39
+ export function panicValue(value: unknown): unknown {
40
+ if (value instanceof GoPanic) {
41
+ return value.value
42
+ }
43
+ return value
44
+ }
45
+
46
+ function formatPanicValue(value: unknown): string {
47
+ if (value instanceof Error) {
48
+ return value.message
49
+ }
50
+ if (
51
+ value !== null &&
52
+ typeof value === 'object' &&
53
+ 'Error' in value &&
54
+ typeof (value as { Error?: unknown }).Error === 'function'
55
+ ) {
56
+ return String((value as { Error(): string }).Error())
57
+ }
58
+ return String(value)
30
59
  }
31
60
 
32
61
  /**
@@ -35,7 +64,7 @@ export function panic(...args: any[]): never {
35
64
  * For maps, it deletes all entries.
36
65
  * @param v The slice or map to clear
37
66
  */
38
- export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
67
+ export function clear<T>(v: Slice<T> | Map<unknown, unknown> | null): void {
39
68
  if (v === null || v === undefined) {
40
69
  return
41
70
  }
@@ -43,12 +72,40 @@ export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
43
72
  v.clear()
44
73
  return
45
74
  }
75
+ if (v instanceof Uint8Array) {
76
+ v.fill(0)
77
+ return
78
+ }
79
+ if (isSliceProxy(v)) {
80
+ const zero = clearZeroValue(v)
81
+ for (let i = 0; i < v.length; i++) {
82
+ v[i] = zero
83
+ }
84
+ return
85
+ }
46
86
  if (Array.isArray(v)) {
47
- v.fill(null as T)
87
+ v.fill(clearZeroValue(v))
48
88
  return
49
89
  }
50
90
  }
51
91
 
92
+ function clearZeroValue<T>(v: T[]): T {
93
+ for (const item of v) {
94
+ if (item !== null && item !== undefined) {
95
+ switch (typeof item) {
96
+ case 'number':
97
+ return 0 as T
98
+ case 'string':
99
+ return '' as T
100
+ case 'boolean':
101
+ return false as T
102
+ }
103
+ break
104
+ }
105
+ }
106
+ return null as T
107
+ }
108
+
52
109
  /**
53
110
  * assignStruct copies all field values from source struct to target struct.
54
111
  * Used for pointer dereference assignment: *p = value
@@ -93,16 +150,229 @@ export function pointerValue<T>(value: T | VarRef<T> | null | undefined): T {
93
150
  if (isVarRef(value)) {
94
151
  return value.value as T
95
152
  }
153
+ const boxed =
154
+ typeof value === 'object' &&
155
+ value !== null &&
156
+ '__goValue' in value ?
157
+ (value as { __goType?: unknown; __goValue: T | VarRef<T> })
158
+ : null
159
+ if (
160
+ boxed !== null &&
161
+ typeof boxed.__goType === 'string' &&
162
+ boxed.__goType.startsWith('*') &&
163
+ !hasGoMethodSurface(value)
164
+ ) {
165
+ return pointerValue(boxed.__goValue)
166
+ }
167
+ return value
168
+ }
169
+
170
+ export function pointerValueOrNil<T>(
171
+ value: T | VarRef<T> | null | undefined,
172
+ ): T | null {
173
+ if (value === null || value === undefined) {
174
+ return null
175
+ }
176
+ if (isVarRef(value)) {
177
+ return value.value as T
178
+ }
179
+ const boxed =
180
+ typeof value === 'object' &&
181
+ value !== null &&
182
+ '__goValue' in value ?
183
+ (value as { __goType?: unknown; __goValue: T | VarRef<T> })
184
+ : null
185
+ if (
186
+ boxed !== null &&
187
+ typeof boxed.__goType === 'string' &&
188
+ boxed.__goType.startsWith('*') &&
189
+ !hasGoMethodSurface(value)
190
+ ) {
191
+ return pointerValueOrNil(boxed.__goValue)
192
+ }
96
193
  return value
97
194
  }
98
195
 
196
+ export function arrayEqual(a: unknown, b: unknown): boolean {
197
+ return comparableEqual(a, b)
198
+ }
199
+
200
+ export function comparableEqual(a: unknown, b: unknown): boolean {
201
+ if (a === b) {
202
+ return true
203
+ }
204
+ if (a === null || a === undefined || b === null || b === undefined) {
205
+ return false
206
+ }
207
+ if (isArrayLike(a) && isArrayLike(b)) {
208
+ if (a.length !== b.length) {
209
+ return false
210
+ }
211
+ for (let i = 0; i < a.length; i++) {
212
+ if (!comparableEqual(a[i], b[i])) {
213
+ return false
214
+ }
215
+ }
216
+ return true
217
+ }
218
+ if (isComplexValue(a) || isComplexValue(b)) {
219
+ return (
220
+ isComplexValue(a) &&
221
+ isComplexValue(b) &&
222
+ a.real === b.real &&
223
+ a.imag === b.imag
224
+ )
225
+ }
226
+ if (hasGoType(a) || hasGoType(b)) {
227
+ if (!hasGoType(a) || !hasGoType(b) || a.__goType !== b.__goType) {
228
+ return false
229
+ }
230
+ if (a.__isTypedNil || b.__isTypedNil) {
231
+ return a.__isTypedNil === true && b.__isTypedNil === true
232
+ }
233
+ if (hasGoValue(a) || hasGoValue(b)) {
234
+ return hasGoValue(a) && hasGoValue(b) && comparableEqual(a.__goValue, b.__goValue)
235
+ }
236
+ }
237
+ if (isStructValue(a) && isStructValue(b)) {
238
+ return fieldsEqual(a._fields, b._fields)
239
+ }
240
+ return false
241
+ }
242
+
243
+ function isArrayLike(value: unknown): value is ArrayLike<unknown> {
244
+ return Array.isArray(value) || value instanceof Uint8Array
245
+ }
246
+
247
+ function hasGoType(value: unknown): value is {
248
+ __goType: string
249
+ __isTypedNil?: boolean
250
+ } {
251
+ return (
252
+ typeof value === 'object' &&
253
+ value !== null &&
254
+ typeof (value as { __goType?: unknown }).__goType === 'string'
255
+ )
256
+ }
257
+
258
+ function hasGoValue(value: unknown): value is {
259
+ __goValue: unknown
260
+ } {
261
+ return typeof value === 'object' && value !== null && '__goValue' in value
262
+ }
263
+
264
+ function hasGoMethodSurface(value: unknown): boolean {
265
+ if (typeof value !== 'object' || value === null) {
266
+ return false
267
+ }
268
+ return Object.keys(value).some((key) => {
269
+ return (
270
+ key !== '__goType' &&
271
+ key !== '__goValue' &&
272
+ key !== 'valueOf' &&
273
+ key !== 'toString' &&
274
+ typeof (value as Record<string, unknown>)[key] === 'function'
275
+ )
276
+ })
277
+ }
278
+
279
+ function isStructValue(value: unknown): value is {
280
+ _fields: Record<string, VarRef<unknown>>
281
+ } {
282
+ const fields =
283
+ typeof value === 'object' && value !== null ?
284
+ (value as { _fields?: unknown })._fields
285
+ : undefined
286
+ return (
287
+ typeof fields === 'object' &&
288
+ fields !== null &&
289
+ !Array.isArray(fields) &&
290
+ Object.values(fields).every(isVarRef)
291
+ )
292
+ }
293
+
294
+ function fieldsEqual(
295
+ a: Record<string, VarRef<unknown>>,
296
+ b: Record<string, VarRef<unknown>>,
297
+ ): boolean {
298
+ const aKeys = Object.keys(a)
299
+ const bKeys = Object.keys(b)
300
+ if (aKeys.length !== bKeys.length) {
301
+ return false
302
+ }
303
+ for (const key of aKeys) {
304
+ if (!(key in b) || !comparableEqual(a[key].value, b[key].value)) {
305
+ return false
306
+ }
307
+ }
308
+ return true
309
+ }
310
+
311
+ export interface Complex {
312
+ real: number
313
+ imag: number
314
+ }
315
+
316
+ function isComplexValue(value: unknown): value is Complex {
317
+ return (
318
+ typeof value === 'object' &&
319
+ value !== null &&
320
+ typeof (value as { real?: unknown }).real === 'number' &&
321
+ typeof (value as { imag?: unknown }).imag === 'number'
322
+ )
323
+ }
324
+
325
+ export function complex(real: number, imag: number): Complex {
326
+ return { real, imag }
327
+ }
328
+
329
+ export function real(value: number | Complex | null | undefined): number {
330
+ if (typeof value === 'number') {
331
+ return value
332
+ }
333
+ return value?.real ?? 0
334
+ }
335
+
336
+ export function imag(value: number | Complex | null | undefined): number {
337
+ if (typeof value === 'number') {
338
+ return 0
339
+ }
340
+ return value?.imag ?? 0
341
+ }
342
+
99
343
  // Bytes represents all valid []byte representations in TypeScript
100
344
  // This includes Uint8Array (the preferred representation) and $.Slice<number> (which includes null)
101
345
  export type Bytes = Uint8Array | Slice<number>
346
+ type ByteData = Uint8Array | number[] | SliceProxy<number>
347
+
348
+ const maxSafeBigInt = BigInt(Number.MAX_SAFE_INTEGER)
349
+ const maxUint64BigInt = 0xffffffffffffffffn
102
350
 
103
351
  // int converts a value to a Go int type, handling proper signed integer conversion
104
352
  // This ensures that values like 2147483648 (2^31) are properly handled according to Go semantics
105
- export function int(value: number): number {
353
+ export function int(value: number | bigint, bits = 0): number {
354
+ if (typeof value === 'bigint') {
355
+ if (bits > 0 && bits <= 64) {
356
+ return Number(BigInt.asIntN(bits, value))
357
+ }
358
+ return Number(value)
359
+ }
360
+ if (bits > 0 && bits < 64) {
361
+ const modulo = 2 ** bits
362
+ const sign = 2 ** (bits - 1)
363
+ let truncated = Math.trunc(value)
364
+ if (!Number.isFinite(truncated)) {
365
+ return truncated
366
+ }
367
+ truncated %= modulo
368
+ if (truncated < 0) {
369
+ truncated += modulo
370
+ }
371
+ if (truncated >= sign) {
372
+ truncated -= modulo
373
+ }
374
+ return truncated
375
+ }
106
376
  // In Go, int is typically 64-bit on 64-bit systems, but for compatibility with JavaScript
107
377
  // we need to handle the conversion properly. The issue is that JavaScript's number type
108
378
  // can represent values larger than 32-bit signed integers, but when cast in certain contexts
@@ -115,6 +385,260 @@ export function int(value: number): number {
115
385
  return Math.trunc(value)
116
386
  }
117
387
 
388
+ // uint converts a value to an unsigned Go integer width.
389
+ export function uint(value: number | bigint, bits = 64): number {
390
+ if (typeof value === 'bigint') {
391
+ const normalized = BigInt.asUintN(Math.min(bits, 64), value)
392
+ if (bits >= 64) {
393
+ return uint64Result(normalized)
394
+ }
395
+ return Number(normalized)
396
+ }
397
+ if (!Number.isFinite(value)) {
398
+ return value
399
+ }
400
+ if (bits === 8) {
401
+ return value & 0xff
402
+ }
403
+ if (bits === 16) {
404
+ return value & 0xffff
405
+ }
406
+ if (bits === 32) {
407
+ return value >>> 0
408
+ }
409
+ if (bits >= 64) {
410
+ const truncated = Math.trunc(value)
411
+ if (truncated >= 0 && truncated <= Number.MAX_SAFE_INTEGER) {
412
+ return truncated
413
+ }
414
+ }
415
+ const modulo = bits >= 64 ? 2 ** 64 : 2 ** bits
416
+ let truncated = Math.trunc(value)
417
+ truncated %= modulo
418
+ if (truncated < 0) {
419
+ truncated += modulo
420
+ }
421
+ return truncated
422
+ }
423
+
424
+ export function uint64Shl(
425
+ value: number | bigint,
426
+ shift: number | bigint,
427
+ ): number {
428
+ return uint64Result(uint64Value(value) << BigInt(Math.trunc(Number(shift))))
429
+ }
430
+
431
+ export function uint64Shr(
432
+ value: number | bigint,
433
+ shift: number | bigint,
434
+ ): number {
435
+ return uint64Result(uint64Value(value) >> BigInt(Math.trunc(Number(shift))))
436
+ }
437
+
438
+ export function int64Shl(
439
+ value: number | bigint,
440
+ shift: number | bigint,
441
+ ): number {
442
+ return int64Result(int64Value(value) << BigInt(Math.trunc(Number(shift))))
443
+ }
444
+
445
+ export function int64Shr(
446
+ value: number | bigint,
447
+ shift: number | bigint,
448
+ ): number {
449
+ return int64Result(int64Value(value) >> BigInt(Math.trunc(Number(shift))))
450
+ }
451
+
452
+ export function uintShr(
453
+ value: number | bigint,
454
+ shift: number | bigint,
455
+ bits = 32,
456
+ ): number {
457
+ const width = Math.min(bits, 32)
458
+ const amount = Math.trunc(Number(shift))
459
+ if (amount < 0) {
460
+ throw new Error('runtime error: negative shift amount')
461
+ }
462
+ if (amount >= width) {
463
+ return 0
464
+ }
465
+ return uint(value, width) >>> amount
466
+ }
467
+
468
+ export function uint64Mul(
469
+ left: number | bigint,
470
+ right: number | bigint,
471
+ ): number {
472
+ return uint64Result(uint64Value(left) * uint64Value(right))
473
+ }
474
+
475
+ export function int64Mul(
476
+ left: number | bigint,
477
+ right: number | bigint,
478
+ ): number {
479
+ return int64Result(int64Value(left) * int64Value(right))
480
+ }
481
+
482
+ export function uint64Div(
483
+ left: number | bigint,
484
+ right: number | bigint,
485
+ ): number {
486
+ const divisor = uint64Value(right)
487
+ if (divisor === 0n) {
488
+ throw new Error('runtime error: integer divide by zero')
489
+ }
490
+ return uint64Result(uint64Value(left) / divisor)
491
+ }
492
+
493
+ export function int64Div(
494
+ left: number | bigint,
495
+ right: number | bigint,
496
+ ): number {
497
+ const divisor = int64Value(right)
498
+ if (divisor === 0n) {
499
+ throw new Error('runtime error: integer divide by zero')
500
+ }
501
+ return int64Result(int64Value(left) / divisor)
502
+ }
503
+
504
+ export function uint64Mod(
505
+ left: number | bigint,
506
+ right: number | bigint,
507
+ ): number {
508
+ const divisor = uint64Value(right)
509
+ if (divisor === 0n) {
510
+ throw new Error('runtime error: integer divide by zero')
511
+ }
512
+ return uint64Result(uint64Value(left) % divisor)
513
+ }
514
+
515
+ export function int64Mod(
516
+ left: number | bigint,
517
+ right: number | bigint,
518
+ ): number {
519
+ const divisor = int64Value(right)
520
+ if (divisor === 0n) {
521
+ throw new Error('runtime error: integer divide by zero')
522
+ }
523
+ return int64Result(int64Value(left) % divisor)
524
+ }
525
+
526
+ export function uint64Add(
527
+ left: number | bigint,
528
+ right: number | bigint,
529
+ ): number {
530
+ return uint64Result(uint64Value(left) + uint64Value(right))
531
+ }
532
+
533
+ export function int64Add(
534
+ left: number | bigint,
535
+ right: number | bigint,
536
+ ): number {
537
+ return int64Result(int64Value(left) + int64Value(right))
538
+ }
539
+
540
+ export function uint64Sub(
541
+ left: number | bigint,
542
+ right: number | bigint,
543
+ ): number {
544
+ return uint64Result(uint64Value(left) - uint64Value(right))
545
+ }
546
+
547
+ export function int64Sub(
548
+ left: number | bigint,
549
+ right: number | bigint,
550
+ ): number {
551
+ return int64Result(int64Value(left) - int64Value(right))
552
+ }
553
+
554
+ export function uint64And(
555
+ left: number | bigint,
556
+ right: number | bigint,
557
+ ): number {
558
+ return uint64Result(uint64Value(left) & uint64Value(right))
559
+ }
560
+
561
+ export function int64And(
562
+ left: number | bigint,
563
+ right: number | bigint,
564
+ ): number {
565
+ return int64Result(int64Value(left) & int64Value(right))
566
+ }
567
+
568
+ export function uint64Or(
569
+ left: number | bigint,
570
+ right: number | bigint,
571
+ ): number {
572
+ return uint64Result(uint64Value(left) | uint64Value(right))
573
+ }
574
+
575
+ export function int64Or(
576
+ left: number | bigint,
577
+ right: number | bigint,
578
+ ): number {
579
+ return int64Result(int64Value(left) | int64Value(right))
580
+ }
581
+
582
+ export function uint64Xor(
583
+ left: number | bigint,
584
+ right: number | bigint,
585
+ ): number {
586
+ return uint64Result(uint64Value(left) ^ uint64Value(right))
587
+ }
588
+
589
+ export function int64Xor(
590
+ left: number | bigint,
591
+ right: number | bigint,
592
+ ): number {
593
+ return int64Result(int64Value(left) ^ int64Value(right))
594
+ }
595
+
596
+ function int64Value(value: number | bigint): bigint {
597
+ if (typeof value === 'bigint') {
598
+ return BigInt.asIntN(64, value)
599
+ }
600
+ if (Number.isFinite(value)) {
601
+ const truncated = Math.trunc(value)
602
+ if (
603
+ truncated >= Number.MIN_SAFE_INTEGER &&
604
+ truncated <= Number.MAX_SAFE_INTEGER
605
+ ) {
606
+ return BigInt(truncated)
607
+ }
608
+ }
609
+ return BigInt.asIntN(64, BigInt(Math.trunc(value)))
610
+ }
611
+
612
+ function int64Result(value: bigint): number {
613
+ const normalized =
614
+ value >= -0x8000000000000000n && value <= 0x7fffffffffffffffn
615
+ ? value
616
+ : BigInt.asIntN(64, value)
617
+ return Number(normalized)
618
+ }
619
+
620
+ function uint64Value(value: number | bigint): bigint {
621
+ if (typeof value === 'bigint') {
622
+ return BigInt.asUintN(64, value)
623
+ }
624
+ if (Number.isFinite(value)) {
625
+ const truncated = Math.trunc(value)
626
+ if (truncated >= 0 && truncated <= Number.MAX_SAFE_INTEGER) {
627
+ return BigInt(truncated)
628
+ }
629
+ }
630
+ return BigInt.asUintN(64, BigInt(Math.trunc(value)))
631
+ }
632
+
633
+ function uint64Result(value: bigint): number {
634
+ const normalized =
635
+ value >= 0n && value <= maxUint64BigInt ? value : BigInt.asUintN(64, value)
636
+ if (normalized <= maxSafeBigInt) {
637
+ return Number(normalized)
638
+ }
639
+ return normalized as unknown as number
640
+ }
641
+
118
642
  /**
119
643
  * Normalizes various byte representations into a `Uint8Array` for protobuf compatibility.
120
644
  *
@@ -196,18 +720,15 @@ export function sortSlice<T extends string | number>(s: Slice<T>): void {
196
720
  * Optimized for different byte representations.
197
721
  */
198
722
  export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
199
- // Handle null cases
200
723
  if (a === null && b === null) return true
201
724
  if (a === null || b === null) return false
202
725
 
203
- // Convert to arrays for comparison
204
- const aArr = bytesToArray(a)
205
- const bArr = bytesToArray(b)
206
-
207
- if (aArr.length !== bArr.length) return false
726
+ const aLen = bytesLen(a)
727
+ const bLen = bytesLen(b)
728
+ if (aLen !== bLen) return false
208
729
 
209
- for (let i = 0; i < aArr.length; i++) {
210
- if (aArr[i] !== bArr[i]) return false
730
+ for (let i = 0; i < aLen; i++) {
731
+ if (byteAt(a, i) !== byteAt(b, i)) return false
211
732
  }
212
733
 
213
734
  return true
@@ -218,47 +739,65 @@ export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
218
739
  * Returns -1 if a < b, 0 if a == b, +1 if a > b.
219
740
  */
220
741
  export function bytesCompare(a: Bytes | null, b: Bytes | null): number {
221
- // Handle null cases
222
742
  if (a === null && b === null) return 0
223
743
  if (a === null) return -1
224
744
  if (b === null) return 1
225
745
 
226
- const aArr = bytesToArray(a)
227
- const bArr = bytesToArray(b)
228
-
229
- const minLen = Math.min(aArr.length, bArr.length)
746
+ const aLen = bytesLen(a)
747
+ const bLen = bytesLen(b)
748
+ const minLen = Math.min(aLen, bLen)
230
749
 
231
750
  for (let i = 0; i < minLen; i++) {
232
- if (aArr[i] < bArr[i]) return -1
233
- if (aArr[i] > bArr[i]) return 1
751
+ const av = byteAt(a, i)
752
+ const bv = byteAt(b, i)
753
+ if (av < bv) return -1
754
+ if (av > bv) return 1
234
755
  }
235
756
 
236
- if (aArr.length < bArr.length) return -1
237
- if (aArr.length > bArr.length) return 1
757
+ if (aLen < bLen) return -1
758
+ if (aLen > bLen) return 1
238
759
  return 0
239
760
  }
240
761
 
762
+ function bytesLen(bytes: ByteData): number {
763
+ if (bytes instanceof Uint8Array) {
764
+ return bytes.length
765
+ }
766
+ if (isSliceProxy(bytes)) {
767
+ return (bytes as SliceProxy<number>).__meta__.length
768
+ }
769
+ return bytes.length
770
+ }
771
+
772
+ function byteAt(bytes: ByteData, index: number): number {
773
+ if (bytes instanceof Uint8Array || Array.isArray(bytes)) {
774
+ return bytes[index] ?? 0
775
+ }
776
+ const meta = (bytes as SliceProxy<number>).__meta__
777
+ return meta.backing[meta.offset + index] ?? 0
778
+ }
779
+
241
780
  /**
242
781
  * bytesToArray converts any Bytes representation to a number array.
243
782
  */
244
783
  export function bytesToArray(bytes: Bytes | null): number[] {
784
+ bytes = bytesValue(bytes) as Bytes | null
245
785
  if (bytes === null) return []
246
786
 
247
787
  if (bytes instanceof Uint8Array) {
248
788
  return Array.from(bytes)
249
789
  }
250
790
 
251
- if (Array.isArray(bytes)) {
252
- return bytes
253
- }
254
-
255
- // Handle SliceProxy
256
791
  if (isSliceProxy(bytes)) {
257
792
  const proxy = bytes as SliceProxy<number>
258
793
  const meta = proxy.__meta__
259
794
  return meta.backing.slice(meta.offset, meta.offset + meta.length)
260
795
  }
261
796
 
797
+ if (Array.isArray(bytes)) {
798
+ return bytes
799
+ }
800
+
262
801
  throw new Error(`Cannot convert bytes of type ${typeof bytes} to array`)
263
802
  }
264
803
 
@@ -266,15 +805,34 @@ export function bytesToArray(bytes: Bytes | null): number[] {
266
805
  * bytesToUint8Array converts any Bytes representation to a Uint8Array.
267
806
  */
268
807
  export function bytesToUint8Array(bytes: Bytes | null): Uint8Array {
808
+ bytes = bytesValue(bytes) as Bytes | null
269
809
  if (bytes === null) return new Uint8Array(0)
270
810
 
271
811
  if (bytes instanceof Uint8Array) {
812
+ if ((bytes as Uint8Array & { __meta__?: unknown }).__meta__ !== undefined) {
813
+ return bytes.subarray(0)
814
+ }
272
815
  return bytes
273
816
  }
274
817
 
275
818
  return new Uint8Array(bytesToArray(bytes))
276
819
  }
277
820
 
821
+ function bytesValue(value: unknown): unknown {
822
+ if (isVarRef(value)) {
823
+ return bytesValue(value.value)
824
+ }
825
+ if (
826
+ typeof value === 'object' &&
827
+ value !== null &&
828
+ typeof (value as { __goType?: unknown }).__goType === 'string' &&
829
+ '__goValue' in value
830
+ ) {
831
+ return bytesValue((value as { __goValue: unknown }).__goValue)
832
+ }
833
+ return value
834
+ }
835
+
278
836
  /**
279
837
  * bytesIndexOf finds the first occurrence of subslice in bytes.
280
838
  * Returns -1 if not found.