goscript 0.1.3 → 0.2.0

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 (330) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -0,0 +1,81 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "Compact": {
6
+ "status": "real"
7
+ },
8
+ "Decoder": {
9
+ "status": "real"
10
+ },
11
+ "Delim": {
12
+ "status": "real"
13
+ },
14
+ "Encoder": {
15
+ "status": "real"
16
+ },
17
+ "HTMLEscape": {
18
+ "status": "real"
19
+ },
20
+ "Indent": {
21
+ "status": "real"
22
+ },
23
+ "InvalidUnmarshalError": {
24
+ "status": "real"
25
+ },
26
+ "InvalidUTF8Error": {
27
+ "status": "real"
28
+ },
29
+ "Marshal": {
30
+ "status": "real"
31
+ },
32
+ "Marshaler": {
33
+ "status": "real"
34
+ },
35
+ "MarshalerError": {
36
+ "status": "real"
37
+ },
38
+ "MarshalIndent": {
39
+ "status": "real"
40
+ },
41
+ "NewDecoder": {
42
+ "status": "real"
43
+ },
44
+ "NewEncoder": {
45
+ "status": "real"
46
+ },
47
+ "Number": {
48
+ "status": "real"
49
+ },
50
+ "RawMessage": {
51
+ "status": "real"
52
+ },
53
+ "SyntaxError": {
54
+ "status": "real"
55
+ },
56
+ "Token": {
57
+ "status": "real"
58
+ },
59
+ "Unmarshal": {
60
+ "status": "real"
61
+ },
62
+ "Unmarshaler": {
63
+ "status": "real"
64
+ },
65
+ "UnmarshalFieldError": {
66
+ "status": "real"
67
+ },
68
+ "UnmarshalTypeError": {
69
+ "status": "real"
70
+ },
71
+ "UnsupportedTypeError": {
72
+ "status": "real"
73
+ },
74
+ "UnsupportedValueError": {
75
+ "status": "real"
76
+ },
77
+ "Valid": {
78
+ "status": "real"
79
+ }
80
+ }
81
+ }
@@ -58,6 +58,15 @@ describe('fmt basic value formatting', () => {
58
58
  expect(fmt.Sprintf('Type: %T', 3.14)).toBe('Type: float64')
59
59
  expect(fmt.Sprintf('Type: %T', 'hello')).toBe('Type: string')
60
60
  expect(fmt.Sprintf('Type: %T', true)).toBe('Type: bool')
61
+ expect(
62
+ fmt.Sprintf(
63
+ 'Type: %T',
64
+ $.namedValueInterfaceValue(123, 'int', {}, {
65
+ kind: $.TypeKind.Basic,
66
+ name: 'int',
67
+ }),
68
+ ),
69
+ ).toBe('Type: int')
61
70
  })
62
71
 
63
72
  it('%d truncation behavior including negatives', () => {
@@ -115,6 +124,20 @@ describe('fmt basic value formatting', () => {
115
124
  // We prefer GoString() first
116
125
  expect(fmt.Sprintf('%v', goStringer)).toBe('<go stringer>')
117
126
  })
127
+
128
+ it('%w formats errors by Error method', () => {
129
+ const err = $.newError('root')
130
+ expect(fmt.Errorf('wrap: %w', err)?.Error()).toBe('wrap: root')
131
+ })
132
+
133
+ it('%s formats stringers by String method', () => {
134
+ const stringer = {
135
+ String() {
136
+ return 'string-value'
137
+ },
138
+ }
139
+ expect(fmt.Sprintf('value=%s', stringer)).toBe('value=string-value')
140
+ })
118
141
  })
119
142
 
