goscript 0.1.4 → 0.2.1

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 (295) 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} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript-wasm/main.go +38 -6
  8. package/compiler/compile-request.go +12 -9
  9. package/compiler/compliance_test.go +0 -1
  10. package/compiler/config.go +2 -0
  11. package/compiler/diagnostic.go +104 -12
  12. package/compiler/diagnostic_test.go +106 -0
  13. package/compiler/gotest/request.go +28 -0
  14. package/compiler/gotest/runner.go +354 -44
  15. package/compiler/gotest/runner_test.go +293 -1
  16. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  17. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  18. package/compiler/index.test.ts +23 -0
  19. package/compiler/lowered-program.go +33 -24
  20. package/compiler/lowering.go +746 -194
  21. package/compiler/lowering_bench_test.go +42 -27
  22. package/compiler/lowering_internal_test.go +18 -0
  23. package/compiler/override-facts.go +15 -0
  24. package/compiler/override-parity-verifier.go +450 -0
  25. package/compiler/override-parity.go +122 -0
  26. package/compiler/override-registry_test.go +559 -0
  27. package/compiler/protobuf-ts-binding.go +567 -0
  28. package/compiler/protobuf-ts-binding_test.go +402 -0
  29. package/compiler/runtime-contract.go +4 -0
  30. package/compiler/runtime-contract_test.go +2 -0
  31. package/compiler/semantic-model-types.go +9 -4
  32. package/compiler/semantic-model.go +282 -70
  33. package/compiler/semantic-model_test.go +82 -1
  34. package/compiler/service.go +21 -1
  35. package/compiler/skeleton_test.go +118 -10
  36. package/compiler/typescript-emitter.go +128 -13
  37. package/compiler/wasm/compile_test.go +37 -4
  38. package/compiler/{wasm_api.go → wasm-api.go} +57 -7
  39. package/dist/gs/builtin/hostio.js +5 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/slice.d.ts +13 -2
  42. package/dist/gs/builtin/slice.js +187 -6
  43. package/dist/gs/builtin/slice.js.map +1 -1
  44. package/dist/gs/builtin/type.d.ts +13 -5
  45. package/dist/gs/builtin/type.js +153 -60
  46. package/dist/gs/builtin/type.js.map +1 -1
  47. package/dist/gs/builtin/varRef.d.ts +11 -0
  48. package/dist/gs/builtin/varRef.js +57 -2
  49. package/dist/gs/builtin/varRef.js.map +1 -1
  50. package/dist/gs/bytes/buffer.gs.js +1 -1
  51. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  52. package/dist/gs/bytes/reader.gs.js +1 -1
  53. package/dist/gs/bytes/reader.gs.js.map +1 -1
  54. package/dist/gs/compress/zlib/index.d.ts +10 -3
  55. package/dist/gs/compress/zlib/index.js +50 -16
  56. package/dist/gs/compress/zlib/index.js.map +1 -1
  57. package/dist/gs/encoding/json/index.d.ts +114 -0
  58. package/dist/gs/encoding/json/index.js +544 -36
  59. package/dist/gs/encoding/json/index.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  66. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  67. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  68. package/dist/gs/go/scanner/index.d.ts +2 -0
  69. package/dist/gs/go/scanner/index.js +29 -5
  70. package/dist/gs/go/scanner/index.js.map +1 -1
  71. package/dist/gs/go/token/index.js +22 -6
  72. package/dist/gs/go/token/index.js.map +1 -1
  73. package/dist/gs/hash/index.d.ts +6 -0
  74. package/dist/gs/hash/index.js +20 -0
  75. package/dist/gs/hash/index.js.map +1 -1
  76. package/dist/gs/internal/byteorder/index.js +2 -2
  77. package/dist/gs/internal/byteorder/index.js.map +1 -1
  78. package/dist/gs/internal/goarch/index.d.ts +43 -3
  79. package/dist/gs/internal/goarch/index.js +42 -10
  80. package/dist/gs/internal/goarch/index.js.map +1 -1
  81. package/dist/gs/io/fs/fs.js +26 -14
  82. package/dist/gs/io/fs/fs.js.map +1 -1
  83. package/dist/gs/io/fs/readdir.js +4 -2
  84. package/dist/gs/io/fs/readdir.js.map +1 -1
  85. package/dist/gs/io/fs/sub.js +8 -1
  86. package/dist/gs/io/fs/sub.js.map +1 -1
  87. package/dist/gs/io/io.d.ts +2 -0
  88. package/dist/gs/io/io.js.map +1 -1
  89. package/dist/gs/math/bits/index.d.ts +5 -0
  90. package/dist/gs/math/bits/index.js +16 -4
  91. package/dist/gs/math/bits/index.js.map +1 -1
  92. package/dist/gs/mime/index.d.ts +16 -0
  93. package/dist/gs/mime/index.js +315 -6
  94. package/dist/gs/mime/index.js.map +1 -1
  95. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  96. package/dist/gs/net/http/httptest/index.js +85 -6
  97. package/dist/gs/net/http/httptest/index.js.map +1 -1
  98. package/dist/gs/net/http/index.d.ts +300 -5
  99. package/dist/gs/net/http/index.js +1598 -58
  100. package/dist/gs/net/http/index.js.map +1 -1
  101. package/dist/gs/os/dir_unix.gs.js +1 -1
  102. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  103. package/dist/gs/os/error.gs.js +1 -1
  104. package/dist/gs/os/error.gs.js.map +1 -1
  105. package/dist/gs/os/exec.gs.d.ts +1 -0
  106. package/dist/gs/os/exec.gs.js +4 -8
  107. package/dist/gs/os/exec.gs.js.map +1 -1
  108. package/dist/gs/os/exec_posix.gs.js +1 -1
  109. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  110. package/dist/gs/os/index.d.ts +1 -1
  111. package/dist/gs/os/index.js +1 -1
  112. package/dist/gs/os/index.js.map +1 -1
  113. package/dist/gs/os/proc.gs.d.ts +4 -0
  114. package/dist/gs/os/proc.gs.js +12 -6
  115. package/dist/gs/os/proc.gs.js.map +1 -1
  116. package/dist/gs/os/root_js.gs.js +1 -1
  117. package/dist/gs/os/root_js.gs.js.map +1 -1
  118. package/dist/gs/os/types.gs.js +1 -1
  119. package/dist/gs/os/types.gs.js.map +1 -1
  120. package/dist/gs/os/types_js.gs.js +1 -1
  121. package/dist/gs/os/types_js.gs.js.map +1 -1
  122. package/dist/gs/os/types_unix.gs.js +1 -1
  123. package/dist/gs/os/types_unix.gs.js.map +1 -1
  124. package/dist/gs/path/path.js +11 -7
  125. package/dist/gs/path/path.js.map +1 -1
  126. package/dist/gs/reflect/index.d.ts +5 -4
  127. package/dist/gs/reflect/index.js +4 -3
  128. package/dist/gs/reflect/index.js.map +1 -1
  129. package/dist/gs/reflect/map.js +15 -0
  130. package/dist/gs/reflect/map.js.map +1 -1
  131. package/dist/gs/reflect/type.d.ts +25 -6
  132. package/dist/gs/reflect/type.js +1475 -228
  133. package/dist/gs/reflect/type.js.map +1 -1
  134. package/dist/gs/reflect/types.d.ts +14 -6
  135. package/dist/gs/reflect/types.js +35 -1
  136. package/dist/gs/reflect/types.js.map +1 -1
  137. package/dist/gs/reflect/value.d.ts +1 -0
  138. package/dist/gs/reflect/value.js +83 -41
  139. package/dist/gs/reflect/value.js.map +1 -1
  140. package/dist/gs/reflect/visiblefields.js +4 -140
  141. package/dist/gs/reflect/visiblefields.js.map +1 -1
  142. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  143. package/dist/gs/runtime/pprof/index.js +50 -30
  144. package/dist/gs/runtime/pprof/index.js.map +1 -1
  145. package/dist/gs/runtime/runtime.js +5 -4
  146. package/dist/gs/runtime/runtime.js.map +1 -1
  147. package/dist/gs/runtime/trace/index.js +5 -19
  148. package/dist/gs/runtime/trace/index.js.map +1 -1
  149. package/dist/gs/strconv/atoi.gs.js +1 -1
  150. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  151. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  152. package/dist/gs/strconv/complex.gs.js +148 -0
  153. package/dist/gs/strconv/complex.gs.js.map +1 -0
  154. package/dist/gs/strconv/index.d.ts +1 -0
  155. package/dist/gs/strconv/index.js +1 -0
  156. package/dist/gs/strconv/index.js.map +1 -1
  157. package/dist/gs/strings/builder.js +1 -1
  158. package/dist/gs/strings/reader.js +9 -5
  159. package/dist/gs/strings/reader.js.map +1 -1
  160. package/dist/gs/strings/replace.js +15 -7
  161. package/dist/gs/strings/replace.js.map +1 -1
  162. package/dist/gs/strings/strings.d.ts +5 -0
  163. package/dist/gs/strings/strings.js +57 -5
  164. package/dist/gs/strings/strings.js.map +1 -1
  165. package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
  166. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  167. package/dist/gs/sync/atomic/type.gs.js +9 -9
  168. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  169. package/dist/gs/sync/atomic/value.gs.js +2 -2
  170. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  171. package/dist/gs/syscall/env.js +22 -14
  172. package/dist/gs/syscall/env.js.map +1 -1
  173. package/dist/gs/testing/testing.js +55 -13
  174. package/dist/gs/testing/testing.js.map +1 -1
  175. package/dist/gs/time/time.d.ts +24 -1
  176. package/dist/gs/time/time.js +43 -3
  177. package/dist/gs/time/time.js.map +1 -1
  178. package/dist/gs/unique/index.js +7 -1
  179. package/dist/gs/unique/index.js.map +1 -1
  180. package/go.mod +3 -3
  181. package/go.sum +16 -0
  182. package/gs/builtin/hostio.test.ts +16 -0
  183. package/gs/builtin/hostio.ts +7 -0
  184. package/gs/builtin/runtime-contract.test.ts +246 -21
  185. package/gs/builtin/slice.ts +269 -24
  186. package/gs/builtin/type.ts +226 -59
  187. package/gs/builtin/varRef.ts +85 -2
  188. package/gs/bytes/buffer.gs.ts +1 -1
  189. package/gs/bytes/reader.gs.ts +1 -1
  190. package/gs/compress/zlib/index.test.ts +62 -1
  191. package/gs/compress/zlib/index.ts +53 -16
  192. package/gs/compress/zlib/parity.json +51 -0
  193. package/gs/encoding/json/index.test.ts +360 -6
  194. package/gs/encoding/json/index.ts +679 -38
  195. package/gs/encoding/json/parity.json +81 -0
  196. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
  197. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
  198. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
  199. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
  200. package/gs/github.com/pkg/errors/errors.ts +54 -30
  201. package/gs/go/scanner/index.test.ts +39 -56
  202. package/gs/go/scanner/index.ts +33 -5
  203. package/gs/go/scanner/parity.json +27 -0
  204. package/gs/go/token/index.ts +22 -6
  205. package/gs/hash/index.test.ts +20 -33
  206. package/gs/hash/index.ts +28 -0
  207. package/gs/hash/parity.json +21 -0
  208. package/gs/internal/byteorder/index.test.ts +2 -2
  209. package/gs/internal/byteorder/index.ts +2 -2
  210. package/gs/internal/goarch/index.test.ts +32 -0
  211. package/gs/internal/goarch/index.ts +45 -13
  212. package/gs/internal/goarch/parity.json +144 -0
  213. package/gs/io/fs/fs.ts +26 -14
  214. package/gs/io/fs/readdir.ts +4 -4
  215. package/gs/io/fs/sub.ts +8 -1
  216. package/gs/io/io.ts +1 -0
  217. package/gs/io/parity.json +162 -0
  218. package/gs/math/bits/index.test.ts +14 -1
  219. package/gs/math/bits/index.ts +23 -4
  220. package/gs/math/bits/parity.json +156 -0
  221. package/gs/mime/index.test.ts +90 -0
  222. package/gs/mime/index.ts +369 -6
  223. package/gs/mime/parity.json +36 -0
  224. package/gs/net/http/httptest/index.test.ts +98 -2
  225. package/gs/net/http/httptest/index.ts +101 -6
  226. package/gs/net/http/httptest/parity.json +15 -0
  227. package/gs/net/http/index.test.ts +781 -12
  228. package/gs/net/http/index.ts +1860 -139
  229. package/gs/net/http/meta.json +16 -1
  230. package/gs/net/http/parity.json +193 -0
  231. package/gs/os/dir_unix.gs.ts +1 -1
  232. package/gs/os/error.gs.ts +1 -1
  233. package/gs/os/exec.gs.ts +4 -8
  234. package/gs/os/exec_posix.gs.ts +1 -1
  235. package/gs/os/index.test.ts +9 -0
  236. package/gs/os/index.ts +1 -0
  237. package/gs/os/parity.json +9 -0
  238. package/gs/os/proc.gs.ts +18 -5
  239. package/gs/os/proc.test.ts +26 -0
  240. package/gs/os/root_js.gs.ts +1 -1
  241. package/gs/os/types.gs.ts +1 -1
  242. package/gs/os/types_js.gs.ts +1 -1
  243. package/gs/os/types_unix.gs.ts +1 -1
  244. package/gs/path/path.ts +11 -7
  245. package/gs/reflect/field.test.ts +37 -15
  246. package/gs/reflect/function-types.test.ts +518 -22
  247. package/gs/reflect/index.ts +8 -6
  248. package/gs/reflect/map.ts +20 -0
  249. package/gs/reflect/meta.json +6 -4
  250. package/gs/reflect/parity.json +234 -0
  251. package/gs/reflect/sliceat.test.ts +156 -0
  252. package/gs/reflect/structof.test.ts +401 -0
  253. package/gs/reflect/type.ts +1961 -317
  254. package/gs/reflect/typefor.test.ts +530 -10
  255. package/gs/reflect/types.ts +43 -18
  256. package/gs/reflect/value.ts +105 -45
  257. package/gs/reflect/visiblefields.ts +5 -168
  258. package/gs/runtime/parity.json +24 -0
  259. package/gs/runtime/pprof/index.test.ts +29 -7
  260. package/gs/runtime/pprof/index.ts +56 -30
  261. package/gs/runtime/pprof/parity.json +27 -0
  262. package/gs/runtime/runtime.test.ts +3 -1
  263. package/gs/runtime/runtime.ts +4 -3
  264. package/gs/runtime/trace/index.test.ts +5 -3
  265. package/gs/runtime/trace/index.ts +8 -20
  266. package/gs/runtime/trace/parity.json +36 -0
  267. package/gs/strconv/atoi.gs.ts +1 -1
  268. package/gs/strconv/complex.gs.ts +174 -0
  269. package/gs/strconv/complex.test.ts +65 -0
  270. package/gs/strconv/index.ts +1 -0
  271. package/gs/strconv/parity.json +120 -0
  272. package/gs/strings/builder.ts +1 -1
  273. package/gs/strings/parity.json +186 -0
  274. package/gs/strings/reader.ts +9 -5
  275. package/gs/strings/replace.ts +15 -7
  276. package/gs/strings/strings.test.ts +22 -2
  277. package/gs/strings/strings.ts +64 -6
  278. package/gs/sync/atomic/doc_64.gs.ts +6 -7
  279. package/gs/sync/atomic/doc_64.test.ts +43 -0
  280. package/gs/sync/atomic/type.gs.ts +9 -9
  281. package/gs/sync/atomic/value.gs.ts +2 -2
  282. package/gs/syscall/env.ts +29 -14
  283. package/gs/testing/testing.test.ts +67 -0
  284. package/gs/testing/testing.ts +87 -19
  285. package/gs/time/parity.json +225 -0
  286. package/gs/time/time.test.ts +20 -2
  287. package/gs/time/time.ts +49 -7
  288. package/gs/unique/index.ts +7 -1
  289. package/package.json +4 -2
  290. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  291. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  292. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  293. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  294. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  295. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
