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
package/gs/fmt/fmt.ts CHANGED
@@ -408,11 +408,7 @@ export function Append(b: $.Bytes, ...a: any[]): $.Bytes {
408
408
  return newArray
409
409
  }
410
410
 
411
- export function Appendf(
412
- b: $.Bytes,
413
- format: string,
414
- ...a: any[]
415
- ): $.Bytes {
411
+ export function Appendf(b: $.Bytes, format: string, ...a: any[]): $.Bytes {
416
412
  const result = parseFormat(format, a)
417
413
  const encoded = new TextEncoder().encode(result)
418
414
  const base = $.bytesToUint8Array(b)
@@ -492,12 +488,82 @@ export function Sscan(_str: string, ..._a: any[]): [number, $.GoError | null] {
492
488
  }
493
489
 
494
490
  export function Sscanf(
495
- _str: string,
496
- _format: string,
497
- ..._a: any[]
491
+ str: string,
492
+ format: string,
493
+ ...a: any[]
498
494
  ): [number, $.GoError | null] {
499
- // TODO: Implement formatted scanning from string
500
- return [0, $.newError('Sscanf not implemented')]
495
+ const parts = buildScanPattern(format)
496
+ if (parts == null) {
497
+ return [0, $.newError(`unsupported Sscanf format: ${format}`)]
498
+ }
499
+ const match = parts.pattern.exec(str)
500
+ if (match == null) {
501
+ return [0, $.newError('input does not match format')]
502
+ }
503
+
504
+ let assigned = 0
505
+ for (let i = 0; i < parts.verbs.length && i < a.length; i++) {
506
+ const raw = match[i + 1]
507
+ const value = parts.verbs[i] === 'd' ? Number.parseInt(raw, 10) : raw
508
+ if (!assignScanValue(a[i], value)) {
509
+ return [assigned, $.newError('scan destination is not assignable')]
510
+ }
511
+ assigned++
512
+ }
513
+ return [assigned, null]
514
+ }
515
+
516
+ function buildScanPattern(
517
+ format: string,
518
+ ): { pattern: RegExp; verbs: string[] } | null {
519
+ let source = '^'
520
+ const verbs: string[] = []
521
+ for (let i = 0; i < format.length; i++) {
522
+ const ch = format[i]
523
+ if (ch !== '%') {
524
+ source += /\s/.test(ch) ? '\\s+' : escapeRegExp(ch)
525
+ continue
526
+ }
527
+ const verb = format[++i]
528
+ if (verb === '%') {
529
+ source += '%'
530
+ continue
531
+ }
532
+ if (verb === 'd') {
533
+ source += '([+-]?\\d+)'
534
+ verbs.push(verb)
535
+ continue
536
+ }
537
+ if (verb === 's') {
538
+ source += '(\\S+)'
539
+ verbs.push(verb)
540
+ continue
541
+ }
542
+ return null
543
+ }
544
+ source += '$'
545
+ return { pattern: new RegExp(source), verbs }
546
+ }
547
+
548
+ function assignScanValue(target: any, value: string | number): boolean {
549
+ const ref =
550
+ $.isVarRef(target) ? target
551
+ : (
552
+ target != null &&
553
+ typeof target === 'object' &&
554
+ $.isVarRef(target.__goValue)
555
+ ) ?
556
+ target.__goValue
557
+ : null
558
+ if (ref == null) {
559
+ return false
560
+ }
561
+ ref.value = value
562
+ return true
563
+ }
564
+
565
+ function escapeRegExp(ch: string): string {
566
+ return ch.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
501
567
  }
502
568
 
503
569
  export function Sscanln(
@@ -1,8 +1,11 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
+ import * as $ from '../../../builtin/index.js'
3
4
  import {
4
5
  AppendVarint,
6
+ type CloneMessage,
5
7
  CompareEqualVT,
8
+ ConsumeVarint,
6
9
  DecodeFixed32,
7
10
  DecodeFixed64,
8
11
  DecodeVarint,
@@ -13,6 +16,7 @@ import {
13
16
  ErrIntOverflow,
14
17
  ErrInvalidLength,
15
18
  ErrUnexpectedEndOfGroup,
19
+ IsEqualVTSlice,
16
20
  SizeOfVarint,
17
21
  Skip,
18
22
  } from './index.js'
@@ -25,6 +29,30 @@ class TestValue {
25
29
  }
26
30
  }
27
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
+
28
56
  describe('protobuf-go-lite EqualVT helpers', () => {
29
57
  it('accepts compiler-emitted runtime type arguments', () => {
30
58
  const equal = CompareEqualVT<TestValue>({
@@ -35,6 +63,31 @@ describe('protobuf-go-lite EqualVT helpers', () => {
35
63
  expect(equal(new TestValue('a'), new TestValue('b'))).toBe(false)
36
64
  expect(equal(null, null)).toBe(true)
37
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
+ })
38
91
  })
39
92
 
40
93
  describe('protobuf-go-lite wire helpers', () => {
@@ -50,9 +103,14 @@ describe('protobuf-go-lite wire helpers', () => {
50
103
  expect(DecodeVarintInt32(buf, offset)).toEqual([300, 4, null])
51
104
  expect(DecodeVarintInt64(buf, offset)).toEqual([300, 4, null])
52
105
  expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
53
- expect(Array.from(AppendVarint([], 300) as number[])).toEqual([
54
- 0xac,
55
- 0x02,
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,
56
114
  ])
57
115
  })
58
116
 
@@ -80,10 +138,7 @@ describe('protobuf-go-lite wire helpers', () => {
80
138
  5,
81
139
  null,
82
140
  ])
83
- expect(Skip(new Uint8Array([0x0c]))).toEqual([
84
- 0,
85
- ErrUnexpectedEndOfGroup,
86
- ])
141
+ expect(Skip(new Uint8Array([0x0c]))).toEqual([0, ErrUnexpectedEndOfGroup])
87
142
  })
88
143
 
89
144
  it('reports protobuf wire errors as Go errors', () => {
@@ -16,15 +16,37 @@ export interface Message {
16
16
  Reset(): void
17
17
  }
18
18
 
19
+ $.registerInterfaceType('protobuf_go_lite.Message', null, [
20
+ { name: 'SizeVT', args: [], returns: [] },
21
+ { name: 'MarshalToSizedBufferVT', args: [], returns: [] },
22
+ { name: 'MarshalVT', args: [], returns: [] },
23
+ { name: 'UnmarshalVT', args: [], returns: [] },
24
+ { name: 'Reset', args: [], returns: [] },
25
+ ])
26
+
19
27
  export interface JSONMessage {
20
28
  MarshalJSON(): [$.Slice<number>, $.GoError]
21
29
  UnmarshalJSON(data: $.Slice<number>): $.GoError
22
30
  }
23
31
 
32
+ $.registerInterfaceType('protobuf_go_lite.JSONMessage', null, [
33
+ { name: 'MarshalJSON', args: [], returns: [] },
34
+ { name: 'UnmarshalJSON', args: [], returns: [] },
35
+ ])
36
+
24
37
  export interface CloneMessage extends Message {
25
38
  CloneMessageVT(): CloneMessage | null
26
39
  }
27
40
 
41
+ $.registerInterfaceType('protobuf_go_lite.CloneMessage', null, [
42
+ { name: 'SizeVT', args: [], returns: [] },
43
+ { name: 'MarshalToSizedBufferVT', args: [], returns: [] },
44
+ { name: 'MarshalVT', args: [], returns: [] },
45
+ { name: 'UnmarshalVT', args: [], returns: [] },
46
+ { name: 'Reset', args: [], returns: [] },
47
+ { name: 'CloneMessageVT', args: [], returns: [] },
48
+ ])
49
+
28
50
  export interface CloneVT<T> extends CloneMessage {
29
51
  CloneVT(): T
30
52
  }
@@ -37,37 +59,37 @@ export function CompareComparable<T>(): (t1: T, t2: T) => boolean {
37
59
  return (t1, t2) => t1 === t2
38
60
  }
39
61
 
40
- export function IsEqualVT<T extends EqualVT<T>>(
41
- t1: T | null,
42
- t2: T | null,
62
+ export function IsEqualVT<T>(
63
+ t1: T | $.VarRef<T> | null,
64
+ t2: T | $.VarRef<T> | null,
43
65
  ): boolean
44
- export function IsEqualVT<T extends EqualVT<T>>(
66
+ export function IsEqualVT<T>(
45
67
  _typeArgs: unknown,
46
- t1: T | null,
47
- t2: T | null,
68
+ t1: T | $.VarRef<T> | null,
69
+ t2: T | $.VarRef<T> | null,
48
70
  ): boolean
49
- export function IsEqualVT<T extends EqualVT<T>>(
71
+ export function IsEqualVT<T>(
50
72
  arg0: unknown,
51
- arg1: T | null,
52
- arg2?: T | null,
73
+ arg1: T | $.VarRef<T> | null,
74
+ arg2?: T | $.VarRef<T> | null,
53
75
  ): boolean {
54
- const t1 = arg2 === undefined ? (arg0 as T | null) : arg1
55
- const t2 = arg2 === undefined ? arg1 : arg2
76
+ const t1 = $.pointerValueOrNil(arg2 === undefined ? (arg0 as T | $.VarRef<T> | null) : arg1)
77
+ const t2 = $.pointerValueOrNil(arg2 === undefined ? arg1 : arg2)
56
78
  if (t1 == null || t2 == null) {
57
79
  return t1 == t2
58
80
  }
59
- return t1.EqualVT(t2)
81
+ return (t1 as unknown as EqualVT<T>).EqualVT(t2)
60
82
  }
61
83
 
62
- export function CompareEqualVT<T extends EqualVT<T>>(
84
+ export function CompareEqualVT<T>(
63
85
  _typeArgs?: unknown,
64
- ): (t1: T | null, t2: T | null) => boolean {
86
+ ): (t1: T | $.VarRef<T> | null, t2: T | $.VarRef<T> | null) => boolean {
65
87
  return (t1, t2) => IsEqualVT(t1, t2)
66
88
  }
67
89
 
68
- export function IsEqualVTSlice<T extends EqualVT<T>>(
69
- s1: $.Slice<T>,
70
- s2: $.Slice<T>,
90
+ export function IsEqualVTSlice<T>(
91
+ s1: $.Slice<T | $.VarRef<T> | null>,
92
+ s2: $.Slice<T | $.VarRef<T> | null>,
71
93
  ): boolean {
72
94
  if ($.len(s1) !== $.len(s2)) {
73
95
  return false
@@ -83,58 +105,78 @@ export function IsEqualVTSlice<T extends EqualVT<T>>(
83
105
  export function EncodeVarint(
84
106
  dAtA: $.Slice<number>,
85
107
  offset: number,
86
- v: number,
108
+ v: number | bigint,
87
109
  ): number {
88
110
  offset -= SizeOfVarint(v)
89
111
  const base = offset
90
- while (v >= 0x80) {
91
- setByte(dAtA, offset, (v % 0x80) | 0x80)
92
- v = Math.floor(v / 0x80)
112
+ let value = normalizedVarint(v)
113
+ while (value >= 0x80n) {
114
+ setByte(dAtA, offset, Number((value & 0x7fn) | 0x80n))
115
+ value >>= 7n
93
116
  offset++
94
117
  }
95
- setByte(dAtA, offset, v)
118
+ setByte(dAtA, offset, Number(value))
96
119
  return base
97
120
  }
98
121
 
99
- export function AppendVarint(b: $.Slice<number>, v: number): $.Slice<number> {
122
+ export function AppendVarint(
123
+ b: $.Slice<number>,
124
+ v: number | bigint,
125
+ ): $.Slice<number> {
100
126
  const bytes: number[] = []
101
- while (v >= 0x80) {
102
- bytes.push((v % 0x80) | 0x80)
103
- v = Math.floor(v / 0x80)
127
+ let value = normalizedVarint(v)
128
+ while (value >= 0x80n) {
129
+ bytes.push(Number((value & 0x7fn) | 0x80n))
130
+ value >>= 7n
104
131
  }
105
- bytes.push(v)
132
+ bytes.push(Number(value))
106
133
  return $.append(b, ...bytes)
107
134
  }
108
135
 
109
136
  export function ConsumeVarint(b: $.Slice<number>): [number, number] {
110
- let v = 0
111
- let shift = 0
137
+ let v = 0n
138
+ let shift = 0n
112
139
  for (let i = 0; i < 10; i++) {
113
140
  if (i >= $.len(b)) {
114
141
  return [0, -1]
115
142
  }
116
143
  const value = byteSliceValue(b, i)
117
- if (shift === 63 && value > 1) {
144
+ if (shift === 63n && value > 1) {
118
145
  return [0, -2]
119
146
  }
120
- v += (value & 0x7f) * 2 ** shift
147
+ v += BigInt(value & 0x7f) << shift
121
148
  if (value < 0x80) {
122
- return [v, i + 1]
149
+ return [varintResult(v), i + 1]
123
150
  }
124
- shift += 7
151
+ shift += 7n
125
152
  }
126
153
  return [0, -2]
127
154
  }
128
155
 
129
- export function SizeOfVarint(x: number): number {
156
+ export function SizeOfVarint(x: number | bigint): number {
157
+ let value = normalizedVarint(x)
130
158
  let n = 1
131
- while (x >= 0x80) {
132
- x = Math.floor(x / 0x80)
159
+ while (value >= 0x80n) {
160
+ value >>= 7n
133
161
  n++
134
162
  }
135
163
  return n
136
164
  }
137
165
 
166
+ function normalizedVarint(value: number | bigint): bigint {
167
+ if (typeof value === 'bigint') {
168
+ return BigInt.asUintN(64, value)
169
+ }
170
+ return BigInt.asUintN(64, BigInt(Math.trunc(value)))
171
+ }
172
+
173
+ function varintResult(value: bigint): number {
174
+ if (value <= BigInt(Number.MAX_SAFE_INTEGER)) {
175
+ return Number(value)
176
+ }
177
+ return value as unknown as number
178
+ }
179
+
138
180
  export function DecodeVarint(
139
181
  b: $.Slice<number>,
140
182
  idx: number,
@@ -78,10 +78,11 @@ describe('protobuf-go-lite/json override', () => {
78
78
  a: new TestMessage('one', 1),
79
79
  b: new TestMessage('two', 2),
80
80
  })
81
- const [sliceData, sliceErr] = MarshalSlice(undefined, DefaultMarshalerConfig, [
82
- new TestMessage('one', 1),
83
- new TestMessage('two', 2),
84
- ])
81
+ const [sliceData, sliceErr] = MarshalSlice(
82
+ undefined,
83
+ DefaultMarshalerConfig,
84
+ [new TestMessage('one', 1), new TestMessage('two', 2)],
85
+ )
85
86
 
86
87
  expect(mapErr).toBeNull()
87
88
  expect(sliceErr).toBeNull()
@@ -99,7 +100,10 @@ describe('protobuf-go-lite/json override', () => {
99
100
  jsonBytes('{"name":"ok","count":"42"}'),
100
101
  msg,
101
102
  )
102
- const state = NewUnmarshalState(jsonBytes('["Zm9vYg==","YXI="]'), DefaultUnmarshalerConfig)
103
+ const state = NewUnmarshalState(
104
+ jsonBytes('["Zm9vYg==","YXI="]'),
105
+ DefaultUnmarshalerConfig,
106
+ )
103
107
 
104
108
  expect(err).toBeNull()
105
109
  expect(msg).toEqual(new TestMessage('ok', 42))
@@ -120,7 +124,10 @@ describe('protobuf-go-lite/json override', () => {
120
124
 
121
125
  it('accepts raw wrapped values and object wrapped values', () => {
122
126
  const raw = NewUnmarshalState(jsonBytes('"abc"'), DefaultUnmarshalerConfig)
123
- const object = NewUnmarshalState(jsonBytes('{"value": "def"}'), DefaultUnmarshalerConfig)
127
+ const object = NewUnmarshalState(
128
+ jsonBytes('{"value": "def"}'),
129
+ DefaultUnmarshalerConfig,
130
+ )
124
131
 
125
132
  expect(raw?.ReadWrappedString()).toBe('abc')
126
133
  expect(raw?.Err()).toBeNull()
@@ -129,13 +136,18 @@ describe('protobuf-go-lite/json override', () => {
129
136
  })
130
137
 
131
138
  it('reads and writes protobuf timestamp values as time.Time pointers', () => {
132
- const state = NewUnmarshalState(jsonBytes('"2025-05-15T01:10:42Z"'), DefaultUnmarshalerConfig)
139
+ const state = NewUnmarshalState(
140
+ jsonBytes('"2025-05-15T01:10:42Z"'),
141
+ DefaultUnmarshalerConfig,
142
+ )
133
143
  const parsed = state?.ReadTime()
134
144
  const jsonStream = new JsonStream()
135
145
  const stream = new MarshalState({ stream: jsonStream })
136
146
 
137
147
  expect(state?.Err()).toBeNull()
138
- expect($.pointerValue(parsed)?.Format(time.RFC3339)).toBe('2025-05-15T01:10:42Z')
148
+ expect($.pointerValue(parsed)?.Format(time.RFC3339)).toBe(
149
+ '2025-05-15T01:10:42Z',
150
+ )
139
151
 
140
152
  stream.WriteTime(parsed ?? null)
141
153
 
@@ -144,9 +156,18 @@ describe('protobuf-go-lite/json override', () => {
144
156
  })
145
157
 
146
158
  it('rejects invalid bool and numeric map keys', () => {
147
- const boolState = NewUnmarshalState(jsonBytes('{"yes": 1}'), DefaultUnmarshalerConfig)
148
- const intState = NewUnmarshalState(jsonBytes('{"1.5": 1}'), DefaultUnmarshalerConfig)
149
- const uintState = NewUnmarshalState(jsonBytes('{"-1": 1}'), DefaultUnmarshalerConfig)
159
+ const boolState = NewUnmarshalState(
160
+ jsonBytes('{"yes": 1}'),
161
+ DefaultUnmarshalerConfig,
162
+ )
163
+ const intState = NewUnmarshalState(
164
+ jsonBytes('{"1.5": 1}'),
165
+ DefaultUnmarshalerConfig,
166
+ )
167
+ const uintState = NewUnmarshalState(
168
+ jsonBytes('{"-1": 1}'),
169
+ DefaultUnmarshalerConfig,
170
+ )
150
171
 
151
172
  boolState?.ReadBoolMap(() => {})
152
173
  intState?.ReadInt32Map(() => {})