120
143
  describe('fmt spacing rules', () => {
@@ -146,7 +169,7 @@ describe('fmt spacing rules', () => {
146
169
  expect(output).toBe('hi there 1 2\n')
147
170
  })
148
171
 
149
- it('Fprint/Fprintln behave like Print/Println with writers', () => {
172
+ it('Fprint/Fprintln behave like Print/Println with writers', async () => {
150
173
  const chunks: Uint8Array[] = []
151
174
  const writer = {
152
175
  Write(b: Uint8Array): [number, any] {
@@ -155,14 +178,29 @@ describe('fmt spacing rules', () => {
155
178
  },
156
179
  }
157
180
 
158
- let [n, err] = fmt.Fprint(writer, 1, 2, 'x', 3)
181
+ let [n, err] = await fmt.Fprint(writer, 1, 2, 'x', 3)
159
182
  expect(err).toBeNull()
160
183
  expect(n).toBe(5) // "1 2x3".length
161
184
  expect(new TextDecoder().decode(chunks[0])).toBe('1 2x3')
162
- ;[, err] = fmt.Fprintln(writer, 'hi', 'there', 1, 2)
185
+ ;[, err] = await fmt.Fprintln(writer, 'hi', 'there', 1, 2)
163
186
  expect(err).toBeNull()
164
187
  expect(new TextDecoder().decode(chunks[1])).toBe('hi there 1 2\n')
165
188
  })
189
+
190
+ it('Fprintf awaits async writers', async () => {
191
+ const chunks: Uint8Array[] = []
192
+ const writer = {
193
+ async Write(b: Uint8Array): Promise<[number, any]> {
194
+ chunks.push(b)
195
+ return [b.length, null]
196
+ },
197
+ }
198
+
199
+ const [n, err] = await fmt.Fprintf(writer, 'n=%d s=%s', 7, 'ok')
200
+ expect(err).toBeNull()
201
+ expect(n).toBe(8)
202
+ expect(new TextDecoder().decode(chunks[0])).toBe('n=7 s=ok')
203
+ })
166
204
  })
167
205
 
168
206
  describe('fmt parseFormat basic cases', () => {
package/gs/fmt/fmt.ts CHANGED
@@ -34,15 +34,20 @@ function formatValue(value: any, verb: string): string {
34
34
  switch (verb) {
35
35
  case 'v': // default format
36
36
  return defaultFormat(value)
37
+ case 'w': // wrapped error
38
+ return defaultFormat(value)
37
39
  case 'd': // decimal integer
38
40
  return String(Math.trunc(Number(value)))
39
41
  case 'f': // decimal point, no exponent
40
42
  return Number(value).toString()
41
43
  case 's': // string
42
- return String(value)
44
+ if (typeof value === 'string') return value
45
+ if (value instanceof Uint8Array) return $.bytesToString(value)
46
+ return defaultFormat(value)
43
47
  case 't': // boolean
44
48
  return value ? 'true' : 'false'
45
49
  case 'T': // type (approximate Go names for primitives we need)
50
+ if (hasGoTypeName(value)) return value.__goType
46
51
  if (typeof value === 'number') {
47
52
  return Number.isInteger(value) ? 'int' : 'float64'
48
53
  }
@@ -85,6 +90,14 @@ function formatValue(value: any, verb: string): string {
85
90
  }
86
91
  }
87
92
 
93
+ function hasGoTypeName(value: unknown): value is { __goType: string } {
94
+ return (
95
+ value !== null &&
96
+ typeof value === 'object' &&
97
+ typeof (value as { __goType?: unknown }).__goType === 'string'
98
+ )
99
+ }
100
+
88
101
  function defaultFormat(value: any): string {
89
102
  if (value === null || value === undefined) return '<nil>'
90
103
  if (typeof value === 'boolean') return value ? 'true' : 'false'
@@ -120,6 +133,9 @@ function defaultFormat(value: any): string {
120
133
  // Ignore error by continuing to next case.
121
134
  }
122
135
  }
136
+ if ('__goValue' in value) {
137
+ return defaultFormat((value as { __goValue: unknown }).__goValue)
138
+ }
123
139
  // Basic Map/Set rendering
124
140
  if (value instanceof Map) {
125
141
  const parts: string[] = []
@@ -357,8 +373,21 @@ export function Sprintln(...a: any[]): string {
357
373
  return a.map(defaultFormat).join(' ') + '\n'
358
374
  }
359
375
 
376
+ async function writeToWriter(
377
+ w: any,
378
+ out: string,
379
+ ): Promise<[number, $.GoError | null]> {
380
+ if (w && w.Write) {
381
+ return await w.Write(new TextEncoder().encode(out))
382
+ }
383
+ return [0, $.newError('Writer does not implement Write method')]
384
+ }
385
+
360
386
  // Fprint functions (write to Writer) - simplified implementation
361
- export function Fprint(w: any, ...a: any[]): [number, $.GoError | null] {
387
+ export async function Fprint(
388
+ w: any,
389
+ ...a: any[]
390
+ ): Promise<[number, $.GoError | null]> {
362
391
  // Same spacing as Print
363
392
  let out = ''
364
393
  for (let i = 0; i < a.length; i++) {
@@ -369,32 +398,26 @@ export function Fprint(w: any, ...a: any[]): [number, $.GoError | null] {
369
398
  }
370
399
  out += defaultFormat(a[i])
371
400
  }
372
- if (w && w.Write) {
373
- return w.Write(new TextEncoder().encode(out))
374
- }
375
- return [0, $.newError('Writer does not implement Write method')]
401
+ return await writeToWriter(w, out)
376
402
  }
377
403
 
378
- export function Fprintf(
404
+ export async function Fprintf(
379
405
  w: any,
380
406
  format: string,
381
407
  ...a: any[]
382
- ): [number, $.GoError | null] {
408
+ ): Promise<[number, $.GoError | null]> {
383
409
  const result = parseFormat(format, a)
384
- if (w && w.Write) {
385
- return w.Write(new TextEncoder().encode(result))
386
- }
387
- return [0, $.newError('Writer does not implement Write method')]
410
+ return await writeToWriter(w, result)
388
411
  }
389
412
 
390
- export function Fprintln(w: any, ...a: any[]): [number, $.GoError | null] {
413
+ export async function Fprintln(
414
+ w: any,
415
+ ...a: any[]
416
+ ): Promise<[number, $.GoError | null]> {
391
417
  // Same behavior as Println
392
418
  const body = a.map(defaultFormat).join(' ')
393
419
  const result = body + '\n'
394
- if (w && w.Write) {
395
- return w.Write(new TextEncoder().encode(result))
396
- }
397
- return [0, $.newError('Writer does not implement Write method')]
420
+ return await writeToWriter(w, result)
398
421
  }
399
422
 
400
423
  // Append functions (append to byte slice)
package/gs/fmt/meta.json CHANGED
@@ -1,5 +1,10 @@
1
1
  {
2
+ "asyncFunctions": {
3
+ "Fprint": true,
4
+ "Fprintf": true,
5
+ "Fprintln": true
6
+ },
2
7
  "dependencies": [
3
8
  "errors"
4
9
  ]
5
- }
10
+ }
@@ -3,7 +3,17 @@ import { describe, expect, it } from 'vitest'
3
3
  import * as $ from '../../../builtin/index.js'
4
4
  import {
5
5
  AppendVarint,
6
+ CloneBytes,
7
+ CloneBytesMap,
8
+ CloneBytesSlice,
9
+ CloneMap,
6
10
  type CloneMessage,
11
+ ClonePtr,
12
+ CloneSlice,
13
+ type CloneVT,
14
+ CloneVTMap,
15
+ CloneVTSlice,
16
+ CloneVTValue,
7
17
  CompareEqualVT,
8
18
  ConsumeVarint,
9
19
  DecodeFixed32,
@@ -16,8 +26,55 @@ import {
16
26
  ErrIntOverflow,
17
27
  ErrInvalidLength,
18
28
  ErrUnexpectedEndOfGroup,
29
+ EqualBytes,
30
+ EqualBytesMap,
31
+ EqualBytesPresent,
32
+ EqualBytesSlice,
33
+ EqualMap,
34
+ EqualPtr,
35
+ EqualSlice,
36
+ EqualVTImplicit,
37
+ EqualVTMapImplicit,
38
+ EqualVTSliceImplicit,
39
+ type EqualVT,
19
40
  IsEqualVTSlice,
41
+ SizeBoolNonZero,
42
+ SizeBoolPacked,
43
+ SizeBoolPtr,
44
+ SizeBoolSlice,
45
+ SizeBoolValue,
46
+ SizeBytesNonEmpty,
47
+ SizeBytesPresent,
48
+ SizeBytesSlice,
49
+ SizeBytesValue,
50
+ SizeFixed32NonZero,
51
+ SizeFixed32Packed,
52
+ SizeFixed32Ptr,
53
+ SizeFixed32Slice,
54
+ SizeFixed32Value,
55
+ SizeFixed64NonZero,
56
+ SizeFixed64Packed,
57
+ SizeFixed64Ptr,
58
+ SizeFixed64Slice,
59
+ SizeFixed64Value,
60
+ SizeGroup,
61
+ SizeMessage,
20
62
  SizeOfVarint,
63
+ SizeOfZigzag,
64
+ SizeStringNonEmpty,
65
+ SizeStringPtr,
66
+ SizeStringSlice,
67
+ SizeStringValue,
68
+ SizeVarintNonZero,
69
+ SizeVarintPacked,
70
+ SizeVarintPtr,
71
+ SizeVarintSlice,
72
+ SizeVarintValue,
73
+ SizeZigzagNonZero,
74
+ SizeZigzagPacked,
75
+ SizeZigzagPtr,
76
+ SizeZigzagSlice,
77
+ SizeZigzagValue,
21
78
  Skip,
22
79
  } from './index.js'
23
80
 
@@ -29,6 +86,42 @@ class TestValue {
29
86
  }
30
87
  }
31
88
 
89
+ class TestCloneValue
90
+ implements CloneVT<TestCloneValue>, EqualVT<TestCloneValue>
91
+ {
92
+ constructor(private readonly cloneValue: string) {}
93
+
94
+ SizeVT(): number {
95
+ return 0
96
+ }
97
+
98
+ MarshalToSizedBufferVT(): [number, $.GoError] {
99
+ return [0, null]
100
+ }
101
+
102
+ MarshalVT(): [$.Slice<number>, $.GoError] {
103
+ return [null, null]
104
+ }
105
+
106
+ UnmarshalVT(): $.GoError {
107
+ return null
108
+ }
109
+
110
+ Reset(): void {}
111
+
112
+ CloneMessageVT(): CloneMessage | null {
113
+ return this.CloneVT()
114
+ }
115
+
116
+ CloneVT(): TestCloneValue {
117
+ return new TestCloneValue(this.cloneValue)
118
+ }
119
+
120
+ EqualVT(other: TestCloneValue): boolean {
121
+ return this.cloneValue === other.cloneValue
122
+ }
123
+ }
124
+
32
125
  class TestCloneMessage implements CloneMessage {
33
126
  SizeVT(): number {
34
127
  return 0
@@ -78,6 +171,68 @@ describe('protobuf-go-lite EqualVT helpers', () => {
78
171
  })
79
172
  })
80
173
 
174
+ describe('protobuf-go-lite static helper overrides', () => {
175
+ it('clones pointer, slice, map, bytes, and VT values', () => {
176
+ const ptr = $.varRef(7)
177
+ const clonedPtr = ClonePtr(ptr)
178
+ expect(clonedPtr).not.toBe(ptr)
179
+ expect(clonedPtr?.value).toBe(7)
180
+
181
+ const bytes = new Uint8Array([1, 2])
182
+ const clonedBytes = CloneBytes(bytes)
183
+ expect(clonedBytes).not.toBe(bytes)
184
+ expect(Array.from(clonedBytes ?? [])).toEqual([1, 2])
185
+
186
+ expect(CloneSlice([1, 2])).toEqual([1, 2])
187
+ expect(CloneMap(new Map([['a', 1]]))?.get('a')).toBe(1)
188
+
189
+ const bytesSlice = CloneBytesSlice([new Uint8Array([3])])
190
+ expect(bytesSlice?.[0]).not.toBe(bytes)
191
+ expect(Array.from(bytesSlice?.[0] ?? [])).toEqual([3])
192
+
193
+ const bytesMap = CloneBytesMap(new Map([['a', new Uint8Array([4])]]))
194
+ expect(Array.from(bytesMap?.get('a') ?? [])).toEqual([4])
195
+
196
+ const msg = new TestCloneValue('x')
197
+ expect(CloneVTValue(msg)).not.toBe(msg)
198
+ expect(CloneVTSlice([msg])?.[0]).not.toBe(msg)
199
+ expect(CloneVTMap(new Map([['a', msg]]))?.get('a')).not.toBe(msg)
200
+ })
201
+
202
+ it('compares pointer, slice, map, bytes, and implicit VT values', () => {
203
+ expect(EqualPtr($.varRef(1), $.varRef(1))).toBe(true)
204
+ expect(EqualPtr($.varRef(1), $.varRef(2))).toBe(false)
205
+ expect(EqualBytes(new Uint8Array([1]), [1])).toBe(true)
206
+ expect(EqualBytesPresent(null, new Uint8Array())).toBe(false)
207
+ expect(EqualSlice([1, 2], [1, 2])).toBe(true)
208
+ expect(EqualMap(new Map([['a', 1]]), new Map([['a', 1]]))).toBe(true)
209
+ expect(EqualBytesSlice([new Uint8Array([1])], [[1]])).toBe(true)
210
+ expect(
211
+ EqualBytesMap(
212
+ new Map([['a', new Uint8Array([1])]]),
213
+ new Map([['a', [1]]]),
214
+ ),
215
+ ).toBe(true)
216
+
217
+ const empty = () => new TestCloneValue('')
218
+ expect(EqualVTImplicit(null, new TestCloneValue(''), empty)).toBe(true)
219
+ expect(
220
+ EqualVTSliceImplicit(
221
+ [null, new TestCloneValue('x')],
222
+ [new TestCloneValue(''), new TestCloneValue('x')],
223
+ empty,
224
+ ),
225
+ ).toBe(true)
226
+ expect(
227
+ EqualVTMapImplicit(
228
+ new Map([['a', null]]),
229
+ new Map([['a', new TestCloneValue('')]]),
230
+ empty,
231
+ ),
232
+ ).toBe(true)
233
+ })
234
+ })
235
+
81
236
  describe('protobuf-go-lite runtime interfaces', () => {
82
237
  it('registers CloneMessage metadata for Go type assertions', () => {
83
238
  const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
@@ -105,9 +260,13 @@ describe('protobuf-go-lite wire helpers', () => {
105
260
  expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
106
261
  expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
107
262
  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
- ])
263
+ expect(SizeOfZigzag(-1)).toBe(1)
264
+ expect(SizeOfZigzag(1)).toBe(1)
265
+ expect(SizeOfZigzag(-64)).toBe(1)
266
+ expect(SizeOfZigzag(-65)).toBe(2)
267
+ expect(
268
+ Array.from(AppendVarint([], 0xffffffffffffffffn) as number[]),
269
+ ).toEqual([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01])
111
270
  expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
112
271
  0xffffffffffffffffn,
113
272
  10,
@@ -147,4 +306,53 @@ describe('protobuf-go-lite wire helpers', () => {
147
306
  const [, eof] = Skip(new Uint8Array([0x08, 0x80]))
148
307
  expect(eof?.Error()).toBe('unexpected EOF')
149
308
  })
309
+
310
+ it('reports helper-backed protobuf sizes', () => {
311
+ expect(SizeVarintValue(1, 300)).toBe(3)
312
+ expect(SizeVarintNonZero(1, 0)).toBe(0)
313
+ expect(SizeVarintNonZero(1, 300)).toBe(3)
314
+ expect(SizeVarintPtr(1, null)).toBe(0)
315
+ expect(SizeVarintPtr(1, $.varRef(300))).toBe(3)
316
+ expect(SizeVarintSlice(1, [1, 300])).toBe(5)
317
+ expect(SizeVarintPacked(1, [1, 300])).toBe(5)
318
+
319
+ expect(SizeZigzagValue(1, -65)).toBe(3)
320
+ expect(SizeZigzagNonZero(1, 0)).toBe(0)
321
+ expect(SizeZigzagPtr(1, $.varRef(-1))).toBe(2)
322
+ expect(SizeZigzagSlice(1, [-1, -65])).toBe(5)
323
+ expect(SizeZigzagPacked(1, [-1, -65])).toBe(5)
324
+
325
+ expect(SizeFixed32Value(1)).toBe(5)
326
+ expect(SizeFixed32NonZero(1, 0)).toBe(0)
327
+ expect(SizeFixed32Ptr(1, $.varRef(1))).toBe(5)
328
+ expect(SizeFixed32Slice(1, [1, 2])).toBe(10)
329
+ expect(SizeFixed32Packed(1, [1, 2])).toBe(10)
330
+
331
+ expect(SizeFixed64Value(1)).toBe(9)
332
+ expect(SizeFixed64NonZero(1, 0)).toBe(0)
333
+ expect(SizeFixed64Ptr(1, $.varRef(1))).toBe(9)
334
+ expect(SizeFixed64Slice(1, [1, 2])).toBe(18)
335
+ expect(SizeFixed64Packed(1, [1, 2])).toBe(18)
336
+
337
+ expect(SizeBoolValue(1)).toBe(2)
338
+ expect(SizeBoolNonZero(1, false)).toBe(0)
339
+ expect(SizeBoolPtr(1, $.varRef(false))).toBe(2)
340
+ expect(SizeBoolSlice(1, [true, false])).toBe(4)
341
+ expect(SizeBoolPacked(1, [true, false])).toBe(4)
342
+
343
+ expect(SizeStringValue(1, 'abc')).toBe(5)
344
+ expect(SizeStringNonEmpty(1, '')).toBe(0)
345
+ expect(SizeStringPtr(1, $.varRef('abc'))).toBe(5)
346
+ expect(SizeStringSlice(1, ['a', 'bc'])).toBe(7)
347
+
348
+ expect(SizeBytesValue(1, 3)).toBe(5)
349
+ expect(SizeBytesNonEmpty(1, new Uint8Array())).toBe(0)
350
+ expect(SizeBytesPresent(1, new Uint8Array())).toBe(2)
351
+ expect(
352
+ SizeBytesSlice(1, [new Uint8Array([1]), new Uint8Array([2, 3])]),
353
+ ).toBe(7)
354
+
355
+ expect(SizeMessage(1, 3)).toBe(5)
356
+ expect(SizeGroup(1, 3)).toBe(5)
357
+ })
150
358
  })