@@ -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
+ }
@@ -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,9 +26,59 @@ 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
+ MarshalBoundMessageVT,
42
+ MarshalBoundMessageToSizedBufferVT,
43
+ SizeBoolNonZero,
44
+ SizeBoolPacked,
45
+ SizeBoolPtr,
46
+ SizeBoolSlice,
47
+ SizeBoolValue,
48
+ SizeBytesNonEmpty,
49
+ SizeBytesPresent,
50
+ SizeBytesSlice,
51
+ SizeBytesValue,
52
+ SizeFixed32NonZero,
53
+ SizeFixed32Packed,
54
+ SizeFixed32Ptr,
55
+ SizeFixed32Slice,
56
+ SizeFixed32Value,
57
+ SizeFixed64NonZero,
58
+ SizeFixed64Packed,
59
+ SizeFixed64Ptr,
60
+ SizeFixed64Slice,
61
+ SizeFixed64Value,
62
+ SizeGroup,
63
+ SizeMessage,
20
64
  SizeOfVarint,
65
+ SizeOfZigzag,
66
+ SizeStringNonEmpty,
67
+ SizeStringPtr,
68
+ SizeStringSlice,
69
+ SizeStringValue,
70
+ SizeVarintNonZero,
71
+ SizeVarintPacked,
72
+ SizeVarintPtr,
73
+ SizeVarintSlice,
74
+ SizeVarintValue,
75
+ SizeZigzagNonZero,
76
+ SizeZigzagPacked,
77
+ SizeZigzagPtr,
78
+ SizeZigzagSlice,
79
+ SizeZigzagValue,
21
80
  Skip,
