goscript 0.1.1 → 0.1.3

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 (376) hide show
  1. package/cmd/goscript/cmd-test.go +104 -11
  2. package/cmd/goscript/cmd-test_test.go +1 -1
  3. package/cmd/goscript/cmd_compile.go +9 -0
  4. package/compiler/compile-request.go +31 -0
  5. package/compiler/compiler.go +1 -1
  6. package/compiler/compliance_test.go +0 -2
  7. package/compiler/config.go +2 -0
  8. package/compiler/gotest/package-result.go +2 -0
  9. package/compiler/gotest/request.go +85 -20
  10. package/compiler/gotest/runner.go +733 -96
  11. package/compiler/gotest/runner_test.go +647 -3
  12. package/compiler/lowered-program.go +10 -2
  13. package/compiler/lowering.go +2676 -349
  14. package/compiler/override-facts.go +77 -27
  15. package/compiler/override-registry.go +5 -4
  16. package/compiler/override-registry_test.go +178 -0
  17. package/compiler/package-graph_test.go +62 -7
  18. package/compiler/package-test-graph-variant.go +40 -16
  19. package/compiler/package-test-graph.go +0 -5
  20. package/compiler/package-test-graph_test.go +61 -3
  21. package/compiler/runtime-contract.go +40 -0
  22. package/compiler/semantic-model-types.go +16 -0
  23. package/compiler/semantic-model.go +336 -91
  24. package/compiler/semantic-model_test.go +50 -1
  25. package/compiler/service.go +9 -3
  26. package/compiler/skeleton_test.go +2371 -296
  27. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  28. package/compiler/tsworkspace/owner.go +8 -0
  29. package/compiler/tsworkspace/tool-process-other.go +14 -0
  30. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  31. package/compiler/typescript-emitter.go +149 -10
  32. package/dist/gs/builtin/builtin.d.ts +20 -1
  33. package/dist/gs/builtin/builtin.js +246 -26
  34. package/dist/gs/builtin/builtin.js.map +1 -1
  35. package/dist/gs/builtin/channel.d.ts +24 -10
  36. package/dist/gs/builtin/channel.js +143 -34
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/defer.d.ts +1 -0
  39. package/dist/gs/builtin/defer.js +12 -2
  40. package/dist/gs/builtin/defer.js.map +1 -1
  41. package/dist/gs/builtin/hostio.d.ts +9 -0
  42. package/dist/gs/builtin/hostio.js +25 -0
  43. package/dist/gs/builtin/hostio.js.map +1 -1
  44. package/dist/gs/builtin/map.js +40 -6
  45. package/dist/gs/builtin/map.js.map +1 -1
  46. package/dist/gs/builtin/print.js.map +1 -1
  47. package/dist/gs/builtin/slice.d.ts +43 -9
  48. package/dist/gs/builtin/slice.js +437 -234
  49. package/dist/gs/builtin/slice.js.map +1 -1
  50. package/dist/gs/builtin/type.d.ts +2 -0
  51. package/dist/gs/builtin/type.js +55 -10
  52. package/dist/gs/builtin/type.js.map +1 -1
  53. package/dist/gs/builtin/varRef.d.ts +2 -0
  54. package/dist/gs/builtin/varRef.js.map +1 -1
  55. package/dist/gs/bytes/buffer.gs.js +28 -28
  56. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  57. package/dist/gs/bytes/bytes.gs.d.ts +7 -5
  58. package/dist/gs/bytes/bytes.gs.js +10 -4
  59. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  60. package/dist/gs/bytes/iter.gs.js +13 -13
  61. package/dist/gs/bytes/iter.gs.js.map +1 -1
  62. package/dist/gs/compress/zlib/index.d.ts +26 -0
  63. package/dist/gs/compress/zlib/index.js +168 -0
  64. package/dist/gs/compress/zlib/index.js.map +1 -0
  65. package/dist/gs/context/context.d.ts +1 -1
  66. package/dist/gs/context/context.js +8 -3
  67. package/dist/gs/context/context.js.map +1 -1
  68. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  69. package/dist/gs/crypto/ecdh/index.js +226 -0
  70. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  71. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  72. package/dist/gs/crypto/ed25519/index.js +160 -0
  73. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  74. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  75. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  76. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  77. package/dist/gs/crypto/rand/index.d.ts +2 -0
  78. package/dist/gs/crypto/rand/index.js +85 -0
  79. package/dist/gs/crypto/rand/index.js.map +1 -1
  80. package/dist/gs/crypto/sha1/index.d.ts +5 -0
  81. package/dist/gs/crypto/sha1/index.js +106 -0
  82. package/dist/gs/crypto/sha1/index.js.map +1 -0
  83. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  84. package/dist/gs/crypto/sha256/index.js +118 -0
  85. package/dist/gs/crypto/sha256/index.js.map +1 -0
  86. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  87. package/dist/gs/crypto/sha512/index.js +129 -0
  88. package/dist/gs/crypto/sha512/index.js.map +1 -0
  89. package/dist/gs/encoding/json/index.d.ts +3 -0
  90. package/dist/gs/encoding/json/index.js +15 -0
  91. package/dist/gs/encoding/json/index.js.map +1 -1
  92. package/dist/gs/errors/errors.js +29 -6
  93. package/dist/gs/errors/errors.js.map +1 -1
  94. package/dist/gs/fmt/fmt.d.ts +1 -1
  95. package/dist/gs/fmt/fmt.js +64 -3
  96. package/dist/gs/fmt/fmt.js.map +1 -1
  97. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
  98. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
  99. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  100. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
  101. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  102. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
  103. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
  104. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  105. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  106. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  107. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  108. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  109. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  110. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  111. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  112. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
  113. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
  114. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  115. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  116. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  117. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  118. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  119. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  120. package/dist/gs/go/token/index.js +11 -4
  121. package/dist/gs/go/token/index.js.map +1 -1
  122. package/dist/gs/hash/fnv/index.d.ts +57 -0
  123. package/dist/gs/hash/fnv/index.js +299 -0
  124. package/dist/gs/hash/fnv/index.js.map +1 -0
  125. package/dist/gs/hash/index.d.ts +17 -0
  126. package/dist/gs/hash/index.js +94 -0
  127. package/dist/gs/hash/index.js.map +1 -0
  128. package/dist/gs/io/fs/readlink.js +2 -6
  129. package/dist/gs/io/fs/readlink.js.map +1 -1
  130. package/dist/gs/io/fs/walk.js.map +1 -1
  131. package/dist/gs/io/io.d.ts +8 -5
  132. package/dist/gs/io/io.js +20 -2
  133. package/dist/gs/io/io.js.map +1 -1
  134. package/dist/gs/iter/iter.d.ts +3 -2
  135. package/dist/gs/iter/iter.js.map +1 -1
  136. package/dist/gs/maps/iter.d.ts +5 -5
  137. package/dist/gs/maps/iter.js +48 -21
  138. package/dist/gs/maps/iter.js.map +1 -1
  139. package/dist/gs/maps/maps.d.ts +6 -6
  140. package/dist/gs/math/bits/index.js +14 -24
  141. package/dist/gs/math/bits/index.js.map +1 -1
  142. package/dist/gs/mime/index.js +3 -1
  143. package/dist/gs/mime/index.js.map +1 -1
  144. package/dist/gs/net/http/httptest/index.d.ts +20 -1
  145. package/dist/gs/net/http/httptest/index.js +85 -3
  146. package/dist/gs/net/http/httptest/index.js.map +1 -1
  147. package/dist/gs/net/http/index.d.ts +118 -6
  148. package/dist/gs/net/http/index.js +389 -14
  149. package/dist/gs/net/http/index.js.map +1 -1
  150. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  151. package/dist/gs/net/http/pprof/index.js +59 -0
  152. package/dist/gs/net/http/pprof/index.js.map +1 -0
  153. package/dist/gs/os/error.gs.js +9 -7
  154. package/dist/gs/os/error.gs.js.map +1 -1
  155. package/dist/gs/os/types_js.gs.js +95 -15
  156. package/dist/gs/os/types_js.gs.js.map +1 -1
  157. package/dist/gs/os/zero_copy_posix.gs.js +1 -1
  158. package/dist/gs/os/zero_copy_posix.gs.js.map +1 -1
  159. package/dist/gs/path/filepath/match.js.map +1 -1
  160. package/dist/gs/path/filepath/path.d.ts +5 -3
  161. package/dist/gs/path/filepath/path.js +65 -10
  162. package/dist/gs/path/filepath/path.js.map +1 -1
  163. package/dist/gs/reflect/index.d.ts +3 -2
  164. package/dist/gs/reflect/index.js +2 -1
  165. package/dist/gs/reflect/index.js.map +1 -1
  166. package/dist/gs/reflect/iter.js +2 -2
  167. package/dist/gs/reflect/iter.js.map +1 -1
  168. package/dist/gs/reflect/map.js +26 -0
  169. package/dist/gs/reflect/map.js.map +1 -1
  170. package/dist/gs/reflect/type.d.ts +24 -5
  171. package/dist/gs/reflect/type.js +390 -38
  172. package/dist/gs/reflect/type.js.map +1 -1
  173. package/dist/gs/reflect/types.d.ts +1 -0
  174. package/dist/gs/reflect/types.js +3 -1
  175. package/dist/gs/reflect/types.js.map +1 -1
  176. package/dist/gs/reflect/value.d.ts +4 -1
  177. package/dist/gs/reflect/value.js +39 -1
  178. package/dist/gs/reflect/value.js.map +1 -1
  179. package/dist/gs/reflect/visiblefields.js +1 -1
  180. package/dist/gs/reflect/visiblefields.js.map +1 -1
  181. package/dist/gs/runtime/debug/index.d.ts +39 -0
  182. package/dist/gs/runtime/debug/index.js +58 -0
  183. package/dist/gs/runtime/debug/index.js.map +1 -1
  184. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  185. package/dist/gs/runtime/pprof/index.js +85 -0
  186. package/dist/gs/runtime/pprof/index.js.map +1 -0
  187. package/dist/gs/runtime/trace/index.d.ts +19 -0
  188. package/dist/gs/runtime/trace/index.js +64 -0
  189. package/dist/gs/runtime/trace/index.js.map +1 -0
  190. package/dist/gs/slices/slices.d.ts +24 -9
  191. package/dist/gs/slices/slices.js +229 -24
  192. package/dist/gs/slices/slices.js.map +1 -1
  193. package/dist/gs/sort/slice.gs.d.ts +5 -3
  194. package/dist/gs/sort/slice.gs.js +55 -17
  195. package/dist/gs/sort/slice.gs.js.map +1 -1
  196. package/dist/gs/strings/builder.js +26 -17
  197. package/dist/gs/strings/builder.js.map +1 -1
  198. package/dist/gs/strings/iter.js +140 -75
  199. package/dist/gs/strings/iter.js.map +1 -1
  200. package/dist/gs/strings/replace.js +2 -2
  201. package/dist/gs/strings/replace.js.map +1 -1
  202. package/dist/gs/strings/strings.js +52 -6
  203. package/dist/gs/strings/strings.js.map +1 -1
  204. package/dist/gs/sync/sync.d.ts +6 -3
  205. package/dist/gs/sync/sync.js +39 -11
  206. package/dist/gs/sync/sync.js.map +1 -1
  207. package/dist/gs/syscall/errors.d.ts +116 -112
  208. package/dist/gs/syscall/errors.js +38 -1
  209. package/dist/gs/syscall/errors.js.map +1 -1
  210. package/dist/gs/syscall/fs.d.ts +2 -8
  211. package/dist/gs/syscall/fs.js.map +1 -1
  212. package/dist/gs/syscall/js/index.js +20 -12
  213. package/dist/gs/syscall/js/index.js.map +1 -1
  214. package/dist/gs/syscall/types.d.ts +4 -1
  215. package/dist/gs/syscall/types.js.map +1 -1
  216. package/dist/gs/testing/testing.d.ts +4 -3
  217. package/dist/gs/testing/testing.js +21 -4
  218. package/dist/gs/testing/testing.js.map +1 -1
  219. package/dist/gs/time/time.js +22 -0
  220. package/dist/gs/time/time.js.map +1 -1
  221. package/dist/gs/unicode/unicode.js.map +1 -1
  222. package/dist/gs/unique/index.js +7 -2
  223. package/dist/gs/unique/index.js.map +1 -1
  224. package/go.mod +8 -8
  225. package/go.sum +14 -23
  226. package/gs/builtin/builtin.ts +364 -37
  227. package/gs/builtin/channel.ts +208 -38
  228. package/gs/builtin/defer.ts +13 -2
  229. package/gs/builtin/hostio.test.ts +1 -0
  230. package/gs/builtin/hostio.ts +38 -0
  231. package/gs/builtin/map.ts +46 -6
  232. package/gs/builtin/print.ts +12 -3
  233. package/gs/builtin/runtime-contract.test.ts +290 -10
  234. package/gs/builtin/slice.test.ts +70 -0
  235. package/gs/builtin/slice.ts +566 -255
  236. package/gs/builtin/type.ts +63 -10
  237. package/gs/builtin/varRef.ts +2 -0
  238. package/gs/bytes/buffer.gs.ts +28 -28
  239. package/gs/bytes/bytes.gs.ts +19 -10
  240. package/gs/bytes/bytes.test.ts +17 -0
  241. package/gs/bytes/iter.gs.ts +13 -14
  242. package/gs/compress/zlib/index.test.ts +28 -0
  243. package/gs/compress/zlib/index.ts +200 -0
  244. package/gs/compress/zlib/meta.json +3 -0
  245. package/gs/context/context.test.ts +36 -2
  246. package/gs/context/context.ts +9 -4
  247. package/gs/crypto/ecdh/index.test.ts +43 -0
  248. package/gs/crypto/ecdh/index.ts +274 -0
  249. package/gs/crypto/ed25519/index.test.ts +41 -0
  250. package/gs/crypto/ed25519/index.ts +238 -0
  251. package/gs/crypto/ed25519/meta.json +13 -0
  252. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  253. package/gs/crypto/internal/constanttime/index.ts +22 -0
  254. package/gs/crypto/rand/index.test.ts +89 -1
  255. package/gs/crypto/rand/index.ts +103 -1
  256. package/gs/crypto/rand/meta.json +4 -1
  257. package/gs/crypto/sha1/index.test.ts +28 -0
  258. package/gs/crypto/sha1/index.ts +130 -0
  259. package/gs/crypto/sha1/meta.json +8 -0
  260. package/gs/crypto/sha256/index.test.ts +78 -0
  261. package/gs/crypto/sha256/index.ts +150 -0
  262. package/gs/crypto/sha256/meta.json +9 -0
  263. package/gs/crypto/sha512/index.test.ts +31 -0
  264. package/gs/crypto/sha512/index.ts +161 -0
  265. package/gs/crypto/sha512/meta.json +11 -0
  266. package/gs/encoding/json/index.test.ts +25 -3
  267. package/gs/encoding/json/index.ts +21 -3
  268. package/gs/errors/errors.test.ts +4 -1
  269. package/gs/errors/errors.ts +32 -8
  270. package/gs/fmt/fmt.test.ts +23 -1
  271. package/gs/fmt/fmt.ts +76 -10
  272. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
  273. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
  274. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
  275. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
  276. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  277. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
  278. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
  279. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  280. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  281. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  282. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  283. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  284. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  285. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  286. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
  287. package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
  288. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  289. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  290. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  291. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  292. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  293. package/gs/go/token/index.ts +17 -4
  294. package/gs/hash/fnv/index.test.ts +67 -0
  295. package/gs/hash/fnv/index.ts +351 -0
  296. package/gs/hash/fnv/meta.json +3 -0
  297. package/gs/hash/index.test.ts +37 -0
  298. package/gs/hash/index.ts +118 -0
  299. package/gs/hash/meta.json +5 -0
  300. package/gs/internal/byteorder/index.test.ts +6 -6
  301. package/gs/io/fs/readlink.ts +40 -48
  302. package/gs/io/fs/walk.ts +10 -2
  303. package/gs/io/io.test.ts +64 -0
  304. package/gs/io/io.ts +34 -13
  305. package/gs/iter/iter.ts +8 -2
  306. package/gs/maps/iter.ts +69 -26
  307. package/gs/maps/maps.test.ts +23 -0
  308. package/gs/maps/maps.ts +6 -6
  309. package/gs/math/bits/index.test.ts +20 -0
  310. package/gs/math/bits/index.ts +15 -28
  311. package/gs/mime/index.ts +8 -2
  312. package/gs/net/http/httptest/index.test.ts +85 -0
  313. package/gs/net/http/httptest/index.ts +113 -3
  314. package/gs/net/http/index.test.ts +159 -1
  315. package/gs/net/http/index.ts +515 -15
  316. package/gs/net/http/meta.json +6 -0
  317. package/gs/net/http/pprof/index.test.ts +47 -0
  318. package/gs/net/http/pprof/index.ts +65 -0
  319. package/gs/os/error.gs.ts +9 -10
  320. package/gs/os/error.test.ts +41 -0
  321. package/gs/os/file_unix_js.test.ts +55 -0
  322. package/gs/os/tempfile.gs.test.ts +37 -10
  323. package/gs/os/types_js.gs.ts +94 -15
  324. package/gs/os/zero_copy_posix.gs.ts +1 -2
  325. package/gs/path/filepath/match.ts +4 -1
  326. package/gs/path/filepath/meta.json +6 -0
  327. package/gs/path/filepath/path.test.ts +57 -2
  328. package/gs/path/filepath/path.ts +91 -12
  329. package/gs/reflect/field.test.ts +63 -0
  330. package/gs/reflect/index.ts +4 -1
  331. package/gs/reflect/iter.ts +2 -2
  332. package/gs/reflect/map.test.ts +24 -2
  333. package/gs/reflect/map.ts +35 -0
  334. package/gs/reflect/type.ts +543 -60
  335. package/gs/reflect/typefor.test.ts +100 -0
  336. package/gs/reflect/types.ts +3 -1
  337. package/gs/reflect/value.ts +50 -1
  338. package/gs/reflect/visiblefields.ts +1 -1
  339. package/gs/runtime/debug/index.test.ts +22 -1
  340. package/gs/runtime/debug/index.ts +88 -0
  341. package/gs/runtime/pprof/index.test.ts +36 -0
  342. package/gs/runtime/pprof/index.ts +104 -0
  343. package/gs/runtime/pprof/meta.json +6 -0
  344. package/gs/runtime/trace/index.test.ts +45 -0
  345. package/gs/runtime/trace/index.ts +97 -0
  346. package/gs/runtime/trace/meta.json +7 -0
  347. package/gs/slices/meta.json +2 -1
  348. package/gs/slices/slices.test.ts +86 -0
  349. package/gs/slices/slices.ts +284 -37
  350. package/gs/sort/slice.gs.ts +73 -23
  351. package/gs/sort/slice.test.ts +40 -0
  352. package/gs/strings/builder.test.ts +8 -0
  353. package/gs/strings/builder.ts +29 -17
  354. package/gs/strings/iter.test.ts +5 -7
  355. package/gs/strings/iter.ts +146 -71
  356. package/gs/strings/replace.test.ts +1 -4
  357. package/gs/strings/replace.ts +6 -6
  358. package/gs/strings/strings.test.ts +4 -0
  359. package/gs/strings/strings.ts +54 -6
  360. package/gs/sync/meta.json +1 -0
  361. package/gs/sync/sync.test.ts +57 -1
  362. package/gs/sync/sync.ts +45 -13
  363. package/gs/syscall/errors.ts +158 -115
  364. package/gs/syscall/fs.ts +8 -8
  365. package/gs/syscall/js/index.ts +49 -22
  366. package/gs/syscall/net.test.ts +26 -0
  367. package/gs/syscall/types.ts +7 -2
  368. package/gs/testing/testing.test.ts +56 -0
  369. package/gs/testing/testing.ts +27 -10
  370. package/gs/time/meta.json +2 -2
  371. package/gs/time/time.test.ts +4 -0
  372. package/gs/time/time.ts +33 -2
  373. package/gs/unicode/unicode.test.ts +14 -3
  374. package/gs/unicode/unicode.ts +1 -5
  375. package/gs/unique/index.ts +9 -2
  376. package/package.json +3 -3
