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
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'
2
2
 
3
3
  import * as $ from '@goscript/builtin/index.js'
4
4
 
5
- import { Marshal, Unmarshal } from './index.js'
5
+ import { Marshal, MarshalIndent, Unmarshal, type Unmarshaler } from './index.js'
6
6
 
7
7
  class Person {
8
8
  public _fields = {
@@ -17,14 +17,36 @@ class Person {
17
17
  [],
18
18
  Person,
19
19
  {
20
- Name: { type: { kind: $.TypeKind.Basic, name: 'string' }, tag: 'json:"name"' },
20
+ Name: {
21
+ type: { kind: $.TypeKind.Basic, name: 'string' },
22
+ tag: 'json:"name"',
23
+ },
21
24
  Age: { type: { kind: $.TypeKind.Basic, name: 'int' }, tag: 'json:"age"' },
22
- Active: { type: { kind: $.TypeKind.Basic, name: 'bool' }, tag: 'json:"active"' },
25
+ Active: {
26
+ type: { kind: $.TypeKind.Basic, name: 'bool' },
27
+ tag: 'json:"active"',
28
+ },
23
29
  },
24
30
  )
25
31
  }
26
32
 
27
33
  describe('encoding/json override', () => {
34
+ it('registers the Unmarshaler interface shape', () => {
35
+ class CustomUnmarshaler implements Unmarshaler {
36
+ UnmarshalJSON(_data: $.Slice<number>): $.GoError {
37
+ return null
38
+ }
39
+ }
40
+
41
+ const [value, ok] = $.typeAssertTuple<Unmarshaler>(
42
+ new CustomUnmarshaler(),
43
+ 'json.Unmarshaler',
44
+ )
45
+
46
+ expect(ok).toBe(true)
47
+ expect(value.UnmarshalJSON($.stringToBytes('{}'))).toBeNull()
48
+ })
49
+
28
50
  it('marshals struct fields through json tags', () => {
29
51
  const person = new Person()
30
52
  person._fields.Name.value = 'Alice'
@@ -39,6 +61,20 @@ describe('encoding/json override', () => {
39
61
  )
40
62
  })
41
63
 
64
+ it('marshals indented JSON with a line prefix', () => {
65
+ const person = new Person()
66
+ person._fields.Name.value = 'Alice'
67
+ person._fields.Age.value = 30
68
+ person._fields.Active.value = true
69
+
70
+ const [data, err] = MarshalIndent(person, '> ', ' ')
71
+
72
+ expect(err).toBeNull()
73
+ expect($.bytesToString(data)).toBe(
74
+ '{\n> "name": "Alice",\n> "age": 30,\n> "active": true\n> }',
75
+ )
76
+ })
77
+
42
78
  it('unmarshals into struct and map pointers', () => {
43
79
  const person = $.varRef(new Person())
44
80
  const personErr = Unmarshal(
@@ -1,5 +1,25 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
2
 
3
+ export interface Unmarshaler {
4
+ UnmarshalJSON(data: $.Slice<number>): $.GoError
5
+ }
6
+
7
+ $.registerInterfaceType('json.Unmarshaler', null, [
8
+ {
9
+ name: 'UnmarshalJSON',
10
+ args: [
11
+ {
12
+ name: 'data',
13
+ type: {
14
+ kind: $.TypeKind.Slice,
15
+ elemType: { kind: $.TypeKind.Basic, name: 'uint8' },
16
+ },
17
+ },
18
+ ],
19
+ returns: [{ type: 'GoError' }],
20
+ },
21
+ ])
22
+
3
23
  export function Marshal(v: unknown): [$.Slice<number>, $.GoError] {
4
24
  try {
5
25
  return [$.stringToBytes(JSON.stringify(marshalValue(v))), null]
@@ -8,6 +28,30 @@ export function Marshal(v: unknown): [$.Slice<number>, $.GoError] {
8
28
  }
9
29
  }
10
30
 
31
+ export function MarshalIndent(
32
+ v: unknown,
33
+ prefix: string,
34
+ indent: string,
35
+ ): [$.Slice<number>, $.GoError] {
36
+ try {
37
+ const text = JSON.stringify(marshalValue(v), null, indent)
38
+ if (prefix === '') {
39
+ return [$.stringToBytes(text), null]
40
+ }
41
+ return [
42
+ $.stringToBytes(
43
+ text
44
+ .split('\n')
45
+ .map((line, idx) => (idx === 0 ? line : prefix + line))
46
+ .join('\n'),
47
+ ),
48
+ null,
49
+ ]
50
+ } catch (err) {
51
+ return [null, goError(err)]
52
+ }
53
+ }
54
+
11
55
  export function Unmarshal(data: $.Slice<number>, v: unknown): $.GoError {
12
56
  try {
13
57
  assignDecodedValue(v, JSON.parse($.bytesToString(data)))
@@ -123,9 +167,7 @@ function isPlainObject(value: unknown): value is Record<string, unknown> {
123
167
  )
124
168
  }
125
169
 
126
- function structFieldMetadata(
127
- value: unknown,
128
- ): Record<string, { tag?: string }> {
170
+ function structFieldMetadata(value: unknown): Record<string, { tag?: string }> {
129
171
  if (value === null || typeof value !== 'object') {
130
172
  return {}
131
173
  }
@@ -0,0 +1,85 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as $ from '@goscript/builtin/index.js'
4
+
5
+ import { AsType, Errorf, Is, Join, Wrap, Wrapf } from './errors.js'
6
+
7
+ class DNSError {
8
+ public readonly IsNotFound = true
9
+
10
+ public Error(): string {
11
+ return 'dns'
12
+ }
13
+ }
14
+
15
+ class Wrapper {
16
+ constructor(private readonly err: $.GoError) {}
17
+
18
+ public Error(): string {
19
+ return 'wrapped'
20
+ }
21
+
22
+ public Unwrap(): $.GoError {
23
+ return this.err
24
+ }
25
+ }
26
+
27
+ const dnsTypeArgs: $.GenericTypeArgs = {
28
+ E: {
29
+ type: { kind: $.TypeKind.Pointer, elemType: 'net.DNSError' },
30
+ zero: () => null,
31
+ },
32
+ }
33
+
34
+ describe('errors.AsType', () => {
35
+ it('returns a directly matching error', () => {
36
+ const dns = $.interfaceValue<$.GoError>(new DNSError(), '*net.DNSError')
37
+
38
+ const [matched, ok] = AsType(dnsTypeArgs, dns)
39
+
40
+ expect(ok).toBe(true)
41
+ expect(matched).toBe(dns)
42
+ })
43
+
44
+ it('walks wrapped errors depth first', () => {
45
+ const dns = $.interfaceValue<$.GoError>(new DNSError(), '*net.DNSError')
46
+ const wrapped = $.interfaceValue<$.GoError>(
47
+ new Wrapper(dns),
48
+ '*main.Wrapper',
49
+ )
50
+
51
+ const [matched, ok] = AsType(dnsTypeArgs, Join(null, wrapped))
52
+
53
+ expect(ok).toBe(true)
54
+ expect(matched).toBe(dns)
55
+ })
56
+
57
+ it('returns zero when no error matches', () => {
58
+ const [matched, ok] = AsType(dnsTypeArgs, $.newError('plain'))
59
+
60
+ expect(ok).toBe(false)
61
+ expect(matched).toBe(null)
62
+ })
63
+ })
64
+
65
+ describe('errors github.com/pkg/errors compatibility helpers', () => {
66
+ it('formats new errors', () => {
67
+ expect(Errorf('bad %s: %d', 'value', 42)?.Error()).toBe('bad value: 42')
68
+ })
69
+
70
+ it('wraps and unwraps errors', () => {
71
+ const base = $.newError('root')
72
+ const wrapped = Wrap(base, 'context')
73
+
74
+ expect(wrapped?.Error()).toBe('context: root')
75
+ expect(Is(wrapped, base)).toBe(true)
76
+ })
77
+
78
+ it('wraps formatted context and preserves nil', () => {
79
+ const base = $.newError('root')
80
+
81
+ expect(Wrapf(base, 'context %d', 7)?.Error()).toBe('context 7: root')
82
+ expect(Wrap(null, 'context')).toBe(null)
83
+ expect(Wrapf(null, 'context %d', 7)).toBe(null)
84
+ })
85
+ })
@@ -6,6 +6,57 @@ export function New(text: string): $.GoError {
6
6
  return $.newError(text)
7
7
  }
8
8
 
9
+ export function Errorf(format: string, ...args: any[]): $.GoError {
10
+ return New(formatText(format, args))
11
+ }
12
+
13
+ export function Wrap(err: $.GoError, message: string): $.GoError {
14
+ if (err === null) {
15
+ return null
16
+ }
17
+ return wrapError(err, message)
18
+ }
19
+
20
+ export function Wrapf(
21
+ err: $.GoError,
22
+ format: string,
23
+ ...args: any[]
24
+ ): $.GoError {
25
+ if (err === null) {
26
+ return null
27
+ }
28
+ return wrapError(err, formatText(format, args))
29
+ }
30
+
31
+ function wrapError(err: Exclude<$.GoError, null>, message: string): $.GoError {
32
+ const wrapped = $.newError(`${message}: ${err.Error()}`)
33
+ ;(wrapped as any).Unwrap = function (): $.GoError {
34
+ return err
35
+ }
36
+ return wrapped
37
+ }
38
+
39
+ function formatText(format: string, args: any[]): string {
40
+ let argIndex = 0
41
+ return format.replace(/%[sdqv%]/g, (match) => {
42
+ if (match === '%%') {
43
+ return '%'
44
+ }
45
+ if (argIndex >= args.length) {
46
+ return match
47
+ }
48
+ const arg = args[argIndex++]
49
+ switch (match) {
50
+ case '%d':
51
+ return String(Number(arg))
52
+ case '%q':
53
+ return JSON.stringify(String(arg))
54
+ default:
55
+ return String(arg)
56
+ }
57
+ })
58
+ }
59
+
9
60
  // ErrUnsupported indicates that a requested operation cannot be performed,
10
61
  // because it is unsupported. For example, a call to os.Link when using a
11
62
  // file system that does not support hard links.
@@ -140,10 +191,7 @@ export function As(err: $.GoError, target: any): boolean {
140
191
  throw new Error('errors: target cannot be nil')
141
192
  }
142
193
 
143
- // Check if err matches target type
144
- if (err.constructor === target.constructor) {
145
- // Copy properties from err to target
146
- Object.assign(target, err)
194
+ if (assignAsTarget(err, target)) {
147
195
  return true
148
196
  }
149
197
 
@@ -179,6 +227,86 @@ export function As(err: $.GoError, target: any): boolean {
179
227
  return false
180
228
  }
181
229
 
230
+ function assignAsTarget(err: Exclude<$.GoError, null>, target: any): boolean {
231
+ const targetType = asTargetType(target)
232
+ if (targetType !== undefined) {
233
+ const [matched, ok] = $.typeAssertTuple<any>(err, targetType)
234
+ if (!ok) {
235
+ return false
236
+ }
237
+ if ($.isVarRef(target)) {
238
+ target.value = matched
239
+ return true
240
+ }
241
+ Object.assign(target, matched)
242
+ return true
243
+ }
244
+
245
+ if (err.constructor === target.constructor) {
246
+ Object.assign(target, err)
247
+ return true
248
+ }
249
+ return false
250
+ }
251
+
252
+ function asTargetType(target: any): string | undefined {
253
+ const goType = target?.__goType
254
+ if (typeof goType !== 'string' || !goType.startsWith('*')) {
255
+ return undefined
256
+ }
257
+ return goType.slice(1)
258
+ }
259
+
260
+ // AsType finds the first error in err's tree that matches the generic error
261
+ // type E, returning the matching error and true. Otherwise it returns E's zero
262
+ // value and false.
263
+ export function AsType(
264
+ typeArgs: $.GenericTypeArgs | undefined,
265
+ err: $.GoError,
266
+ ): [any, boolean] {
267
+ const descriptor = typeArgs?.E
268
+ const zero = (): any => descriptor?.zero?.() ?? null
269
+ if (err === null || descriptor?.type === undefined) {
270
+ return [zero(), false]
271
+ }
272
+ return asType(err, descriptor.type, zero)
273
+ }
274
+
275
+ function asType(
276
+ err: $.GoError,
277
+ typeInfo: $.TypeInfo | string,
278
+ zero: () => any,
279
+ ): [any, boolean] {
280
+ if (err === null) {
281
+ return [zero(), false]
282
+ }
283
+
284
+ const [asserted, ok] = $.typeAssertTuple<any>(err, typeInfo)
285
+ if (ok) {
286
+ return [asserted, true]
287
+ }
288
+
289
+ if (typeof (err as any).Unwrap === 'function') {
290
+ const result = (err as any).Unwrap()
291
+ if (Array.isArray(result)) {
292
+ for (const wrappedErr of result) {
293
+ if (wrappedErr && typeof wrappedErr.Error === 'function') {
294
+ const [matched, matchedOK] = asType(wrappedErr, typeInfo, zero)
295
+ if (matchedOK) {
296
+ return [matched, true]
297
+ }
298
+ }
299
+ }
300
+ return [zero(), false]
301
+ }
302
+ if (result && typeof result.Error === 'function') {
303
+ return asType(result, typeInfo, zero)
304
+ }
305
+ }
306
+
307
+ return [zero(), false]
308
+ }
309
+
182
310
  // Join returns an error that wraps the given errors.
183
311
  // Any nil error values are discarded.
184
312
  // Join returns nil if every value in errs is nil.
@@ -36,7 +36,9 @@ function captureStdout(run: () => void): string {
36
36
  length?: number,
37
37
  _position?: number | null,
38
38
  ) => {
39
- buf += new TextDecoder().decode(chunk.subarray(0, length ?? chunk.length))
39
+ buf += new TextDecoder().decode(
40
+ chunk.subarray(0, length ?? chunk.length),
41
+ )
40
42
  return length ?? chunk.length
41
43
  },
42
44
  ),
package/gs/fmt/fmt.ts CHANGED
@@ -22,7 +22,7 @@ export interface State {
22
22
  Flag(c: number): boolean
23
23
  Precision(): [number, boolean]
24
24
  Width(): [number, boolean]
25
- Write(b: Uint8Array): [number, $.GoError | null]
25
+ Write(b: $.Bytes): [number, $.GoError | null]
26
26
  }
27
27
 
28
28
  // Simple printf-style formatting implementation
@@ -199,7 +199,11 @@ function parseFormat(format: string, args: any[]): string {
199
199
  const verb = format[j]
200
200
 
201
201
  if (argIndex < args.length) {
202
- let formatted = formatValue(args[argIndex], verb)
202
+ const arg = args[argIndex]
203
+ let formatted = formatWithState(arg, verb, flags, width, precision)
204
+ if (formatted === null) {
205
+ formatted = formatValue(arg, verb)
206
+ }
203
207
 
204
208
  // Apply width and precision formatting
205
209
  if (width && !precision) {
@@ -217,7 +221,7 @@ function parseFormat(format: string, args: any[]): string {
217
221
  (verb === 'f' || verb === 'e' || verb === 'g')
218
222
  ) {
219
223
  const p = parseInt(precision)
220
- const num = Number(args[argIndex])
224
+ const num = Number(arg)
221
225
  if (verb === 'f') {
222
226
  formatted = num.toFixed(p)
223
227
  } else if (verb === 'e') {
@@ -257,6 +261,39 @@ function parseFormat(format: string, args: any[]): string {
257
261
  return result
258
262
  }
259
263
 
264
+ function formatWithState(
265
+ value: any,
266
+ verb: string,
267
+ flags: string,
268
+ width: string,
269
+ precision: string,
270
+ ): string | null {
271
+ if (!value || typeof value.Format !== 'function') {
272
+ return null
273
+ }
274
+
275
+ let out = ''
276
+ const state: State = {
277
+ Flag(c: number): boolean {
278
+ return flags.includes(String.fromCharCode(c))
279
+ },
280
+ Precision(): [number, boolean] {
281
+ return precision === '' ? [0, false] : [parseInt(precision), true]
282
+ },
283
+ Width(): [number, boolean] {
284
+ return width === '' ? [0, false] : [parseInt(width), true]
285
+ },
286
+ Write(b: $.Bytes): [number, $.GoError | null] {
287
+ const text = $.bytesToString(b)
288
+ out += text
289
+ return [text.length, null]
290
+ },
291
+ }
292
+
293
+ value.Format(state, verb.codePointAt(0) ?? 0)
294
+ return out
295
+ }
296
+
260
297
  // Global stdout simulation for Print functions
261
298
  let stdout = {
262
299
  write: (data: string) => {
@@ -361,34 +398,33 @@ export function Fprintln(w: any, ...a: any[]): [number, $.GoError | null] {
361
398
  }
362
399
 
363
400
  // Append functions (append to byte slice)
364
- export function Append(b: Uint8Array, ...a: any[]): Uint8Array {
401
+ export function Append(b: $.Bytes, ...a: any[]): $.Bytes {
365
402
  const result = a.map(defaultFormat).join(' ')
366
403
  const encoded = new TextEncoder().encode(result)
367
- const newArray = new Uint8Array(b.length + encoded.length)
368
- newArray.set(b)
369
- newArray.set(encoded, b.length)
404
+ const base = $.bytesToUint8Array(b)
405
+ const newArray = new Uint8Array(base.length + encoded.length)
406
+ newArray.set(base)
407
+ newArray.set(encoded, base.length)
370
408
  return newArray
371
409
  }
372
410
 
373
- export function Appendf(
374
- b: Uint8Array,
375
- format: string,
376
- ...a: any[]
377
- ): Uint8Array {
411
+ export function Appendf(b: $.Bytes, format: string, ...a: any[]): $.Bytes {
378
412
  const result = parseFormat(format, a)
379
413
  const encoded = new TextEncoder().encode(result)
380
- const newArray = new Uint8Array(b.length + encoded.length)
381
- newArray.set(b)
382
- newArray.set(encoded, b.length)
414
+ const base = $.bytesToUint8Array(b)
415
+ const newArray = new Uint8Array(base.length + encoded.length)
416
+ newArray.set(base)
417
+ newArray.set(encoded, base.length)
383
418
  return newArray
384
419
  }
385
420
 
386
- export function Appendln(b: Uint8Array, ...a: any[]): Uint8Array {
421
+ export function Appendln(b: $.Bytes, ...a: any[]): $.Bytes {
387
422
  const result = a.map(defaultFormat).join(' ') + '\n'
388
423
  const encoded = new TextEncoder().encode(result)
389
- const newArray = new Uint8Array(b.length + encoded.length)
390
- newArray.set(b)
391
- newArray.set(encoded, b.length)
424
+ const base = $.bytesToUint8Array(b)
425
+ const newArray = new Uint8Array(base.length + encoded.length)
426
+ newArray.set(base)
427
+ newArray.set(encoded, base.length)
392
428
  return newArray
393
429
  }
394
430
 
@@ -1,6 +1,25 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import { CompareEqualVT } from './index.js'
3
+ import * as $ from '../../../builtin/index.js'
4
+ import {
5
+ AppendVarint,
6
+ type CloneMessage,
7
+ CompareEqualVT,
8
+ ConsumeVarint,
9
+ DecodeFixed32,
10
+ DecodeFixed64,
11
+ DecodeVarint,
12
+ DecodeVarintInt32,
13
+ DecodeVarintInt64,
14
+ DecodeVarintUint32,
15
+ EncodeVarint,
16
+ ErrIntOverflow,
17
+ ErrInvalidLength,
18
+ ErrUnexpectedEndOfGroup,
19
+ IsEqualVTSlice,
20
+ SizeOfVarint,
21
+ Skip,
22
+ } from './index.js'
4
23
 
5
24
  class TestValue {
6
25
  constructor(private readonly value: string) {}
@@ -10,6 +29,30 @@ class TestValue {
10
29
  }
11
30
  }
12
31
 
32
+ class TestCloneMessage implements CloneMessage {
33
+ SizeVT(): number {
34
+ return 0
35
+ }
36
+
37
+ MarshalToSizedBufferVT(): [$.Slice<number>, $.GoError] {
38
+ return [null, null]
39
+ }
40
+
41
+ MarshalVT(): [$.Slice<number>, $.GoError] {
42
+ return [null, null]
43
+ }
44
+
45
+ UnmarshalVT(): $.GoError {
46
+ return null
47
+ }
48
+
49
+ Reset(): void {}
50
+
51
+ CloneMessageVT(): CloneMessage | null {
52
+ return new TestCloneMessage()
53
+ }
54
+ }
55
+
13
56
  describe('protobuf-go-lite EqualVT helpers', () => {
14
57
  it('accepts compiler-emitted runtime type arguments', () => {
15
58
  const equal = CompareEqualVT<TestValue>({
@@ -20,4 +63,88 @@ describe('protobuf-go-lite EqualVT helpers', () => {
20
63
  expect(equal(new TestValue('a'), new TestValue('b'))).toBe(false)
21
64
  expect(equal(null, null)).toBe(true)
22
65
  })
66
+
67
+ it('accepts nullable generated message slices', () => {
68
+ const left: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
69
+ $.varRef(new TestValue('x')),
70
+ null,
71
+ ]
72
+ const right: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
73
+ new TestValue('x'),
74
+ null,
75
+ ]
76
+
77
+ expect(IsEqualVTSlice(left, right)).toBe(true)
78
+ })
79
+ })
80
+
81
+ describe('protobuf-go-lite runtime interfaces', () => {
82
+ it('registers CloneMessage metadata for Go type assertions', () => {
83
+ const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
84
+ new TestCloneMessage(),
85
+ 'protobuf_go_lite.CloneMessage',
86
+ )
87
+
88
+ expect(ok).toBe(true)
89
+ expect(value?.CloneMessageVT()).toBeInstanceOf(TestCloneMessage)
90
+ })
91
+ })
92
+
93
+ describe('protobuf-go-lite wire helpers', () => {
94
+ it('encodes and decodes varints', () => {
95
+ const buf = new Uint8Array(4)
96
+
97
+ const offset = EncodeVarint(buf, 4, 300)
98
+
99
+ expect(offset).toBe(2)
100
+ expect(Array.from(buf.slice(offset))).toEqual([0xac, 0x02])
101
+ expect(SizeOfVarint(300)).toBe(2)
102
+ expect(DecodeVarint(buf, offset)).toEqual([300, 4, null])
103
+ expect(DecodeVarintInt32(buf, offset)).toEqual([300, 4, null])
104
+ expect(DecodeVarintInt64(buf, offset)).toEqual([300, 4, null])
105
+ expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
106
+ expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
107
+ expect(SizeOfVarint(0xffffffffffffffffn)).toBe(10)
108
+ expect(Array.from(AppendVarint([], 0xffffffffffffffffn) as number[])).toEqual([
109
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
110
+ ])
111
+ expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
112
+ 0xffffffffffffffffn,
113
+ 10,
114
+ ])
115
+ })
116
+
117
+ it('decodes fixed64 values', () => {
118
+ expect(DecodeFixed32(new Uint8Array([0x44, 0x33, 0x22, 0x11]), 0)).toEqual([
119
+ 0x11223344,
120
+ 4,
121
+ null,
122
+ ])
123
+
124
+ expect(
125
+ DecodeFixed64(
126
+ new Uint8Array([0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11]),
127
+ 0,
128
+ ),
129
+ ).toEqual([0x1122334455667800, 8, null])
130
+
131
+ const [, , err] = DecodeFixed64(new Uint8Array([1, 2, 3]), 0)
132
+ expect(err?.Error()).toBe('unexpected EOF')
133
+ })
134
+
135
+ it('skips protobuf records', () => {
136
+ expect(Skip(new Uint8Array([0x08, 0x96, 0x01]))).toEqual([3, null])
137
+ expect(Skip(new Uint8Array([0x12, 0x03, 0x61, 0x62, 0x63]))).toEqual([
138
+ 5,
139
+ null,
140
+ ])
141
+ expect(Skip(new Uint8Array([0x0c]))).toEqual([0, ErrUnexpectedEndOfGroup])
142
+ })
143
+
144
+ it('reports protobuf wire errors as Go errors', () => {
145
+ expect(ErrInvalidLength?.Error()).toContain('negative length')
146
+ expect(ErrIntOverflow?.Error()).toContain('integer overflow')
147
+ const [, eof] = Skip(new Uint8Array([0x08, 0x80]))
148
+ expect(eof?.Error()).toBe('unexpected EOF')
149
+ })
23
150
  })