81
+ UnmarshalBoundMessageVT,
22
82
  } from './index.js'
23
83
 
24
84
  class TestValue {
@@ -29,6 +89,42 @@ class TestValue {
29
89
  }
30
90
  }
31
91
 
92
+ class TestCloneValue
93
+ implements CloneVT<TestCloneValue>, EqualVT<TestCloneValue>
94
+ {
95
+ constructor(private readonly cloneValue: string) {}
96
+
97
+ SizeVT(): number {
98
+ return 0
99
+ }
100
+
101
+ MarshalToSizedBufferVT(): [number, $.GoError] {
102
+ return [0, null]
103
+ }
104
+
105
+ MarshalVT(): [$.Slice<number>, $.GoError] {
106
+ return [null, null]
107
+ }
108
+
109
+ UnmarshalVT(): $.GoError {
110
+ return null
111
+ }
112
+
113
+ Reset(): void {}
114
+
115
+ CloneMessageVT(): CloneMessage | null {
116
+ return this.CloneVT()
117
+ }
118
+
119
+ CloneVT(): TestCloneValue {
120
+ return new TestCloneValue(this.cloneValue)
121
+ }
122
+
123
+ EqualVT(other: TestCloneValue): boolean {
124
+ return this.cloneValue === other.cloneValue
125
+ }
126
+ }
127
+
32
128
  class TestCloneMessage implements CloneMessage {
33
129
  SizeVT(): number {
34
130
  return 0
@@ -53,6 +149,115 @@ class TestCloneMessage implements CloneMessage {
53
149
  }
54
150
  }
55
151
 
152
+ class BrokenBoundMessage {}
153
+
154
+ ;(BrokenBoundMessage as any).__protobufTypeScriptMessage = {
155
+ typeName: 'test.BrokenBoundMessage',
156
+ fields: { list: () => [] },
157
+ fromBinary: () => ({}),
158
+ toBinary: () => {
159
+ throw new Error('invalid uint 32: undefined')
160
+ },
161
+ }
162
+
163
+ class BytesBoundMessage {
164
+ Config: $.Slice<number>
165
+
166
+ constructor(config: $.Slice<number>) {
167
+ this.Config = config
168
+ }
169
+ }
170
+
171
+ ;(BytesBoundMessage as any).__protobufTypeScriptMessage = {
172
+ typeName: 'test.BytesBoundMessage',
173
+ fields: {
174
+ list: () => [{ localName: 'config', kind: 'scalar', T: 12 }],
175
+ },
176
+ fromBinary: () => ({}),
177
+ toBinary: (value: { config?: Uint8Array }) => {
178
+ expect(value.config).toBeInstanceOf(Uint8Array)
179
+ expect(Array.from(value.config ?? [])).toEqual([1, 2, 3])
180
+ return new Uint8Array([9])
181
+ },
182
+ }
183
+
184
+ class TimestampBoundMessage {
185
+ public get Seconds(): number {
186
+ return this._fields.Seconds.value
187
+ }
188
+ public set Seconds(value: number) {
189
+ this._fields.Seconds.value = value
190
+ }
191
+
192
+ public get Nanos(): number {
193
+ return this._fields.Nanos.value
194
+ }
195
+ public set Nanos(value: number) {
196
+ this._fields.Nanos.value = value
197
+ }
198
+
199
+ public _fields: {
200
+ Seconds: $.VarRef<number>
201
+ Nanos: $.VarRef<number>
202
+ }
203
+
204
+ constructor(init?: Partial<{ Seconds?: number; Nanos?: number }>) {
205
+ this._fields = {
206
+ Seconds: $.varRef(init?.Seconds ?? 0),
207
+ Nanos: $.varRef(init?.Nanos ?? 0),
208
+ }
209
+ }
210
+ }
211
+
212
+ const timestampMessageType = {
213
+ typeName: 'google.protobuf.Timestamp',
214
+ fields: {
215
+ list: () => [
216
+ { localName: 'seconds', kind: 'scalar' },
217
+ { localName: 'nanos', kind: 'scalar' },
218
+ ],
219
+ },
220
+ }
221
+
222
+ class TimestampParentBoundMessage {
223
+ public get Timestamp(): TimestampBoundMessage | null {
224
+ return this._fields.Timestamp.value
225
+ }
226
+ public set Timestamp(value: TimestampBoundMessage | null) {
227
+ this._fields.Timestamp.value = value
228
+ }
229
+
230
+ public _fields: {
231
+ Timestamp: $.VarRef<TimestampBoundMessage | null>
232
+ }
233
+
234
+ constructor(init?: Partial<{ Timestamp?: TimestampBoundMessage | null }>) {
235
+ this._fields = {
236
+ Timestamp: $.varRef(init?.Timestamp ?? null),
237
+ }
238
+ }
239
+ }
240
+
241
+ ;(TimestampParentBoundMessage as any).__protobufTypeScriptMessage = {
242
+ typeName: 'test.TimestampParentBoundMessage',
243
+ fields: {
244
+ list: () => [
245
+ {
246
+ localName: 'timestamp',
247
+ kind: 'message',
248
+ T: timestampMessageType,
249
+ },
250
+ ],
251
+ },
252
+ fromBinary: () => ({
253
+ timestamp: new Date(Date.UTC(2026, 4, 31, 12, 34, 56, 789)),
254
+ }),
255
+ toBinary: () => new Uint8Array(),
256
+ }
257
+ ;(TimestampParentBoundMessage as any).__protobufTypeScriptFields = {
258
+ timestamp: TimestampBoundMessage,
259
+ }
260
+
56
261
  describe('protobuf-go-lite EqualVT helpers', () => {
57
262
  it('accepts compiler-emitted runtime type arguments', () => {
58
263
  const equal = CompareEqualVT<TestValue>({
@@ -78,6 +283,68 @@ describe('protobuf-go-lite EqualVT helpers', () => {
78
283
  })
79
284
  })
80
285
 
286
+ describe('protobuf-go-lite static helper overrides', () => {
287
+ it('clones pointer, slice, map, bytes, and VT values', () => {
288
+ const ptr = $.varRef(7)
289
+ const clonedPtr = ClonePtr(ptr)
290
+ expect(clonedPtr).not.toBe(ptr)
291
+ expect(clonedPtr?.value).toBe(7)
292
+
293
+ const bytes = new Uint8Array([1, 2])
294
+ const clonedBytes = CloneBytes(bytes)
295
+ expect(clonedBytes).not.toBe(bytes)
296
+ expect(Array.from(clonedBytes ?? [])).toEqual([1, 2])
297
+
298
+ expect(CloneSlice([1, 2])).toEqual([1, 2])
299
+ expect(CloneMap(new Map([['a', 1]]))?.get('a')).toBe(1)
300
+
301
+ const bytesSlice = CloneBytesSlice([new Uint8Array([3])])
302
+ expect(bytesSlice?.[0]).not.toBe(bytes)
303
+ expect(Array.from(bytesSlice?.[0] ?? [])).toEqual([3])
304
+
305
+ const bytesMap = CloneBytesMap(new Map([['a', new Uint8Array([4])]]))
306
+ expect(Array.from(bytesMap?.get('a') ?? [])).toEqual([4])
307
+
308
+ const msg = new TestCloneValue('x')
309
+ expect(CloneVTValue(msg)).not.toBe(msg)
310
+ expect(CloneVTSlice([msg])?.[0]).not.toBe(msg)
311
+ expect(CloneVTMap(new Map([['a', msg]]))?.get('a')).not.toBe(msg)
312
+ })
313
+
314
+ it('compares pointer, slice, map, bytes, and implicit VT values', () => {
315
+ expect(EqualPtr($.varRef(1), $.varRef(1))).toBe(true)
316
+ expect(EqualPtr($.varRef(1), $.varRef(2))).toBe(false)
317
+ expect(EqualBytes(new Uint8Array([1]), [1])).toBe(true)
318
+ expect(EqualBytesPresent(null, new Uint8Array())).toBe(false)
319
+ expect(EqualSlice([1, 2], [1, 2])).toBe(true)
320
+ expect(EqualMap(new Map([['a', 1]]), new Map([['a', 1]]))).toBe(true)
321
+ expect(EqualBytesSlice([new Uint8Array([1])], [[1]])).toBe(true)
322
+ expect(
323
+ EqualBytesMap(
324
+ new Map([['a', new Uint8Array([1])]]),
325
+ new Map([['a', [1]]]),
326
+ ),
327
+ ).toBe(true)
328
+
329
+ const empty = () => new TestCloneValue('')
330
+ expect(EqualVTImplicit(null, new TestCloneValue(''), empty)).toBe(true)
331
+ expect(
332
+ EqualVTSliceImplicit(
333
+ [null, new TestCloneValue('x')],
334
+ [new TestCloneValue(''), new TestCloneValue('x')],
335
+ empty,
336
+ ),
337
+ ).toBe(true)
338
+ expect(
339
+ EqualVTMapImplicit(
340
+ new Map([['a', null]]),
341
+ new Map([['a', new TestCloneValue('')]]),
342
+ empty,
343
+ ),
344
+ ).toBe(true)
345
+ })
346
+ })
347
+
81
348
  describe('protobuf-go-lite runtime interfaces', () => {
82
349
  it('registers CloneMessage metadata for Go type assertions', () => {
83
350
  const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
@@ -90,6 +357,56 @@ describe('protobuf-go-lite runtime interfaces', () => {
90
357
  })
91
358
  })
92
359
 
360
+ describe('protobuf-go-lite TypeScript binding helpers', () => {
361
+ it('adds message type context to binary marshal errors', () => {
362
+ const [, err] = MarshalBoundMessageVT(
363
+ BrokenBoundMessage as any,
364
+ new BrokenBoundMessage(),
365
+ )
366
+
367
+ expect(err?.Error()).toBe(
368
+ 'marshal test.BrokenBoundMessage: invalid uint 32: undefined',
369
+ )
370
+ })
371
+
372
+ it('normalizes Go byte slices before binary marshal', () => {
373
+ const [bytes, err] = MarshalBoundMessageVT(
374
+ BytesBoundMessage as any,
375
+ new BytesBoundMessage([1, 2, 3]),
376
+ )
377
+
378
+ expect(err).toBeNull()
379
+ expect(Array.from(bytes ?? [])).toEqual([9])
380
+ })
381
+
382
+ it('returns bytes written after marshaling into a sized buffer', () => {
383
+ const target = new Uint8Array([0, 0, 0])
384
+ const [n, err] = MarshalBoundMessageToSizedBufferVT(
385
+ BytesBoundMessage as any,
386
+ new BytesBoundMessage([1, 2, 3]),
387
+ target,
388
+ )
389
+
390
+ expect(err).toBeNull()
391
+ expect(n).toBe(1)
392
+ expect(Array.from(target)).toEqual([0, 0, 9])
393
+ })
394
+
395
+ it('hydrates protobuf-es-lite timestamp Date fields into Go timestamp structs', () => {
396
+ const target = new TimestampParentBoundMessage()
397
+
398
+ const err = UnmarshalBoundMessageVT(
399
+ TimestampParentBoundMessage as any,
400
+ target,
401
+ new Uint8Array(),
402
+ )
403
+
404
+ expect(err).toBeNull()
405
+ expect(target.Timestamp?.Seconds).toBe(1780230896)
406
+ expect(target.Timestamp?.Nanos).toBe(789000000)
407
+ })
408
+ })
409
+
93
410
  describe('protobuf-go-lite wire helpers', () => {
94
411
  it('encodes and decodes varints', () => {
95
412
  const buf = new Uint8Array(4)
@@ -105,9 +422,13 @@ describe('protobuf-go-lite wire helpers', () => {
105
422
  expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
106
423
  expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
107
424
  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
- ])
425
+ expect(SizeOfZigzag(-1)).toBe(1)
426
+ expect(SizeOfZigzag(1)).toBe(1)
427
+ expect(SizeOfZigzag(-64)).toBe(1)
428
+ expect(SizeOfZigzag(-65)).toBe(2)
429
+ expect(
430
+ Array.from(AppendVarint([], 0xffffffffffffffffn) as number[]),
431
+ ).toEqual([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01])
111
432
  expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
112
433
  0xffffffffffffffffn,
113
434
  10,
@@ -147,4 +468,53 @@ describe('protobuf-go-lite wire helpers', () => {
147
468
  const [, eof] = Skip(new Uint8Array([0x08, 0x80]))
148
469
  expect(eof?.Error()).toBe('unexpected EOF')
149
470
  })
471
+
472
+ it('reports helper-backed protobuf sizes', () => {
473
+ expect(SizeVarintValue(1, 300)).toBe(3)
474
+ expect(SizeVarintNonZero(1, 0)).toBe(0)
475
+ expect(SizeVarintNonZero(1, 300)).toBe(3)
476
+ expect(SizeVarintPtr(1, null)).toBe(0)
477
+ expect(SizeVarintPtr(1, $.varRef(300))).toBe(3)
478
+ expect(SizeVarintSlice(1, [1, 300])).toBe(5)
479
+ expect(SizeVarintPacked(1, [1, 300])).toBe(5)
480
+
481
+ expect(SizeZigzagValue(1, -65)).toBe(3)
482
+ expect(SizeZigzagNonZero(1, 0)).toBe(0)
483
+ expect(SizeZigzagPtr(1, $.varRef(-1))).toBe(2)
484
+ expect(SizeZigzagSlice(1, [-1, -65])).toBe(5)
485
+ expect(SizeZigzagPacked(1, [-1, -65])).toBe(5)
486
+
487
+ expect(SizeFixed32Value(1)).toBe(5)
488
+ expect(SizeFixed32NonZero(1, 0)).toBe(0)
489
+ expect(SizeFixed32Ptr(1, $.varRef(1))).toBe(5)
490
+ expect(SizeFixed32Slice(1, [1, 2])).toBe(10)
491
+ expect(SizeFixed32Packed(1, [1, 2])).toBe(10)
492
+
493
+ expect(SizeFixed64Value(1)).toBe(9)
494
+ expect(SizeFixed64NonZero(1, 0)).toBe(0)
495
+ expect(SizeFixed64Ptr(1, $.varRef(1))).toBe(9)
496
+ expect(SizeFixed64Slice(1, [1, 2])).toBe(18)
497
+ expect(SizeFixed64Packed(1, [1, 2])).toBe(18)
498
+
499
+ expect(SizeBoolValue(1)).toBe(2)
500
+ expect(SizeBoolNonZero(1, false)).toBe(0)
501
+ expect(SizeBoolPtr(1, $.varRef(false))).toBe(2)
502
+ expect(SizeBoolSlice(1, [true, false])).toBe(4)
503
+ expect(SizeBoolPacked(1, [true, false])).toBe(4)
504
+
505
+ expect(SizeStringValue(1, 'abc')).toBe(5)
506
+ expect(SizeStringNonEmpty(1, '')).toBe(0)
507
+ expect(SizeStringPtr(1, $.varRef('abc'))).toBe(5)
508
+ expect(SizeStringSlice(1, ['a', 'bc'])).toBe(7)
509
+
510
+ expect(SizeBytesValue(1, 3)).toBe(5)
511
+ expect(SizeBytesNonEmpty(1, new Uint8Array())).toBe(0)
512
+ expect(SizeBytesPresent(1, new Uint8Array())).toBe(2)
513
+ expect(
514
+ SizeBytesSlice(1, [new Uint8Array([1]), new Uint8Array([2, 3])]),
515
+ ).toBe(7)
516
+
517
+ expect(SizeMessage(1, 3)).toBe(5)
518
+ expect(SizeGroup(1, 3)).toBe(5)
519
+ })
150
520
  })