@@ -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
  /**
@@ -121,6 +150,46 @@ export function pointerValue<T>(value: T | VarRef<T> | null | undefined): T {
121
150
  if (isVarRef(value)) {
122
151
  return value.value as T
123
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
+ }
124
193
  return value
125
194
  }
126
195
 
@@ -128,7 +197,7 @@ export function arrayEqual(a: unknown, b: unknown): boolean {
128
197
  return comparableEqual(a, b)
129
198
  }
130
199
 
131
- function comparableEqual(a: unknown, b: unknown): boolean {
200
+ export function comparableEqual(a: unknown, b: unknown): boolean {
132
201
  if (a === b) {
133
202
  return true
134
203
  }
@@ -146,6 +215,14 @@ function comparableEqual(a: unknown, b: unknown): boolean {
146
215
  }
147
216
  return true
148
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
+ }
149
226
  if (hasGoType(a) || hasGoType(b)) {
150
227
  if (!hasGoType(a) || !hasGoType(b) || a.__goType !== b.__goType) {
151
228
  return false
@@ -153,6 +230,9 @@ function comparableEqual(a: unknown, b: unknown): boolean {
153
230
  if (a.__isTypedNil || b.__isTypedNil) {
154
231
  return a.__isTypedNil === true && b.__isTypedNil === true
155
232
  }
233
+ if (hasGoValue(a) || hasGoValue(b)) {
234
+ return hasGoValue(a) && hasGoValue(b) && comparableEqual(a.__goValue, b.__goValue)
235
+ }
156
236
  }
157
237
  if (isStructValue(a) && isStructValue(b)) {
158
238
  return fieldsEqual(a._fields, b._fields)
@@ -175,14 +255,39 @@ function hasGoType(value: unknown): value is {
175
255
  )
176
256
  }
177
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
+
178
279
  function isStructValue(value: unknown): value is {
179
280
  _fields: Record<string, VarRef<unknown>>
180
281
  } {
282
+ const fields =
283
+ typeof value === 'object' && value !== null ?
284
+ (value as { _fields?: unknown })._fields
285
+ : undefined
181
286
  return (
182
- typeof value === 'object' &&
183
- value !== null &&
184
- typeof (value as { _fields?: unknown })._fields === 'object' &&
185
- (value as { _fields?: unknown })._fields !== null
287
+ typeof fields === 'object' &&
288
+ fields !== null &&
289
+ !Array.isArray(fields) &&
290
+ Object.values(fields).every(isVarRef)
186
291
  )
187
292
  }
188
293
 
@@ -208,6 +313,15 @@ export interface Complex {
208
313
  imag: number
209
314
  }
210
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
+
211
325
  export function complex(real: number, imag: number): Complex {
212
326
  return { real, imag }
213
327
  }
@@ -229,6 +343,10 @@ export function imag(value: number | Complex | null | undefined): number {
229
343
  // Bytes represents all valid []byte representations in TypeScript
230
344
  // This includes Uint8Array (the preferred representation) and $.Slice<number> (which includes null)
231
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
232
350
 
233
351
  // int converts a value to a Go int type, handling proper signed integer conversion
234
352
  // This ensures that values like 2147483648 (2^31) are properly handled according to Go semantics
@@ -272,15 +390,30 @@ export function uint(value: number | bigint, bits = 64): number {
272
390
  if (typeof value === 'bigint') {
273
391
  const normalized = BigInt.asUintN(Math.min(bits, 64), value)
274
392
  if (bits >= 64) {
275
- return normalized as unknown as number
393
+ return uint64Result(normalized)
276
394
  }
277
395
  return Number(normalized)
278
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
+ }
279
415
  const modulo = bits >= 64 ? 2 ** 64 : 2 ** bits
280
416
  let truncated = Math.trunc(value)
281
- if (!Number.isFinite(truncated)) {
282
- return truncated
283
- }
284
417
  truncated %= modulo
285
418
  if (truncated < 0) {
286
419
  truncated += modulo
@@ -288,14 +421,34 @@ export function uint(value: number | bigint, bits = 64): number {
288
421
  return truncated
289
422
  }
290
423
 
291
- export function uint64Shl(value: number | bigint, shift: number | bigint): number {
424
+ export function uint64Shl(
425
+ value: number | bigint,
426
+ shift: number | bigint,
427
+ ): number {
292
428
  return uint64Result(uint64Value(value) << BigInt(Math.trunc(Number(shift))))
293
429
  }
294
430
 
295
- export function uint64Shr(value: number | bigint, shift: number | bigint): number {
431
+ export function uint64Shr(
432
+ value: number | bigint,
433
+ shift: number | bigint,
434
+ ): number {
296
435
  return uint64Result(uint64Value(value) >> BigInt(Math.trunc(Number(shift))))
297
436
  }
298
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
+
299
452
  export function uintShr(
300
453
  value: number | bigint,
301
454
  shift: number | bigint,
@@ -312,39 +465,178 @@ export function uintShr(
312
465
  return uint(value, width) >>> amount
313
466
  }
314
467
 
315
- export function uint64Mul(left: number | bigint, right: number | bigint): number {
468
+ export function uint64Mul(
469
+ left: number | bigint,
470
+ right: number | bigint,
471
+ ): number {
316
472
  return uint64Result(uint64Value(left) * uint64Value(right))
317
473
  }
318
474
 
319
- export function uint64Add(left: number | bigint, right: number | bigint): number {
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 {
320
530
  return uint64Result(uint64Value(left) + uint64Value(right))
321
531
  }
322
532
 
323
- export function uint64Sub(left: number | bigint, right: number | bigint): number {
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 {
324
544
  return uint64Result(uint64Value(left) - uint64Value(right))
325
545
  }
326
546
 
327
- export function uint64And(left: number | bigint, right: number | bigint): number {
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 {
328
558
  return uint64Result(uint64Value(left) & uint64Value(right))
329
559
  }
330
560
 
331
- export function uint64Or(left: number | bigint, right: number | bigint): number {
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 {
332
572
  return uint64Result(uint64Value(left) | uint64Value(right))
333
573
  }
334
574
 
335
- export function uint64Xor(left: number | bigint, right: number | bigint): number {
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 {
336
586
  return uint64Result(uint64Value(left) ^ uint64Value(right))
337
587
  }
338
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
+
339
620
  function uint64Value(value: number | bigint): bigint {
340
621
  if (typeof value === 'bigint') {
341
622
  return BigInt.asUintN(64, value)
342
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
+ }
343
630
  return BigInt.asUintN(64, BigInt(Math.trunc(value)))
344
631
  }
345
632
 
346
633
  function uint64Result(value: bigint): number {
347
- return BigInt.asUintN(64, value) as unknown as 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
348
640
  }
349
641
 
350
642
  /**
@@ -428,18 +720,15 @@ export function sortSlice<T extends string | number>(s: Slice<T>): void {
428
720
  * Optimized for different byte representations.
429
721
  */
