goscript 0.0.84 → 0.1.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 (428) hide show
  1. package/README.md +267 -243
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +70 -69
  5. package/cmd/goscript/cmd_compile_test.go +79 -0
  6. package/cmd/goscript/main.go +11 -5
  7. package/compiler/build-flags.go +38 -0
  8. package/compiler/compile-request.go +220 -0
  9. package/compiler/compiler.go +16 -1336
  10. package/compiler/compliance_test.go +188 -0
  11. package/compiler/config.go +6 -13
  12. package/compiler/diagnostic.go +70 -0
  13. package/compiler/gotest/owner.go +24 -0
  14. package/compiler/gotest/package-result.go +67 -0
  15. package/compiler/gotest/request.go +145 -0
  16. package/compiler/gotest/result.go +28 -0
  17. package/compiler/gotest/runner.go +588 -0
  18. package/compiler/gotest/runner_test.go +627 -0
  19. package/compiler/gotest/test.go +9 -0
  20. package/compiler/index.test.ts +28 -28
  21. package/compiler/index.ts +40 -72
  22. package/compiler/lowered-program.go +184 -0
  23. package/compiler/lowering.go +8072 -0
  24. package/compiler/override-facts.go +307 -0
  25. package/compiler/override-registry.go +283 -0
  26. package/compiler/override-registry_test.go +254 -0
  27. package/compiler/package-graph.go +254 -0
  28. package/compiler/package-graph_test.go +316 -0
  29. package/compiler/package-test-function.go +9 -0
  30. package/compiler/package-test-graph-package.go +40 -0
  31. package/compiler/package-test-graph-variant.go +105 -0
  32. package/compiler/package-test-graph.go +117 -0
  33. package/compiler/package-test-graph_test.go +144 -0
  34. package/compiler/result.go +13 -0
  35. package/compiler/runtime-contract.go +439 -0
  36. package/compiler/runtime-contract_test.go +104 -0
  37. package/compiler/semantic-model-types.go +113 -0
  38. package/compiler/semantic-model.go +1422 -0
  39. package/compiler/semantic-model_test.go +471 -0
  40. package/compiler/service.go +133 -0
  41. package/compiler/skeleton_test.go +1775 -0
  42. package/compiler/tsworkspace/owner.go +334 -0
  43. package/compiler/tsworkspace/owner_test.go +93 -0
  44. package/compiler/tsworkspace/result.go +17 -0
  45. package/compiler/typescript-emitter.go +1040 -0
  46. package/compiler/wasm/compile.go +2 -3
  47. package/compiler/wasm/compile_test.go +79 -0
  48. package/compiler/wasm_api.go +140 -124
  49. package/dist/compiler/index.d.ts +1 -3
  50. package/dist/compiler/index.js +31 -55
  51. package/dist/compiler/index.js.map +1 -1
  52. package/dist/gs/builtin/builtin.d.ts +33 -2
  53. package/dist/gs/builtin/builtin.js +217 -6
  54. package/dist/gs/builtin/builtin.js.map +1 -1
  55. package/dist/gs/builtin/channel.d.ts +11 -3
  56. package/dist/gs/builtin/channel.js +12 -0
  57. package/dist/gs/builtin/channel.js.map +1 -1
  58. package/dist/gs/builtin/hostio.d.ts +15 -1
  59. package/dist/gs/builtin/hostio.js +134 -49
  60. package/dist/gs/builtin/hostio.js.map +1 -1
  61. package/dist/gs/builtin/index.d.ts +1 -0
  62. package/dist/gs/builtin/index.js +1 -0
  63. package/dist/gs/builtin/index.js.map +1 -1
  64. package/dist/gs/builtin/slice.d.ts +23 -3
  65. package/dist/gs/builtin/slice.js +216 -44
  66. package/dist/gs/builtin/slice.js.map +1 -1
  67. package/dist/gs/builtin/type.d.ts +16 -2
  68. package/dist/gs/builtin/type.js +134 -21
  69. package/dist/gs/builtin/type.js.map +1 -1
  70. package/dist/gs/builtin/varRef.d.ts +5 -0
  71. package/dist/gs/builtin/varRef.js +23 -0
  72. package/dist/gs/builtin/varRef.js.map +1 -1
  73. package/dist/gs/bytes/buffer.gs.js +48 -44
  74. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  75. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/context/context.d.ts +5 -4
  79. package/dist/gs/context/context.js +10 -10
  80. package/dist/gs/context/context.js.map +1 -1
  81. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  82. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  83. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  84. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  85. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  86. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  87. package/dist/gs/crypto/rand/index.d.ts +5 -0
  88. package/dist/gs/crypto/rand/index.js +77 -0
  89. package/dist/gs/crypto/rand/index.js.map +1 -0
  90. package/dist/gs/embed/index.d.ts +7 -0
  91. package/dist/gs/embed/index.js +16 -0
  92. package/dist/gs/embed/index.js.map +1 -0
  93. package/dist/gs/encoding/json/index.d.ts +4 -0
  94. package/dist/gs/encoding/json/index.js +178 -0
  95. package/dist/gs/encoding/json/index.js.map +1 -0
  96. package/dist/gs/errors/errors.d.ts +4 -0
  97. package/dist/gs/errors/errors.js +81 -0
  98. package/dist/gs/errors/errors.js.map +1 -1
  99. package/dist/gs/fmt/fmt.d.ts +4 -4
  100. package/dist/gs/fmt/fmt.js +42 -11
  101. package/dist/gs/fmt/fmt.js.map +1 -1
  102. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +36 -1
  103. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
  104. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  105. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  106. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  107. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  108. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  109. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  110. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  111. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  112. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  113. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  114. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  115. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  116. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
  117. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  118. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  119. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  120. package/dist/gs/go/scanner/index.d.ts +42 -0
  121. package/dist/gs/go/scanner/index.js +155 -0
  122. package/dist/gs/go/scanner/index.js.map +1 -0
  123. package/dist/gs/go/token/index.d.ts +187 -0
  124. package/dist/gs/go/token/index.js +578 -0
  125. package/dist/gs/go/token/index.js.map +1 -0
  126. package/dist/gs/internal/abi/index.d.ts +4 -0
  127. package/dist/gs/internal/abi/index.js +10 -0
  128. package/dist/gs/internal/abi/index.js.map +1 -1
  129. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  130. package/dist/gs/internal/bytealg/index.js +14 -0
  131. package/dist/gs/internal/bytealg/index.js.map +1 -1
  132. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  133. package/dist/gs/internal/byteorder/index.js +56 -25
  134. package/dist/gs/internal/byteorder/index.js.map +1 -1
  135. package/dist/gs/internal/godebug/index.d.ts +12 -0
  136. package/dist/gs/internal/godebug/index.js +30 -0
  137. package/dist/gs/internal/godebug/index.js.map +1 -0
  138. package/dist/gs/io/fs/fs.js.map +1 -1
  139. package/dist/gs/io/fs/index.d.ts +1 -0
  140. package/dist/gs/io/fs/index.js +1 -0
  141. package/dist/gs/io/fs/index.js.map +1 -1
  142. package/dist/gs/io/fs/readdir.js.map +1 -1
  143. package/dist/gs/io/fs/readfile.js.map +1 -1
  144. package/dist/gs/io/fs/readlink.d.ts +8 -0
  145. package/dist/gs/io/fs/readlink.js +64 -0
  146. package/dist/gs/io/fs/readlink.js.map +1 -0
  147. package/dist/gs/io/fs/stat.js.map +1 -1
  148. package/dist/gs/io/fs/sub.js.map +1 -1
  149. package/dist/gs/io/fs/walk.d.ts +3 -3
  150. package/dist/gs/io/fs/walk.js +7 -7
  151. package/dist/gs/io/fs/walk.js.map +1 -1
  152. package/dist/gs/io/io.d.ts +40 -6
  153. package/dist/gs/io/io.js +151 -26
  154. package/dist/gs/io/io.js.map +1 -1
  155. package/dist/gs/maps/iter.d.ts +3 -3
  156. package/dist/gs/maps/iter.js +3 -3
  157. package/dist/gs/maps/iter.js.map +1 -1
  158. package/dist/gs/maps/maps.d.ts +2 -2
  159. package/dist/gs/maps/maps.js +1 -1
  160. package/dist/gs/maps/maps.js.map +1 -1
  161. package/dist/gs/math/bits/index.d.ts +13 -4
  162. package/dist/gs/math/bits/index.js +66 -34
  163. package/dist/gs/math/bits/index.js.map +1 -1
  164. package/dist/gs/math/const.gs.d.ts +5 -5
  165. package/dist/gs/math/const.gs.js +4 -4
  166. package/dist/gs/math/const.gs.js.map +1 -1
  167. package/dist/gs/mime/index.d.ts +1 -0
  168. package/dist/gs/mime/index.js +50 -0
  169. package/dist/gs/mime/index.js.map +1 -0
  170. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  171. package/dist/gs/net/http/httptest/index.js +21 -0
  172. package/dist/gs/net/http/httptest/index.js.map +1 -0
  173. package/dist/gs/net/http/index.d.ts +27 -0
  174. package/dist/gs/net/http/index.js +61 -0
  175. package/dist/gs/net/http/index.js.map +1 -0
  176. package/dist/gs/os/dir_unix.gs.js +2 -2
  177. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  178. package/dist/gs/os/error.gs.js +2 -4
  179. package/dist/gs/os/error.gs.js.map +1 -1
  180. package/dist/gs/os/exec.gs.js.map +1 -1
  181. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  182. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  183. package/dist/gs/os/root_js.gs.js.map +1 -1
  184. package/dist/gs/os/tempfile.gs.js +66 -9
  185. package/dist/gs/os/tempfile.gs.js.map +1 -1
  186. package/dist/gs/os/types.gs.js.map +1 -1
  187. package/dist/gs/os/types_js.gs.js +9 -9
  188. package/dist/gs/os/types_js.gs.js.map +1 -1
  189. package/dist/gs/os/types_unix.gs.js.map +1 -1
  190. package/dist/gs/path/filepath/match.js +165 -3
  191. package/dist/gs/path/filepath/match.js.map +1 -1
  192. package/dist/gs/path/filepath/path.d.ts +3 -1
  193. package/dist/gs/path/filepath/path.js +133 -4
  194. package/dist/gs/path/filepath/path.js.map +1 -1
  195. package/dist/gs/path/match.js.map +1 -1
  196. package/dist/gs/path/path.d.ts +4 -1
  197. package/dist/gs/path/path.js +16 -4
  198. package/dist/gs/path/path.js.map +1 -1
  199. package/dist/gs/reflect/index.d.ts +3 -3
  200. package/dist/gs/reflect/index.js +2 -2
  201. package/dist/gs/reflect/index.js.map +1 -1
  202. package/dist/gs/reflect/map.js +3 -0
  203. package/dist/gs/reflect/map.js.map +1 -1
  204. package/dist/gs/reflect/type.d.ts +9 -5
  205. package/dist/gs/reflect/type.js +233 -21
  206. package/dist/gs/reflect/type.js.map +1 -1
  207. package/dist/gs/reflect/types.js.map +1 -1
  208. package/dist/gs/reflect/visiblefields.js.map +1 -1
  209. package/dist/gs/runtime/debug/index.d.ts +2 -0
  210. package/dist/gs/runtime/debug/index.js +8 -0
  211. package/dist/gs/runtime/debug/index.js.map +1 -0
  212. package/dist/gs/runtime/runtime.d.ts +35 -3
  213. package/dist/gs/runtime/runtime.js +72 -0
  214. package/dist/gs/runtime/runtime.js.map +1 -1
  215. package/dist/gs/slices/slices.d.ts +24 -5
  216. package/dist/gs/slices/slices.js +214 -5
  217. package/dist/gs/slices/slices.js.map +1 -1
  218. package/dist/gs/sort/slice.gs.d.ts +3 -3
  219. package/dist/gs/sort/slice.gs.js +6 -6
  220. package/dist/gs/sort/slice.gs.js.map +1 -1
  221. package/dist/gs/sort/sort.gs.d.ts +4 -4
  222. package/dist/gs/sort/sort.gs.js +11 -8
  223. package/dist/gs/sort/sort.gs.js.map +1 -1
  224. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  225. package/dist/gs/strconv/quote.gs.js.map +1 -1
  226. package/dist/gs/strings/builder.d.ts +1 -1
  227. package/dist/gs/strings/builder.js +3 -2
  228. package/dist/gs/strings/builder.js.map +1 -1
  229. package/dist/gs/strings/reader.js.map +1 -1
  230. package/dist/gs/strings/replace.js.map +1 -1
  231. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  232. package/dist/gs/sync/atomic/type.gs.js +0 -2
  233. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  234. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  235. package/dist/gs/sync/sync.d.ts +3 -0
  236. package/dist/gs/sync/sync.js +39 -0
  237. package/dist/gs/sync/sync.js.map +1 -1
  238. package/dist/gs/syscall/constants.d.ts +36 -24
  239. package/dist/gs/syscall/constants.js +12 -0
  240. package/dist/gs/syscall/constants.js.map +1 -1
  241. package/dist/gs/syscall/errors.d.ts +2 -0
  242. package/dist/gs/syscall/errors.js +8 -0
  243. package/dist/gs/syscall/errors.js.map +1 -1
  244. package/dist/gs/syscall/fs.d.ts +43 -0
  245. package/dist/gs/syscall/fs.js +102 -0
  246. package/dist/gs/syscall/fs.js.map +1 -1
  247. package/dist/gs/syscall/js/index.d.ts +90 -0
  248. package/dist/gs/syscall/js/index.js +375 -0
  249. package/dist/gs/syscall/js/index.js.map +1 -0
  250. package/dist/gs/syscall/types.d.ts +22 -0
  251. package/dist/gs/syscall/types.js +45 -1
  252. package/dist/gs/syscall/types.js.map +1 -1
  253. package/dist/gs/testing/index.d.ts +1 -0
  254. package/dist/gs/testing/index.js +2 -0
  255. package/dist/gs/testing/index.js.map +1 -0
  256. package/dist/gs/testing/testing.d.ts +77 -0
  257. package/dist/gs/testing/testing.js +301 -0
  258. package/dist/gs/testing/testing.js.map +1 -0
  259. package/dist/gs/time/time.d.ts +41 -4
  260. package/dist/gs/time/time.js +205 -36
  261. package/dist/gs/time/time.js.map +1 -1
  262. package/dist/gs/unicode/unicode.d.ts +23 -1
  263. package/dist/gs/unicode/unicode.js +79 -10
  264. package/dist/gs/unicode/unicode.js.map +1 -1
  265. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  266. package/dist/gs/unicode/utf8/utf8.js +24 -11
  267. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  268. package/dist/gs/unique/index.d.ts +11 -0
  269. package/dist/gs/unique/index.js +71 -0
  270. package/dist/gs/unique/index.js.map +1 -0
  271. package/go.mod +2 -2
  272. package/go.sum +9 -0
  273. package/gs/builtin/builtin.ts +266 -8
  274. package/gs/builtin/channel.ts +22 -0
  275. package/gs/builtin/hostio.test.ts +177 -0
  276. package/gs/builtin/hostio.ts +171 -56
  277. package/gs/builtin/index.ts +1 -0
  278. package/gs/builtin/runtime-contract.test.ts +356 -0
  279. package/gs/builtin/slice.ts +259 -50
  280. package/gs/builtin/type.ts +188 -30
  281. package/gs/builtin/varRef.ts +38 -1
  282. package/gs/bytes/buffer.gs.ts +48 -44
  283. package/gs/bytes/meta.json +8 -3
  284. package/gs/bytes/reader.gs.ts +20 -19
  285. package/gs/context/context.test.ts +41 -0
  286. package/gs/context/context.ts +22 -26
  287. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  288. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  289. package/gs/crypto/rand/index.test.ts +32 -0
  290. package/gs/crypto/rand/index.ts +90 -0
  291. package/gs/crypto/rand/meta.json +5 -0
  292. package/gs/embed/index.ts +20 -0
  293. package/gs/embed/meta.json +5 -0
  294. package/gs/encoding/json/index.test.ts +79 -0
  295. package/gs/encoding/json/index.ts +210 -0
  296. package/gs/errors/errors.test.ts +82 -0
  297. package/gs/errors/errors.ts +104 -0
  298. package/gs/fmt/fmt.ts +56 -16
  299. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
  300. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
  301. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  302. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  303. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  304. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  305. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
  306. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  307. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  308. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  309. package/gs/go/internal/scannerhooks/index.ts +9 -0
  310. package/gs/go/scanner/index.test.ts +72 -0
  311. package/gs/go/scanner/index.ts +204 -0
  312. package/gs/go/token/index.test.ts +67 -0
  313. package/gs/go/token/index.ts +686 -0
  314. package/gs/internal/abi/index.test.ts +18 -0
  315. package/gs/internal/abi/index.ts +14 -0
  316. package/gs/internal/bytealg/index.test.ts +18 -0
  317. package/gs/internal/bytealg/index.ts +16 -0
  318. package/gs/internal/byteorder/index.test.ts +39 -0
  319. package/gs/internal/byteorder/index.ts +100 -27
  320. package/gs/internal/godebug/index.test.ts +16 -0
  321. package/gs/internal/godebug/index.ts +35 -0
  322. package/gs/io/fs/index.ts +1 -0
  323. package/gs/io/fs/meta.json +5 -0
  324. package/gs/io/fs/readlink.test.ts +43 -0
  325. package/gs/io/fs/readlink.ts +77 -0
  326. package/gs/io/fs/walk.test.ts +61 -0
  327. package/gs/io/fs/walk.ts +9 -9
  328. package/gs/io/io.ts +174 -31
  329. package/gs/io/meta.json +10 -2
  330. package/gs/maps/iter.ts +12 -6
  331. package/gs/maps/maps.ts +8 -6
  332. package/gs/math/bits/index.ts +103 -47
  333. package/gs/math/const.gs.test.ts +11 -5
  334. package/gs/math/const.gs.ts +5 -6
  335. package/gs/mime/index.ts +54 -0
  336. package/gs/net/http/httptest/index.ts +25 -0
  337. package/gs/net/http/index.test.ts +20 -0
  338. package/gs/net/http/index.ts +81 -0
  339. package/gs/os/dir_unix.gs.ts +2 -3
  340. package/gs/os/file_unix_js.test.ts +50 -0
  341. package/gs/os/meta.json +1 -2
  342. package/gs/os/tempfile.gs.test.ts +85 -0
  343. package/gs/os/tempfile.gs.ts +71 -11
  344. package/gs/os/types_js.gs.ts +11 -11
  345. package/gs/path/filepath/match.test.ts +31 -12
  346. package/gs/path/filepath/match.ts +178 -3
  347. package/gs/path/filepath/path.test.ts +25 -0
  348. package/gs/path/filepath/path.ts +159 -5
  349. package/gs/path/path.ts +20 -5
  350. package/gs/reflect/index.ts +2 -1
  351. package/gs/reflect/map.test.ts +19 -0
  352. package/gs/reflect/map.ts +4 -0
  353. package/gs/reflect/type.ts +298 -29
  354. package/gs/reflect/typefor.test.ts +75 -0
  355. package/gs/runtime/debug/index.test.ts +24 -0
  356. package/gs/runtime/debug/index.ts +8 -0
  357. package/gs/runtime/runtime.test.ts +19 -0
  358. package/gs/runtime/runtime.ts +98 -3
  359. package/gs/slices/slices.test.ts +94 -0
  360. package/gs/slices/slices.ts +245 -5
  361. package/gs/sort/meta.json +7 -0
  362. package/gs/sort/slice.gs.ts +16 -7
  363. package/gs/sort/sort.gs.ts +16 -13
  364. package/gs/strings/builder.ts +4 -3
  365. package/gs/sync/atomic/type.gs.ts +13 -14
  366. package/gs/sync/meta.json +3 -1
  367. package/gs/sync/sync.test.ts +36 -0
  368. package/gs/sync/sync.ts +39 -0
  369. package/gs/syscall/constants.ts +39 -24
  370. package/gs/syscall/errors.ts +10 -0
  371. package/gs/syscall/fs.ts +195 -0
  372. package/gs/syscall/js/index.ts +458 -0
  373. package/gs/syscall/js/meta.json +4 -0
  374. package/gs/syscall/net.test.ts +85 -0
  375. package/gs/syscall/types.ts +56 -0
  376. package/gs/testing/index.ts +1 -0
  377. package/gs/testing/meta.json +5 -0
  378. package/gs/testing/testing.test.ts +90 -0
  379. package/gs/testing/testing.ts +382 -0
  380. package/gs/time/time.test.ts +106 -0
  381. package/gs/time/time.ts +278 -57
  382. package/gs/unicode/unicode.test.ts +25 -0
  383. package/gs/unicode/unicode.ts +119 -9
  384. package/gs/unicode/utf8/utf8.test.ts +13 -0
  385. package/gs/unicode/utf8/utf8.ts +28 -16
  386. package/gs/unique/index.ts +91 -0
  387. package/package.json +14 -13
  388. package/compiler/analysis.go +0 -3475
  389. package/compiler/analysis_test.go +0 -338
  390. package/compiler/assignment.go +0 -580
  391. package/compiler/builtin_test.go +0 -92
  392. package/compiler/code-writer.go +0 -115
  393. package/compiler/compiler_test.go +0 -149
  394. package/compiler/composite-lit.go +0 -779
  395. package/compiler/config_test.go +0 -62
  396. package/compiler/constraint.go +0 -86
  397. package/compiler/decl.go +0 -801
  398. package/compiler/expr-call-async.go +0 -188
  399. package/compiler/expr-call-builtins.go +0 -208
  400. package/compiler/expr-call-helpers.go +0 -382
  401. package/compiler/expr-call-make.go +0 -318
  402. package/compiler/expr-call-type-conversion.go +0 -520
  403. package/compiler/expr-call.go +0 -413
  404. package/compiler/expr-selector.go +0 -343
  405. package/compiler/expr-star.go +0 -82
  406. package/compiler/expr-type.go +0 -442
  407. package/compiler/expr-value.go +0 -89
  408. package/compiler/expr.go +0 -773
  409. package/compiler/field.go +0 -183
  410. package/compiler/gs_dependencies_test.go +0 -298
  411. package/compiler/lit.go +0 -322
  412. package/compiler/output.go +0 -72
  413. package/compiler/primitive.go +0 -149
  414. package/compiler/protobuf.go +0 -697
  415. package/compiler/sanitize.go +0 -100
  416. package/compiler/spec-struct.go +0 -995
  417. package/compiler/spec-value.go +0 -540
  418. package/compiler/spec.go +0 -725
  419. package/compiler/stmt-assign.go +0 -664
  420. package/compiler/stmt-for.go +0 -266
  421. package/compiler/stmt-range.go +0 -475
  422. package/compiler/stmt-select.go +0 -262
  423. package/compiler/stmt-type-switch.go +0 -147
  424. package/compiler/stmt.go +0 -1308
  425. package/compiler/type-assert.go +0 -386
  426. package/compiler/type-info.go +0 -156
  427. package/compiler/type-utils.go +0 -207
  428. package/compiler/type.go +0 -892