430
722
  export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
431
- // Handle null cases
432
723
  if (a === null && b === null) return true
433
724
  if (a === null || b === null) return false
434
725
 
435
- // Convert to arrays for comparison
436
- const aArr = bytesToArray(a)
437
- const bArr = bytesToArray(b)
438
-
439
- if (aArr.length !== bArr.length) return false
726
+ const aLen = bytesLen(a)
727
+ const bLen = bytesLen(b)
728
+ if (aLen !== bLen) return false
440
729
 
441
- for (let i = 0; i < aArr.length; i++) {
442
- 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
443
732
  }
444
733
 
445
734
  return true
@@ -450,30 +739,49 @@ export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
450
739
  * Returns -1 if a < b, 0 if a == b, +1 if a > b.
451
740
  */
452
741
  export function bytesCompare(a: Bytes | null, b: Bytes | null): number {
453
- // Handle null cases
454
742
  if (a === null && b === null) return 0
455
743
  if (a === null) return -1
456
744
  if (b === null) return 1
457
745
 
458
- const aArr = bytesToArray(a)
459
- const bArr = bytesToArray(b)
460
-
461
- 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)
462
749
 
463
750
  for (let i = 0; i < minLen; i++) {
464
- if (aArr[i] < bArr[i]) return -1
465
- 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
466
755
  }