@@ -0,0 +1,1005 @@
1
+ import * as $ from '../../../../builtin/index.js'
2
+ import * as time from '../../../../time/index.js'
3
+
4
+ export interface FieldMask {
5
+ GetPaths(): $.Slice<string>
6
+ }
7
+
8
+ export interface Marshaler {
9
+ MarshalProtoJSON(s: MarshalState | null): void
10
+ }
11
+
12
+ export interface Unmarshaler {
13
+ UnmarshalProtoJSON(s: UnmarshalState | null): void
14
+ }
15
+
16
+ type JSONRecord = Record<string, unknown>
17
+
18
+ export class JsonStream {
19
+ private chunks: string[] = []
20
+ private err: $.GoError = null
21
+
22
+ constructor(_writer?: unknown) {}
23
+
24
+ public Error(): $.GoError {
25
+ return this.err
26
+ }
27
+
28
+ public Write(p: $.Slice<number>): [number, $.GoError] {
29
+ this.chunks.push(bytesToString(p))
30
+ return [$.len(p), null]
31
+ }
32
+
33
+ public WriteArrayEnd(): void {
34
+ this.chunks.push(']')
35
+ }
36
+
37
+ public WriteArrayStart(): void {
38
+ this.chunks.push('[')
39
+ }
40
+
41
+ public WriteBool(b: boolean): void {
42
+ this.chunks.push(JSON.stringify(b))
43
+ }
44
+
45
+ public WriteFloat32(f: number): void {
46
+ this.WriteFloat64(f)
47
+ }
48
+
49
+ public WriteFloat64(f: number): void {
50
+ if (Number.isNaN(f)) {
51
+ this.WriteString('NaN')
52
+ return
53
+ }
54
+ if (f === Infinity) {
55
+ this.WriteString('Infinity')
56
+ return
57
+ }
58
+ if (f === -Infinity) {
59
+ this.WriteString('-Infinity')
60
+ return
61
+ }
62
+ this.chunks.push(JSON.stringify(f))
63
+ }
64
+
65
+ public WriteInt32(i: number): void {
66
+ this.chunks.push(JSON.stringify(i))
67
+ }
68
+
69
+ public WriteMore(): void {
70
+ this.chunks.push(',')
71
+ }
72
+
73
+ public WriteNil(): void {
74
+ this.chunks.push('null')
75
+ }
76
+
77
+ public WriteObjectEnd(): void {
78
+ this.chunks.push('}')
79
+ }
80
+
81
+ public WriteObjectField(field: string): void {
82
+ this.WriteString(field)
83
+ this.chunks.push(':')
84
+ }
85
+
86
+ public WriteObjectStart(): void {
87
+ this.chunks.push('{')
88
+ }
89
+
90
+ public WriteString(str: string): void {
91
+ this.chunks.push(JSON.stringify(str))
92
+ }
93
+
94
+ public WriteUint32(u: number): void {
95
+ this.chunks.push(JSON.stringify(u))
96
+ }
97
+
98
+ public String(): string {
99
+ return this.chunks.join('')
100
+ }
101
+ }
102
+
103
+ export class MarshalerConfig {
104
+ public EnumsAsInts = true
105
+ public AnyTypeResolver: unknown = null
106
+
107
+ constructor(init?: Partial<MarshalerConfig>) {
108
+ Object.assign(this, init)
109
+ }
110
+
111
+ public clone(): MarshalerConfig {
112
+ return new MarshalerConfig({
113
+ EnumsAsInts: this.EnumsAsInts,
114
+ AnyTypeResolver: this.AnyTypeResolver,
115
+ })
116
+ }
117
+
118
+ public Marshal(m: Marshaler | null): [$.Slice<number>, $.GoError] {
119
+ const stream = new JsonStream()
120
+ const state = new MarshalState({ config: this, stream })
121
+ if (m == null) {
122
+ state.WriteNil()
123
+ } else {
124
+ m.MarshalProtoJSON(state)
125
+ }
126
+ if (state.Err() != null) {
127
+ return [null, state.Err()]
128
+ }
129
+ return [stringToBytes(stream.String()), null]
130
+ }
131
+ }
132
+
133
+ export class UnmarshalerConfig {
134
+ public AnyTypeResolver: unknown = null
135
+
136
+ constructor(init?: Partial<UnmarshalerConfig>) {
137
+ Object.assign(this, init)
138
+ }
139
+
140
+ public clone(): UnmarshalerConfig {
141
+ return new UnmarshalerConfig({ AnyTypeResolver: this.AnyTypeResolver })
142
+ }
143
+
144
+ public Unmarshal(data: $.Slice<number>, m: Unmarshaler | null): $.GoError {
145
+ const state = NewUnmarshalState(data, this)
146
+ if (state == null) {
147
+ return $.newError('json: failed to allocate unmarshal state')
148
+ }
149
+ m?.UnmarshalProtoJSON(state)
150
+ return state.Err()
151
+ }
152
+ }
153
+
154
+ export const DefaultMarshalerConfig = new MarshalerConfig()
155
+ export const DefaultUnmarshalerConfig = new UnmarshalerConfig()
156
+
157
+ export class MarshalState {
158
+ private configValue: MarshalerConfig
159
+ private stream: JsonStream
160
+ private err: $.GoError = null
161
+ private fields = new Set<string>()
162
+
163
+ constructor(init?: Partial<{ config: MarshalerConfig; stream: JsonStream }>) {
164
+ this.configValue = init?.config?.clone() ?? DefaultMarshalerConfig.clone()
165
+ this.stream = init?.stream ?? new JsonStream()
166
+ }
167
+
168
+ public AnyTypeResolver(): unknown {
169
+ return this.configValue.AnyTypeResolver
170
+ }
171
+
172
+ public Config(): MarshalerConfig {
173
+ return this.configValue.clone()
174
+ }
175
+
176
+ public Err(): $.GoError {
177
+ return this.err ?? this.stream.Error()
178
+ }
179
+
180
+ public HasField(field: string): boolean {
181
+ return this.fields.has(field)
182
+ }
183
+
184
+ public SetError(err: $.GoError): void {
185
+ this.err = err
186
+ }
187
+
188
+ public SetErrorf(format: string, ...args: unknown[]): void {
189
+ this.err = $.newError(formatError(format, args))
190
+ }
191
+
192
+ public Sub(js: JsonStream | null): MarshalState | null {
193
+ return new MarshalState({ config: this.configValue, stream: js ?? new JsonStream() })
194
+ }
195
+
196
+ public WithField(field: string): MarshalState | null {
197
+ const next = new MarshalState({ config: this.configValue, stream: this.stream })
198
+ next.fields = new Set(this.fields)
199
+ next.fields.add(field)
200
+ return next
201
+ }
202
+
203
+ public WithFieldMask(...paths: string[]): MarshalState | null {
204
+ const next = new MarshalState({ config: this.configValue, stream: this.stream })
205
+ next.fields = new Set([...this.fields, ...paths])
206
+ return next
207
+ }
208
+
209
+ public Write(v: $.Slice<number>): [number, $.GoError] {
210
+ return this.stream.Write(v)
211
+ }
212
+
213
+ public WriteArrayEnd(): void {
214
+ this.stream.WriteArrayEnd()
215
+ }
216
+
217
+ public WriteArrayStart(): void {
218
+ this.stream.WriteArrayStart()
219
+ }
220
+
221
+ public WriteBool(v: boolean): void {
222
+ this.stream.WriteBool(v)
223
+ }
224
+
225
+ public WriteBoolArray(vs: $.Slice<boolean>): void {
226
+ this.writeArray(vs, (v) => this.WriteBool(v))
227
+ }
228
+
229
+ public WriteBytes(v: $.Slice<number>): void {
230
+ this.WriteString(base64Encode(v))
231
+ }
232
+
233
+ public WriteBytesArray(vs: $.Slice<$.Slice<number>>): void {
234
+ this.writeArray(vs, (v) => this.WriteBytes(v))
235
+ }
236
+
237
+ public WriteDuration(x: number): void {
238
+ this.WriteString(`${x}s`)
239
+ }
240
+
241
+ public WriteEnum(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): void {
242
+ if (this.configValue.EnumsAsInts) {
243
+ this.WriteEnumNumber(x)
244
+ return
245
+ }
246
+ this.WriteEnumString(x, ...valueMaps)
247
+ }
248
+
249
+ public WriteEnumNumber(x: number): void {
250
+ this.WriteInt32(x)
251
+ }
252
+
253
+ public WriteEnumString(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): void {
254
+ const value = enumStringValue(x, valueMaps)
255
+ if (value == null) {
256
+ this.WriteEnumNumber(x)
257
+ return
258
+ }
259
+ this.WriteString(value)
260
+ }
261
+
262
+ public WriteFieldMask(x: FieldMask | null): void {
263
+ this.WriteString(sliceValues(x?.GetPaths()).join(','))
264
+ }
265
+
266
+ public WriteFloat32(v: number): void {
267
+ this.stream.WriteFloat32(v)
268
+ }
269
+
270
+ public WriteFloat32Array(vs: $.Slice<number>): void {
271
+ this.writeArray(vs, (v) => this.WriteFloat32(v))
272
+ }
273
+
274
+ public WriteFloat64(v: number): void {
275
+ this.stream.WriteFloat64(v)
276
+ }
277
+
278
+ public WriteFloat64Array(vs: $.Slice<number>): void {
279
+ this.writeArray(vs, (v) => this.WriteFloat64(v))
280
+ }
281
+
282
+ public WriteInt32(v: number): void {
283
+ this.stream.WriteInt32(v)
284
+ }
285
+
286
+ public WriteInt32Array(vs: $.Slice<number>): void {
287
+ this.writeArray(vs, (v) => this.WriteInt32(v))
288
+ }
289
+
290
+ public WriteInt64(v: number): void {
291
+ this.WriteString(String(Math.trunc(v)))
292
+ }
293
+
294
+ public WriteInt64Array(vs: $.Slice<number>): void {
295
+ this.writeArray(vs, (v) => this.WriteInt64(v))
296
+ }
297
+
298
+ public WriteLegacyFieldMask(x: FieldMask | null): void {
299
+ this.WriteFieldMask(x)
300
+ }
301
+
302
+ public WriteMore(): void {
303
+ this.stream.WriteMore()
304
+ }
305
+
306
+ public WriteMoreIf(b: $.VarRef<boolean> | boolean): void {
307
+ const value = typeof b === 'boolean' ? b : b.value
308
+ if (value) {
309
+ this.WriteMore()
310
+ return
311
+ }
312
+ if (typeof b !== 'boolean') {
313
+ b.value = true
314
+ }
315
+ }
316
+
317
+ public WriteNil(): void {
318
+ this.stream.WriteNil()
319
+ }
320
+
321
+ public WriteObjectBoolField(field: boolean): void {
322
+ this.WriteObjectField(String(field))
323
+ }
324
+
325
+ public WriteObjectEnd(): void {
326
+ this.stream.WriteObjectEnd()
327
+ }
328
+
329
+ public WriteObjectField(field: string): void {
330
+ this.stream.WriteObjectField(field)
331
+ }
332
+
333
+ public WriteObjectInt32Field(field: number): void {
334
+ this.WriteObjectField(String(Math.trunc(field)))
335
+ }
336
+
337
+ public WriteObjectInt64Field(field: number): void {
338
+ this.WriteObjectField(String(Math.trunc(field)))
339
+ }
340
+
341
+ public WriteObjectStart(): void {
342
+ this.stream.WriteObjectStart()
343
+ }
344
+
345
+ public WriteObjectStringField(field: string): void {
346
+ this.WriteObjectField(field)
347
+ }
348
+
349
+ public WriteObjectUint32Field(field: number): void {
350
+ this.WriteObjectField(String(Math.trunc(field)))
351
+ }
352
+
353
+ public WriteObjectUint64Field(field: number): void {
354
+ this.WriteObjectField(String(Math.trunc(field)))
355
+ }
356
+
357
+ public WriteString(v: string): void {
358
+ this.stream.WriteString(v)
359
+ }
360
+
361
+ public WriteStringArray(vs: $.Slice<string>): void {
362
+ this.writeArray(vs, (v) => this.WriteString(v))
363
+ }
364
+
365
+ public WriteTime(x: time.Time | $.VarRef<time.Time> | null): void {
366
+ this.WriteString($.pointerValue<time.Time>(x).Format(time.RFC3339Nano))
367
+ }
368
+
369
+ public WriteUint32(v: number): void {
370
+ this.stream.WriteUint32(v)
371
+ }
372
+
373
+ public WriteUint32Array(vs: $.Slice<number>): void {
374
+ this.writeArray(vs, (v) => this.WriteUint32(v))
375
+ }
376
+
377
+ public WriteUint64(v: number): void {
378
+ this.WriteString(String(Math.trunc(v)))
379
+ }
380
+
381
+ public WriteUint64Array(vs: $.Slice<number>): void {
382
+ this.writeArray(vs, (v) => this.WriteUint64(v))
383
+ }
384
+
385
+ private writeArray<T>(values: $.Slice<T>, writeValue: (value: T) => void): void {
386
+ this.WriteArrayStart()
387
+ let wrote = false
388
+ for (const value of sliceValues(values)) {
389
+ if (wrote) {
390
+ this.WriteMore()
391
+ }
392
+ wrote = true
393
+ writeValue(value)
394
+ }
395
+ this.WriteArrayEnd()
396
+ }
397
+ }
398
+
399
+ export class UnmarshalState {
400
+ private configValue: UnmarshalerConfig
401
+ private value: unknown
402
+ private root: UnmarshalState
403
+ private err: $.GoError = null
404
+ private fieldMaskPaths: Set<string>
405
+ private path: string[]
406
+ private objectEntries: Array<[string, unknown]> | null = null
407
+ private objectIndex = 0
408
+
409
+ constructor(init?: Partial<{
410
+ config: UnmarshalerConfig
411
+ value: unknown
412
+ root: UnmarshalState
413
+ fieldMaskPaths: Set<string>
414
+ path: string[]
415
+ }>) {
416
+ this.configValue = init?.config?.clone() ?? DefaultUnmarshalerConfig.clone()
417
+ this.value = init?.value ?? null
418
+ this.root = init?.root ?? this
419
+ this.fieldMaskPaths = init?.fieldMaskPaths ?? new Set<string>()
420
+ this.path = init?.path ?? []
421
+ }
422
+
423
+ public AddField(field: string): void {
424
+ this.fieldMaskPaths.add([...this.path, field].join('.'))
425
+ }
426
+
427
+ public AnyTypeResolver(): unknown {
428
+ return this.configValue.AnyTypeResolver
429
+ }
430
+
431
+ public Config(): UnmarshalerConfig {
432
+ return this.configValue.clone()
433
+ }
434
+
435
+ public Err(): $.GoError {
436
+ return this.root.err
437
+ }
438
+
439
+ public FieldMask(): FieldMask | null {
440
+ const paths = Array.from(this.fieldMaskPaths)
441
+ return { GetPaths: () => $.arrayToSlice(paths) }
442
+ }
443
+
444
+ public ReadArray(cb: (() => void) | null): void {
445
+ if (!Array.isArray(this.value)) {
446
+ this.SetErrorf('expected JSON array')
447
+ return
448
+ }
449
+ const original = this.value
450
+ for (const item of this.value) {
451
+ this.value = item
452
+ cb?.()
453
+ if (this.Err() != null) {
454
+ break
455
+ }
456
+ }
457
+ this.value = original
458
+ }
459
+
460
+ public ReadBool(): boolean {
461
+ return this.value === true
462
+ }
463
+
464
+ public ReadBoolArray(): $.Slice<boolean> {
465
+ return this.readArrayValues(() => this.ReadBool())
466
+ }
467
+
468
+ public ReadBoolMap(cb: ((key: boolean) => void) | null): void {
469
+ this.readMapKeys((key) => {
470
+ const parsed = parseBoolMapKey(key)
471
+ if (parsed == null) {
472
+ this.SetErrorf('invalid map key %q for bool map', key)
473
+ return
474
+ }
475
+ cb?.(parsed)
476
+ })
477
+ }
478
+
479
+ public ReadBytes(): $.Slice<number> {
480
+ return base64Decode(this.ReadString())
481
+ }
482
+
483
+ public ReadBytesArray(): $.Slice<$.Slice<number>> {
484
+ return this.readArrayValues(() => this.ReadBytes())
485
+ }
486
+
487
+ public ReadDuration(): $.VarRef<number> | null {
488
+ return $.varRef(numberFromJSON(this.value))
489
+ }
490
+
491
+ public ReadEnum(...valueMaps: Array<Map<string, number> | Record<string, number> | null>): number {
492
+ if (typeof this.value === 'number') {
493
+ return Math.trunc(this.value)
494
+ }
495
+ if (typeof this.value === 'string') {
496
+ for (const valueMap of valueMaps) {
497
+ const mapped = lookupStringMap(valueMap, this.value)
498
+ if (mapped !== undefined) {
499
+ return mapped
500
+ }
501
+ }
502
+ return Math.trunc(Number(this.value) || 0)
503
+ }
504
+ return 0
505
+ }
506
+
507
+ public ReadFieldMask(): FieldMask | null {
508
+ const paths = typeof this.value === 'string'
509
+ ? this.value.split(',').filter((part) => part !== '')
510
+ : Array.isArray(recordValue(this.value)?.paths)
511
+ ? sliceValues(recordValue(this.value)?.paths as $.Slice<string>)
512
+ : []
513
+ return { GetPaths: () => $.arrayToSlice(paths) }
514
+ }
515
+
516
+ public ReadFloat32(): number {
517
+ return numberFromJSON(this.value)
518
+ }
519
+
520
+ public ReadFloat32Array(): $.Slice<number> {
521
+ return this.readArrayValues(() => this.ReadFloat32())
522
+ }
523
+
524
+ public ReadFloat64(): number {
525
+ return numberFromJSON(this.value)
526
+ }
527
+
528
+ public ReadFloat64Array(): $.Slice<number> {
529
+ return this.readArrayValues(() => this.ReadFloat64())
530
+ }
531
+
532
+ public ReadInt32(): number {
533
+ return Math.trunc(numberFromJSON(this.value))
534
+ }
535
+
536
+ public ReadInt32Array(): $.Slice<number> {
537
+ return this.readArrayValues(() => this.ReadInt32())
538
+ }
539
+
540
+ public ReadInt32Map(cb: ((key: number) => void) | null): void {
541
+ this.readMapKeys((key) => {
542
+ const parsed = parseSignedMapKey(key, 32)
543
+ if (parsed == null) {
544
+ this.SetErrorf('invalid map key %q for int32 map', key)
545
+ return
546
+ }
547
+ cb?.(parsed)
548
+ })
549
+ }
550
+
551
+ public ReadInt64(): number {
552
+ return Math.trunc(numberFromJSON(this.value))
553
+ }
554
+
555
+ public ReadInt64Array(): $.Slice<number> {
556
+ return this.readArrayValues(() => this.ReadInt64())
557
+ }
558
+
559
+ public ReadInt64Map(cb: ((key: number) => void) | null): void {
560
+ this.readMapKeys((key) => {
561
+ const parsed = parseSignedMapKey(key, 64)
562
+ if (parsed == null) {
563
+ this.SetErrorf('invalid map key %q for int64 map', key)
564
+ return
565
+ }
566
+ cb?.(parsed)
567
+ })
568
+ }
569
+
570
+ public ReadNil(): boolean {
571
+ return this.value === null
572
+ }
573
+
574
+ public ReadObject(cb: ((key: string) => void) | null): void {
575
+ const record = recordValue(this.value)
576
+ if (record == null) {
577
+ this.SetErrorf('expected JSON object')
578
+ return
579
+ }
580
+ const original = this.value
581
+ for (const key of Object.keys(record)) {
582
+ this.value = record[key]
583
+ cb?.(key)
584
+ if (this.Err() != null) {
585
+ break
586
+ }
587
+ }
588
+ this.value = original
589
+ }
590
+
591
+ public ReadObjectField(): string {
592
+ const record = recordValue(this.value)
593
+ if (record == null) {
594
+ this.SetErrorf('expected JSON object')
595
+ return ''
596
+ }
597
+ if (this.objectEntries == null) {
598
+ this.objectEntries = Object.entries(record)
599
+ this.objectIndex = 0
600
+ }
601
+ if (this.objectIndex >= this.objectEntries.length) {
602
+ return ''
603
+ }
604
+ const [key, value] = this.objectEntries[this.objectIndex]
605
+ this.objectIndex++
606
+ this.value = value
607
+ return key
608
+ }
609
+
610
+ public ReadString(): string {
611
+ if (typeof this.value === 'string') {
612
+ return this.value
613
+ }
614
+ if (this.value == null) {
615
+ return ''
616
+ }
617
+ return String(this.value)
618
+ }
619
+
620
+ public ReadStringArray(): $.Slice<string> {
621
+ return this.readArrayValues(() => this.ReadString())
622
+ }
623
+
624
+ public ReadStringMap(cb: ((key: string) => void) | null): void {
625
+ this.readMapKeys((key) => cb?.(key))
626
+ }
627
+
628
+ public ReadTime(): $.VarRef<time.Time> | null {
629
+ const [parsed, err] = time.Parse(time.RFC3339, this.ReadString())
630
+ if (err != null) {
631
+ this.SetError(err)
632
+ }
633
+ return $.varRef($.markAsStructValue($.cloneStructValue(parsed)))
634
+ }
635
+
636
+ public ReadUint32(): number {
637
+ return Math.trunc(Math.max(0, numberFromJSON(this.value)))
638
+ }
639
+
640
+ public ReadUint32Array(): $.Slice<number> {
641
+ return this.readArrayValues(() => this.ReadUint32())
642
+ }
643
+
644
+ public ReadUint32Map(cb: ((key: number) => void) | null): void {
645
+ this.readMapKeys((key) => {
646
+ const parsed = parseUnsignedMapKey(key, 32)
647
+ if (parsed == null) {
648
+ this.SetErrorf('invalid map key %q for uint32 map', key)
649
+ return
650
+ }
651
+ cb?.(parsed)
652
+ })
653
+ }
654
+
655
+ public ReadUint64(): number {
656
+ return this.ReadUint32()
657
+ }
658
+
659
+ public ReadUint64Array(): $.Slice<number> {
660
+ return this.readArrayValues(() => this.ReadUint64())
661
+ }
662
+
663
+ public ReadUint64Map(cb: ((key: number) => void) | null): void {
664
+ this.readMapKeys((key) => {
665
+ const parsed = parseUnsignedMapKey(key, 64)
666
+ if (parsed == null) {
667
+ this.SetErrorf('invalid map key %q for uint64 map', key)
668
+ return
669
+ }
670
+ cb?.(parsed)
671
+ })
672
+ }
673
+
674
+ public ReadWrappedBool(): boolean { return this.readWrapped(() => this.ReadBool()) }
675
+ public ReadWrappedBytes(): $.Slice<number> { return this.readWrapped(() => this.ReadBytes()) }
676
+ public ReadWrappedFloat32(): number { return this.readWrapped(() => this.ReadFloat32()) }
677
+ public ReadWrappedFloat64(): number { return this.readWrapped(() => this.ReadFloat64()) }
678
+ public ReadWrappedInt32(): number { return this.readWrapped(() => this.ReadInt32()) }
679
+ public ReadWrappedInt64(): number { return this.readWrapped(() => this.ReadInt64()) }
680
+ public ReadWrappedString(): string { return this.readWrapped(() => this.ReadString()) }
681
+ public ReadWrappedUint32(): number { return this.readWrapped(() => this.ReadUint32()) }
682
+ public ReadWrappedUint64(): number { return this.readWrapped(() => this.ReadUint64()) }
683
+
684
+ public SetError(err: $.GoError): void {
685
+ this.root.err = err
686
+ }
687
+
688
+ public SetErrorf(format: string, ...args: unknown[]): void {
689
+ this.SetError($.newError(formatError(format, args)))
690
+ }
691
+
692
+ public Skip(): void {}
693
+
694
+ public SkipAndAppendBytes(p: $.Slice<number>): $.Slice<number> {
695
+ const encoded = new TextEncoder().encode(JSON.stringify(this.value))
696
+ return $.append(p, encoded)
697
+ }
698
+
699
+ public SkipAndReturnBytes(): $.Slice<number> {
700
+ return stringToBytes(JSON.stringify(this.value))
701
+ }
702
+
703
+ public Sub(data: $.Slice<number>): UnmarshalState | null {
704
+ return NewUnmarshalState(data, this.configValue)
705
+ }
706
+
707
+ public WhatIsNext(): number {
708
+ if (this.value === null) {
709
+ return 0
710
+ }
711
+ if (Array.isArray(this.value)) {
712
+ return 1
713
+ }
714
+ if (typeof this.value === 'object') {
715
+ return 2
716
+ }
717
+ if (typeof this.value === 'string') {
718
+ return 3
719
+ }
720
+ if (typeof this.value === 'number') {
721
+ return 4
722
+ }
723
+ if (typeof this.value === 'boolean') {
724
+ return 5
725
+ }
726
+ return 0
727
+ }
728
+
729
+ public WithField(_field: string, _mask: boolean = true): UnmarshalState | null {
730
+ return new UnmarshalState({
731
+ config: this.configValue,
732
+ value: this.value,
733
+ root: this.root,
734
+ fieldMaskPaths: _mask ? this.fieldMaskPaths : new Set<string>(),
735
+ path: [...this.path, _field],
736
+ })
737
+ }
738
+
739
+ private readArrayValues<T>(read: () => T): $.Slice<T> {
740
+ const values: T[] = []
741
+ this.ReadArray(() => {
742
+ values.push(read())
743
+ })
744
+ return $.arrayToSlice(values)
745
+ }
746
+
747
+ private readMapKeys(cb: (key: string) => void): void {
748
+ const record = recordValue(this.value)
749
+ if (record == null) {
750
+ this.SetErrorf('expected JSON object')
751
+ return
752
+ }
753
+ const original = this.value
754
+ for (const key of Object.keys(record)) {
755
+ this.value = record[key]
756
+ cb(key)
757
+ if (this.Err() != null) {
758
+ break
759
+ }
760
+ }
761
+ this.value = original
762
+ }
763
+
764
+ private readWrapped<T>(read: () => T): T {
765
+ const record = recordValue(this.value)
766
+ if (record == null) {
767
+ return read()
768
+ }
769
+ if (!Object.hasOwn(record, 'value')) {
770
+ this.SetErrorf('first field in wrapped value is not value')
771
+ return read()
772
+ }
773
+ const keys = Object.keys(record)
774
+ if (keys.length !== 1) {
775
+ this.SetErrorf('unexpected %q field in wrapped value', keys.find((key) => key !== 'value') ?? '')
776
+ return read()
777
+ }
778
+ const original = this.value
779
+ this.value = record.value
780
+ const value = read()
781
+ this.value = original
782
+ return value
783
+ }
784
+ }
785
+
786
+ export function NewJsonStream(wr: unknown): JsonStream | null {
787
+ return new JsonStream(wr)
788
+ }
789
+
790
+ export function NewMarshalState(config: MarshalerConfig, stream: JsonStream | null): MarshalState | null {
791
+ return new MarshalState({ config, stream: stream ?? new JsonStream() })
792
+ }
793
+
794
+ export function NewUnmarshalState(data: $.Slice<number>, config: UnmarshalerConfig): UnmarshalState | null {
795
+ try {
796
+ return new UnmarshalState({ config, value: JSON.parse(bytesToString(data)) })
797
+ } catch (err) {
798
+ const state = new UnmarshalState({ config })
799
+ state.SetError($.newError(err instanceof Error ? err.message : String(err)))
800
+ return state
801
+ }
802
+ }
803
+
804
+ export function Marshal(c: MarshalerConfig, m: Marshaler | null): [$.Slice<number>, $.GoError] {
805
+ return c.Marshal(m)
806
+ }
807
+
808
+ export function MarshalMap<M extends Map<string, Marshaler> | Record<string, Marshaler>>(
809
+ _typeArgs: $.GenericTypeArgs | undefined,
810
+ c: MarshalerConfig,
811
+ mm: M,
812
+ ): [$.Slice<number>, $.GoError] {
813
+ const stream = new JsonStream()
814
+ const state = new MarshalState({ config: c, stream })
815
+ state.WriteObjectStart()
816
+ const keys = mm instanceof Map ? Array.from(mm.keys()) : Object.keys(mm)
817
+ keys.sort()
818
+ keys.forEach((key, idx) => {
819
+ if (idx !== 0) {
820
+ state.WriteMore()
821
+ }
822
+ state.WriteObjectField(key)
823
+ const value = mm instanceof Map ? mm.get(key) : mm[key]
824
+ value?.MarshalProtoJSON(state)
825
+ })
826
+ state.WriteObjectEnd()
827
+ return state.Err() == null ? [stringToBytes(stream.String()), null] : [null, state.Err()]
828
+ }
829
+
830
+ export function MarshalSlice<S extends $.Slice<Marshaler>>(
831
+ _typeArgs: $.GenericTypeArgs | undefined,
832
+ c: MarshalerConfig,
833
+ ms: S,
834
+ ): [$.Slice<number>, $.GoError] {
835
+ const stream = new JsonStream()
836
+ const state = new MarshalState({ config: c, stream })
837
+ state.WriteArrayStart()
838
+ sliceValues(ms).forEach((value, idx) => {
839
+ if (idx !== 0) {
840
+ state.WriteMore()
841
+ }
842
+ value?.MarshalProtoJSON(state)
843
+ })
844
+ state.WriteArrayEnd()
845
+ return state.Err() == null ? [stringToBytes(stream.String()), null] : [null, state.Err()]
846
+ }
847
+
848
+ export function GetEnumString(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): string {
849
+ return enumStringValue(x, valueMaps) ?? String(x)
850
+ }
851
+
852
+ export function ParseEnumString(v: string, ...valueMaps: Array<Map<string, number> | Record<string, number> | null>): [number, $.GoError] {
853
+ for (const valueMap of valueMaps) {
854
+ const value = lookupStringMap(valueMap, v)
855
+ if (value !== undefined) {
856
+ return [value, null]
857
+ }
858
+ }
859
+ const parsed = Number(v)
860
+ return Number.isFinite(parsed) ? [parsed, null] : [0, $.newError(`invalid enum ${v}`)]
861
+ }
862
+
863
+ function sliceValues<T>(values: $.Slice<T> | readonly T[] | null | undefined): T[] {
864
+ return Array.from((values ?? []) as Iterable<T>)
865
+ }
866
+
867
+ function bytesToString(bytes: $.Slice<number>): string {
868
+ return new TextDecoder().decode(new Uint8Array(sliceValues(bytes)))
869
+ }
870
+
871
+ function stringToBytes(value: string): $.Slice<number> {
872
+ return $.arrayToSlice(Array.from(new TextEncoder().encode(value)))
873
+ }
874
+
875
+ function recordValue(value: unknown): JSONRecord | null {
876
+ if (value == null || Array.isArray(value) || typeof value !== 'object') {
877
+ return null
878
+ }
879
+ return value as JSONRecord
880
+ }
881
+
882
+ function numberFromJSON(value: unknown): number {
883
+ if (typeof value === 'number') {
884
+ return value
885
+ }
886
+ if (typeof value === 'string') {
887
+ switch (value) {
888
+ case 'NaN':
889
+ return NaN
890
+ case 'Infinity':
891
+ return Infinity
892
+ case '-Infinity':
893
+ return -Infinity
894
+ default:
895
+ return Number(value) || 0
896
+ }
897
+ }
898
+ return 0
899
+ }
900
+
901
+ function parseBoolMapKey(key: string): boolean | null {
902
+ switch (key) {
903
+ case 'true':
904
+ return true
905
+ case 'false':
906
+ return false
907
+ default:
908
+ return null
909
+ }
910
+ }
911
+
912
+ function parseSignedMapKey(key: string, bits: 32 | 64): number | null {
913
+ if (!/^-?(0|[1-9]\d*)$/.test(key)) {
914
+ return null
915
+ }
916
+ const parsed = Number(key)
917
+ if (!Number.isSafeInteger(parsed)) {
918
+ return null
919
+ }
920
+ if (bits === 32 && (parsed < -2147483648 || parsed > 2147483647)) {
921
+ return null
922
+ }
923
+ return parsed
924
+ }
925
+
926
+ function parseUnsignedMapKey(key: string, bits: 32 | 64): number | null {
927
+ if (!/^(0|[1-9]\d*)$/.test(key)) {
928
+ return null
929
+ }
930
+ const parsed = Number(key)
931
+ if (!Number.isSafeInteger(parsed)) {
932
+ return null
933
+ }
934
+ if (bits === 32 && parsed > 4294967295) {
935
+ return null
936
+ }
937
+ return parsed
938
+ }
939
+
940
+ function enumStringValue(
941
+ x: number,
942
+ valueMaps: Array<Map<number, string> | Record<number, string> | null>,
943
+ ): string | null {
944
+ for (const valueMap of valueMaps) {
945
+ if (valueMap == null) {
946
+ continue
947
+ }
948
+ const value = valueMap instanceof Map ? valueMap.get(x) : valueMap[x]
949
+ if (value !== undefined) {
950
+ return value
951
+ }
952
+ }
953
+ return null
954
+ }
955
+
956
+ function lookupStringMap(valueMap: Map<string, number> | Record<string, number> | null, key: string): number | undefined {
957
+ if (valueMap == null) {
958
+ return undefined
959
+ }
960
+ return valueMap instanceof Map ? valueMap.get(key) : valueMap[key]
961
+ }
962
+
963
+ function formatError(format: string, args: unknown[]): string {
964
+ return format.replace(/%[vqsd]/g, () => String(args.shift()))
965
+ }
966
+
967
+ const base64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
968
+
969
+ function base64Encode(bytes: $.Slice<number>): string {
970
+ const data = sliceValues(bytes)
971
+ let out = ''
972
+ for (let idx = 0; idx < data.length; idx += 3) {
973
+ const a = data[idx] ?? 0
974
+ const b = data[idx + 1] ?? 0
975
+ const c = data[idx + 2] ?? 0
976
+ const triple = (a << 16) | (b << 8) | c
977
+ out += base64Alphabet[(triple >> 18) & 0x3f]
978
+ out += base64Alphabet[(triple >> 12) & 0x3f]
979
+ out += idx + 1 < data.length ? base64Alphabet[(triple >> 6) & 0x3f] : '='
980
+ out += idx + 2 < data.length ? base64Alphabet[triple & 0x3f] : '='
981
+ }
982
+ return out
983
+ }
984
+
985
+ function base64Decode(value: string): $.Slice<number> {
986
+ const normalized = value.replace(/-/g, '+').replace(/_/g, '/')
987
+ const padded = normalized + '='.repeat((4 - (normalized.length % 4)) % 4)
988
+ const bytes: number[] = []
989
+ for (let idx = 0; idx < padded.length; idx += 4) {
990
+ const chars = padded.slice(idx, idx + 4)
991
+ const a = base64Alphabet.indexOf(chars[0])
992
+ const b = base64Alphabet.indexOf(chars[1])
993
+ const c = chars[2] === '=' ? 0 : base64Alphabet.indexOf(chars[2])
994
+ const d = chars[3] === '=' ? 0 : base64Alphabet.indexOf(chars[3])
995
+ const triple = (a << 18) | (b << 12) | (c << 6) | d
996
+ bytes.push((triple >> 16) & 0xff)
997
+ if (chars[2] !== '=') {
998
+ bytes.push((triple >> 8) & 0xff)
999
+ }
1000
+ if (chars[3] !== '=') {
1001
+ bytes.push(triple & 0xff)
1002
+ }
1003
+ }
1004
+ return $.arrayToSlice(bytes)
1005
+ }