467
756
 
468
- if (aArr.length < bArr.length) return -1
469
- if (aArr.length > bArr.length) return 1
757
+ if (aLen < bLen) return -1
758
+ if (aLen > bLen) return 1
470
759
  return 0
471
760
  }
472
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
+
473
780
  /**
474
781
  * bytesToArray converts any Bytes representation to a number array.
475
782
  */
476
783
  export function bytesToArray(bytes: Bytes | null): number[] {
784
+ bytes = bytesValue(bytes) as Bytes | null
477
785
  if (bytes === null) return []
478
786
 
479
787
  if (bytes instanceof Uint8Array) {
@@ -497,15 +805,34 @@ export function bytesToArray(bytes: Bytes | null): number[] {
497
805
  * bytesToUint8Array converts any Bytes representation to a Uint8Array.
498
806
  */
499
807
  export function bytesToUint8Array(bytes: Bytes | null): Uint8Array {
808
+ bytes = bytesValue(bytes) as Bytes | null
500
809
  if (bytes === null) return new Uint8Array(0)
501
810
 
502
811
  if (bytes instanceof Uint8Array) {
812
+ if ((bytes as Uint8Array & { __meta__?: unknown }).__meta__ !== undefined) {
813
+ return bytes.subarray(0)
814
+ }
503
815
  return bytes
504
816
  }
505
817
 
506
818
  return new Uint8Array(bytesToArray(bytes))
507
819
  }
508
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
+
509
836
  /**
510
837
  * bytesIndexOf finds the first occurrence of subslice in bytes.
511
838
  * Returns -1 if not found.