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
@@ -1,697 +0,0 @@
1
- package compiler
2
-
3
- import (
4
- "fmt"
5
- "go/ast"
6
- "go/token"
7
- "go/types"
8
- "os"
9
- "path/filepath"
10
- "strings"
11
-
12
- "golang.org/x/tools/go/packages"
13
- )
14
-
15
- // getProtobufMessageInterface attempts to find the protobuf-go-lite Message interface
16
- // from the loaded packages in analysis. Returns nil if not found.
17
- func (c *GoToTSCompiler) getProtobufMessageInterface() *types.Interface {
18
- if c.analysis == nil || c.analysis.AllPackages == nil {
19
- return nil
20
- }
21
- pkg := c.analysis.AllPackages["github.com/aperturerobotics/protobuf-go-lite"]
22
- if pkg == nil || pkg.Types == nil {
23
- return nil
24
- }
25
- obj := pkg.Types.Scope().Lookup("Message")
26
- if obj == nil {
27
- return nil
28
- }
29
- if tn, ok := obj.(*types.TypeName); ok {
30
- if iface, ok := tn.Type().Underlying().(*types.Interface); ok {
31
- return iface
32
- }
33
- }
34
- return nil
35
- }
36
-
37
- // typeHasMethods returns true if the given type's method set contains all the specified names.
38
- func (c *GoToTSCompiler) typeHasMethods(t types.Type, names ...string) bool {
39
- mset := types.NewMethodSet(t)
40
- for _, name := range names {
41
- if mset.Lookup(nil, name) == nil {
42
- return false
43
- }
44
- }
45
- return true
46
- }
47
-
48
- // convertProtobufFieldName converts Go PascalCase field names to TypeScript camelCase
49
- // for protobuf types (e.g., ExampleField -> exampleField)
50
- func (c *GoToTSCompiler) convertProtobufFieldName(goFieldName string) string {
51
- if len(goFieldName) == 0 {
52
- return goFieldName
53
- }
54
-
55
- // Convert first character to lowercase if ASCII uppercase
56
- runes := []rune(goFieldName)
57
- if runes[0] >= 'A' && runes[0] <= 'Z' {
58
- runes[0] = runes[0] + ('a' - 'A')
59
- }
60
- return string(runes)
61
- }
62
-
63
- // isProtobufGoLitePackage checks if a package path is a protobuf-go-lite package
64
- // that should be skipped during compilation
65
- func isProtobufGoLitePackage(pkgPath string) bool {
66
- // Skip the main protobuf-go-lite package and all its subpackages
67
- if strings.HasPrefix(pkgPath, "github.com/aperturerobotics/protobuf-go-lite") {
68
- return true
69
- }
70
- // Skip json-iterator-lite which is used by protobuf-go-lite
71
- if strings.HasPrefix(pkgPath, "github.com/aperturerobotics/json-iterator-lite") {
72
- return true
73
- }
74
- return false
75
- }
76
-
77
- // isPackageOnlyUsedByProtobufFiles checks if a package is only imported by .pb.go files
78
- // in the given package, which means we can skip compiling it
79
- func isPackageOnlyUsedByProtobufFiles(pkg *packages.Package, importedPkgPath string) bool {
80
- // Check all files in the package to see which ones import the given package
81
- usedByNonPbFiles := false
82
- usedByPbFiles := false
83
-
84
- for i, syntax := range pkg.Syntax {
85
- fileName := pkg.CompiledGoFiles[i]
86
- isPbFile := strings.HasSuffix(filepath.Base(fileName), ".pb.go")
87
-
88
- // Check if this file imports the package
89
- for _, imp := range syntax.Imports {
90
- if imp.Path != nil {
91
- importPath := strings.Trim(imp.Path.Value, `"`)
92
- if importPath == importedPkgPath {
93
- if isPbFile {
94
- usedByPbFiles = true
95
- } else {
96
- usedByNonPbFiles = true
97
- }
98
- break
99
- }
100
- }
101
- }
102
- }
103
-
104
- // If the package is only used by .pb.go files and not by regular files, we can skip it
105
- return usedByPbFiles && !usedByNonPbFiles
106
- }
107
-
108
- // copyProtobufTSFile copies a .pb.ts file to the output directory
109
- func (c *PackageCompiler) copyProtobufTSFile(sourcePath, fileName string) error {
110
- // Read the source file
111
- content, err := os.ReadFile(sourcePath)
112
- if err != nil {
113
- return fmt.Errorf("failed to read protobuf .pb.ts file %s: %w", sourcePath, err)
114
- }
115
-
116
- // Ensure output directory exists
117
- if err := os.MkdirAll(c.outputPath, 0o755); err != nil {
118
- return fmt.Errorf("failed to create output directory: %w", err)
119
- }
120
-
121
- // Write to output directory
122
- outputPath := filepath.Join(c.outputPath, fileName)
123
- if err := os.WriteFile(outputPath, content, 0o644); err != nil {
124
- return fmt.Errorf("failed to write protobuf .pb.ts file to %s: %w", outputPath, err)
125
- }
126
-
127
- return nil
128
- }
129
-
130
- // writeProtobufExports writes exports for a protobuf file to the index.ts file
131
- func (c *PackageCompiler) writeProtobufExports(indexFile *os.File, fileName string) error {
132
- // For protobuf files, try to parse the copied .pb.ts file in the output directory
133
- // to discover exported symbols and re-export them from the index. This avoids
134
- // hard-coding names like ExampleMsg and protobufPackage.
135
-
136
- pbTsPath := filepath.Join(c.outputPath, fileName+".ts")
137
- content, err := os.ReadFile(pbTsPath)
138
- if err != nil {
139
- return err
140
- }
141
-
142
- // Very simple export discovery: capture names from
143
- // - export const Name
144
- // - export interface Name
145
- // - export class Name
146
- // - export function Name
147
- // We avoid type-only exports for now.
148
- var exports []string
149
- lines := strings.SplitSeq(string(content), "\n")
150
- for ln := range lines {
151
- l := strings.TrimSpace(ln)
152
- if after, ok := strings.CutPrefix(l, "export const "); ok {
153
- rest := after
154
- name := takeIdent(rest)
155
- if name != "" {
156
- exports = append(exports, name)
157
- }
158
- continue
159
- }
160
- if after, ok := strings.CutPrefix(l, "export interface "); ok {
161
- rest := after
162
- name := takeIdent(rest)
163
- if name != "" {
164
- exports = append(exports, name)
165
- }
166
- continue
167
- }
168
- if after, ok := strings.CutPrefix(l, "export class "); ok {
169
- rest := after
170
- name := takeIdent(rest)
171
- if name != "" {
172
- exports = append(exports, name)
173
- }
174
- continue
175
- }
176
- if after, ok := strings.CutPrefix(l, "export function "); ok {
177
- rest := after
178
- name := takeIdent(rest)
179
- if name != "" {
180
- exports = append(exports, name)
181
- }
182
- continue
183
- }
184
- }
185
-
186
- // If nothing found, fallback to default
187
- if len(exports) == 0 {
188
- return fmt.Errorf("no exported symbols discovered in %s.ts while generating protobuf exports", fileName)
189
- }
190
-
191
- // Deduplicate while preserving order
192
- seen := map[string]bool{}
193
- uniq := make([]string, 0, len(exports))
194
- for _, n := range exports {
195
- if !seen[n] {
196
- seen[n] = true
197
- uniq = append(uniq, n)
198
- }
199
- }
200
-
201
- exportLine := fmt.Sprintf("export { %s } from \"./%s.js\"\n", strings.Join(uniq, ", "), fileName)
202
- _, err = indexFile.WriteString(exportLine)
203
- return err
204
- }
205
-
206
- // takeIdent extracts a leading identifier token from the beginning of s.
207
- // Returns an empty string if no valid identifier is found.
208
- func takeIdent(s string) string {
209
- s = strings.TrimSpace(s)
210
- if s == "" {
211
- return ""
212
- }
213
- // Identifier: letter or _ followed by letters, digits, or _
214
- var b strings.Builder
215
- for i, r := range s {
216
- if i == 0 {
217
- if !(r == '_' || r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z') {
218
- break
219
- }
220
- b.WriteRune(r)
221
- continue
222
- }
223
- if r == '_' || r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z' || r >= '0' && r <= '9' {
224
- b.WriteRune(r)
225
- continue
226
- }
227
- break
228
- }
229
- return b.String()
230
- }
231
-
232
- // addProtobufImports adds imports for protobuf types when .pb.ts files are present in the package
233
- func (c *FileCompiler) addProtobufImports() error {
234
- // Check if there are any .pb.go files in this package that have corresponding .pb.ts files
235
- packageDir := filepath.Dir(c.fullPath)
236
-
237
- for _, fileName := range c.pkg.CompiledGoFiles {
238
- baseFileName := filepath.Base(fileName)
239
- if before, ok := strings.CutSuffix(baseFileName, ".pb.go"); ok {
240
- // Check if there's a corresponding .pb.ts file
241
- pbTsFileName := before + ".pb.ts"
242
- pbTsPath := filepath.Join(packageDir, pbTsFileName)
243
-
244
- if _, err := os.Stat(pbTsPath); err == nil {
245
- // .pb.ts file exists, parse it for exports and add imports accordingly
246
- pbBaseName := strings.TrimSuffix(baseFileName, ".pb.go")
247
-
248
- content, rerr := os.ReadFile(pbTsPath)
249
- if rerr != nil {
250
- return fmt.Errorf("failed to read %s for protobuf imports: %w", pbTsPath, rerr)
251
- }
252
-
253
- // Discover exported identifiers (const/interface/class/function)
254
- var exports []string
255
- for ln := range strings.SplitSeq(string(content), "\n") {
256
- l := strings.TrimSpace(ln)
257
- if after, ok := strings.CutPrefix(l, "export const "); ok {
258
- if name := takeIdent(after); name != "" {
259
- exports = append(exports, name)
260
- }
261
- continue
262
- }
263
- if after, ok := strings.CutPrefix(l, "export interface "); ok {
264
- if name := takeIdent(after); name != "" {
265
- exports = append(exports, name)
266
- }
267
- continue
268
- }
269
- if after, ok := strings.CutPrefix(l, "export class "); ok {
270
- if name := takeIdent(after); name != "" {
271
- exports = append(exports, name)
272
- }
273
- continue
274
- }
275
- if after, ok := strings.CutPrefix(l, "export function "); ok {
276
- if name := takeIdent(after); name != "" {
277
- exports = append(exports, name)
278
- }
279
- continue
280
- }
281
- }
282
-
283
- if len(exports) == 0 {
284
- return fmt.Errorf("no exported symbols discovered in %s for protobuf imports", pbTsPath)
285
- }
286
-
287
- // Deduplicate
288
- seen := map[string]bool{}
289
- uniq := make([]string, 0, len(exports))
290
- for _, n := range exports {
291
- if !seen[n] {
292
- seen[n] = true
293
- uniq = append(uniq, n)
294
- }
295
- }
296
-
297
- c.codeWriter.WriteLinef("import { %s } from %q;",
298
- strings.Join(uniq, ", "), translateGeneratedProtobufFileToImportPath(pbBaseName))
299
- break
300
- }
301
- }
302
- }
303
-
304
- return nil
305
- }
306
-
307
- // isProtobufMethodCall checks if a call expression is a protobuf method call
308
- func (c *GoToTSCompiler) isProtobufMethodCall(callExpr *ast.CallExpr, methodName string) bool {
309
- if selectorExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok {
310
- if selectorExpr.Sel.Name == methodName {
311
- if receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X); receiverType != nil {
312
- // Handle pointer types
313
- if ptrType, ok := receiverType.(*types.Pointer); ok {
314
- receiverType = ptrType.Elem()
315
- }
316
- isProtobuf := c.isProtobufType(receiverType)
317
- return isProtobuf
318
- }
319
- }
320
- }
321
- return false
322
- }
323
-
324
- // writeProtobufMarshalAssignment handles: data, err := msg.MarshalVT()
325
- // Generates: const data = ExampleMsg.toBinary(msg); const err = null;
326
- func (c *GoToTSCompiler) writeProtobufMarshalAssignment(lhs []ast.Expr, callExpr *ast.CallExpr, tok token.Token) error {
327
- if len(lhs) != 2 {
328
- return fmt.Errorf("protobuf marshal assignment requires exactly 2 LHS variables, got %d", len(lhs))
329
- }
330
-
331
- selectorExpr := callExpr.Fun.(*ast.SelectorExpr)
332
- receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X)
333
- if ptrType, ok := receiverType.(*types.Pointer); ok {
334
- receiverType = ptrType.Elem()
335
- }
336
-
337
- // Get the type name for the static method call
338
- var typeName string
339
- if namedType, ok := receiverType.(*types.Named); ok {
340
- typeName = namedType.Obj().Name()
341
- } else {
342
- return fmt.Errorf("could not determine protobuf type name")
343
- }
344
-
345
- // Handle data variable
346
- dataExpr := lhs[0]
347
- if dataIdent, ok := dataExpr.(*ast.Ident); ok && dataIdent.Name != "_" {
348
- if tok == token.DEFINE {
349
- c.tsw.WriteLiterally("const ")
350
- }
351
- c.tsw.WriteLiterally(dataIdent.Name)
352
- c.tsw.WriteLiterally(" = ")
353
- c.tsw.WriteLiterally(typeName)
354
- c.tsw.WriteLiterally(".toBinary(")
355
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
356
- return fmt.Errorf("failed to write receiver for MarshalVT: %w", err)
357
- }
358
- c.tsw.WriteLiterally(")")
359
- c.tsw.WriteLine("")
360
- }
361
-
362
- // Handle err variable with proper type annotation
363
- errExpr := lhs[1]
364
- if errIdent, ok := errExpr.(*ast.Ident); ok && errIdent.Name != "_" {
365
- if tok == token.DEFINE {
366
- c.tsw.WriteLiterally("let ")
367
- }
368
- c.tsw.WriteLiterally(errIdent.Name)
369
- c.tsw.WriteLiterally(": $.GoError | null = null as $.GoError | null")
370
- c.tsw.WriteLine("")
371
- }
372
-
373
- return nil
374
- }
375
-
376
- // writeProtobufUnmarshalAssignment handles: err = out.UnmarshalVT(data)
377
- // Generates: out = ExampleMsg.fromBinary(data); err = null;
378
- func (c *GoToTSCompiler) writeProtobufUnmarshalAssignment(lhs []ast.Expr, callExpr *ast.CallExpr) error {
379
- if len(lhs) != 1 {
380
- return fmt.Errorf("protobuf unmarshal assignment requires exactly 1 LHS variable, got %d", len(lhs))
381
- }
382
-
383
- selectorExpr := callExpr.Fun.(*ast.SelectorExpr)
384
- receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X)
385
- if ptrType, ok := receiverType.(*types.Pointer); ok {
386
- receiverType = ptrType.Elem()
387
- }
388
-
389
- // Get the type name for the static method call
390
- var typeName string
391
- if namedType, ok := receiverType.(*types.Named); ok {
392
- typeName = namedType.Obj().Name()
393
- } else {
394
- return fmt.Errorf("could not determine protobuf type name")
395
- }
396
-
397
- // The LHS should be the err variable, but we need to assign to the receiver instead
398
- errExpr := lhs[0]
399
- if errIdent, ok := errExpr.(*ast.Ident); ok {
400
- // First, assign the result of fromBinary to the receiver
401
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
402
- return fmt.Errorf("failed to write receiver for UnmarshalVT: %w", err)
403
- }
404
- c.tsw.WriteLiterally(" = ")
405
- c.tsw.WriteLiterally(typeName)
406
- c.tsw.WriteLiterally(".fromBinary(")
407
- if len(callExpr.Args) > 0 {
408
- c.tsw.WriteLiterally("$.normalizeBytes(")
409
- if err := c.WriteValueExpr(callExpr.Args[0]); err != nil {
410
- return fmt.Errorf("failed to write argument for UnmarshalVT: %w", err)
411
- }
412
- c.tsw.WriteLiterally(")")
413
- }
414
- c.tsw.WriteLiterally(")")
415
- c.tsw.WriteLine("")
416
-
417
- // Then set err to null (but only if it's not a blank identifier)
418
- // Note: We don't set err = null here because err was declared as const
419
- // The error handling will be skipped since err is always null for protobuf-es-lite
420
- if errIdent.Name != "_" {
421
- // Actually reassign err to maintain proper typing for subsequent error checks
422
- c.tsw.WriteLiterally(errIdent.Name)
423
- c.tsw.WriteLiterally(" = null as $.GoError | null")
424
- c.tsw.WriteLine("")
425
- }
426
- }
427
-
428
- return nil
429
- }
430
-
431
- // writeProtobufMethodCall handles protobuf method calls in expression context
432
- // Returns true if the call was handled as a protobuf method, false otherwise
433
- func (c *GoToTSCompiler) writeProtobufMethodCall(exp *ast.CallExpr) (bool, error) {
434
- selectorExpr, ok := exp.Fun.(*ast.SelectorExpr)
435
- if !ok {
436
- return false, nil
437
- }
438
-
439
- methodName := selectorExpr.Sel.Name
440
-
441
- // Check if this is a protobuf method call
442
- if methodName == "MarshalVT" || methodName == "UnmarshalVT" || methodName == "MarshalJSON" || methodName == "UnmarshalJSON" {
443
- // Get the receiver type
444
- if receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X); receiverType != nil {
445
- // Handle pointer types
446
- if ptrType, ok := receiverType.(*types.Pointer); ok {
447
- receiverType = ptrType.Elem()
448
- }
449
-
450
- // Check if the receiver is a protobuf type
451
- if c.isProtobufType(receiverType) {
452
- if namedType, ok := receiverType.(*types.Named); ok {
453
- typeName := namedType.Obj().Name()
454
-
455
- switch methodName {
456
- case "MarshalVT":
457
- // Transform msg.MarshalVT() to ExampleMsg.toBinary(msg)
458
- c.tsw.WriteLiterally(typeName)
459
- c.tsw.WriteLiterally(".toBinary(")
460
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
461
- return true, fmt.Errorf("failed to write receiver for MarshalVT: %w", err)
462
- }
463
- c.tsw.WriteLiterally(")")
464
- return true, nil
465
- case "MarshalJSON":
466
- // Transform msg.MarshalJSON() to ExampleMsg.toJsonString(msg)
467
- c.tsw.WriteLiterally(typeName)
468
- c.tsw.WriteLiterally(".toJsonString(")
469
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
470
- return true, fmt.Errorf("failed to write receiver for MarshalJSON: %w", err)
471
- }
472
- c.tsw.WriteLiterally(")")
473
- return true, nil
474
- case "UnmarshalVT":
475
- // Transform out.UnmarshalVT(data) to ExampleMsg.fromBinary(data)
476
- c.tsw.WriteLiterally(typeName)
477
- c.tsw.WriteLiterally(".fromBinary($.normalizeBytes(")
478
- if len(exp.Args) > 0 {
479
- if err := c.WriteValueExpr(exp.Args[0]); err != nil {
480
- return true, fmt.Errorf("failed to write argument for UnmarshalVT: %w", err)
481
- }
482
- }
483
- c.tsw.WriteLiterally("))")
484
- return true, nil
485
- case "UnmarshalJSON":
486
- // Transform out.UnmarshalJSON(data) to ExampleMsg.fromJsonString(data)
487
- c.tsw.WriteLiterally(typeName)
488
- c.tsw.WriteLiterally(".fromJsonString(")
489
- if len(exp.Args) > 0 {
490
- if err := c.WriteValueExpr(exp.Args[0]); err != nil {
491
- return true, fmt.Errorf("failed to write argument for UnmarshalJSON: %w", err)
492
- }
493
- }
494
- c.tsw.WriteLiterally(")")
495
- return true, nil
496
- }
497
- }
498
- }
499
- }
500
- }
501
-
502
- return false, nil
503
- }
504
-
505
- // writeProtobufCompositeLit handles protobuf composite literals
506
- // Returns true if the literal was handled as a protobuf type, false otherwise
507
- func (c *GoToTSCompiler) writeProtobufCompositeLit(exp *ast.CompositeLit, litType types.Type) (bool, error) {
508
- // Check if this is a protobuf type
509
- var isProtobuf bool
510
-
511
- if nt, ok := litType.(*types.Named); ok {
512
- if c.isProtobufType(nt) {
513
- isProtobuf = true
514
- }
515
- } else if ptrType, ok := litType.(*types.Pointer); ok {
516
- if namedElem, ok := ptrType.Elem().(*types.Named); ok {
517
- if c.isProtobufType(namedElem) {
518
- isProtobuf = true
519
- }
520
- }
521
- }
522
-
523
- if !isProtobuf {
524
- return false, nil
525
- }
526
-
527
- // For protobuf types, use MessageType.create() instead of new Constructor()
528
- if _, ok := litType.(*types.Pointer); ok {
529
- // For pointer types, we need to get the element type
530
- if starExpr, ok := exp.Type.(*ast.StarExpr); ok {
531
- c.WriteTypeExpr(starExpr.X)
532
- } else {
533
- // Fallback: write the pointer type and use create
534
- c.WriteTypeExpr(exp.Type)
535
- }
536
- } else {
537
- c.WriteTypeExpr(exp.Type)
538
- }
539
- c.tsw.WriteLiterally(".create")
540
-
541
- return true, nil
542
- }
543
-
544
- // convertProtobufFieldNameInLiteral converts field names for protobuf composite literals
545
- func (c *GoToTSCompiler) convertProtobufFieldNameInLiteral(keyName string, litType types.Type) string {
546
- // Check if this is a protobuf type
547
- if namedType, ok := litType.(*types.Named); ok {
548
- if c.isProtobufType(namedType) {
549
- return c.convertProtobufFieldName(keyName)
550
- }
551
- } else if ptrType, ok := litType.(*types.Pointer); ok {
552
- if namedElem, ok := ptrType.Elem().(*types.Named); ok {
553
- if c.isProtobufType(namedElem) {
554
- return c.convertProtobufFieldName(keyName)
555
- }
556
- }
557
- }
558
- return keyName
559
- }
560
-
561
- // writeProtobufMarshalJSONAssignment handles: data, err := msg.MarshalJSON()
562
- // Generates: const data = ExampleMsg.toJsonString(msg); err = null;
563
- func (c *GoToTSCompiler) writeProtobufMarshalJSONAssignment(lhs []ast.Expr, callExpr *ast.CallExpr, tok token.Token) error {
564
- if len(lhs) != 2 {
565
- return fmt.Errorf("protobuf marshal JSON assignment requires exactly 2 LHS variables, got %d", len(lhs))
566
- }
567
-
568
- selectorExpr := callExpr.Fun.(*ast.SelectorExpr)
569
- receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X)
570
- if ptrType, ok := receiverType.(*types.Pointer); ok {
571
- receiverType = ptrType.Elem()
572
- }
573
-
574
- // Get the type name for the static method call
575
- var typeName string
576
- if namedType, ok := receiverType.(*types.Named); ok {
577
- typeName = namedType.Obj().Name()
578
- } else {
579
- return fmt.Errorf("could not determine protobuf type name")
580
- }
581
-
582
- // Handle data variable (first variable)
583
- dataExpr := lhs[0]
584
- if dataIdent, ok := dataExpr.(*ast.Ident); ok && dataIdent.Name != "_" {
585
- // For := assignments, check if this is a new variable
586
- isNewVar := true
587
- if tok == token.DEFINE {
588
- // Check if the variable is already in scope by looking at Uses
589
- if obj := c.pkg.TypesInfo.Uses[dataIdent]; obj != nil {
590
- isNewVar = false
591
- }
592
- }
593
-
594
- if tok == token.DEFINE && isNewVar {
595
- c.tsw.WriteLiterally("const ")
596
- }
597
- c.tsw.WriteLiterally(dataIdent.Name)
598
- c.tsw.WriteLiterally(" = ")
599
- c.tsw.WriteLiterally(typeName)
600
- c.tsw.WriteLiterally(".toJsonString(")
601
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
602
- return fmt.Errorf("failed to write receiver for MarshalJSON: %w", err)
603
- }
604
- c.tsw.WriteLiterally(")")
605
- c.tsw.WriteLine("")
606
- }
607
-
608
- // Handle err variable (second variable)
609
- errExpr := lhs[1]
610
- if errIdent, ok := errExpr.(*ast.Ident); ok && errIdent.Name != "_" {
611
- // For := assignments, check if this is a new variable
612
- isNewVar := true
613
- if tok == token.DEFINE {
614
- // Check if the variable is already in scope by looking at Uses
615
- if obj := c.pkg.TypesInfo.Uses[errIdent]; obj != nil {
616
- isNewVar = false
617
- }
618
- }
619
-
620
- if tok == token.DEFINE && isNewVar {
621
- c.tsw.WriteLiterally("let ")
622
- }
623
- c.tsw.WriteLiterally(errIdent.Name)
624
- if tok == token.DEFINE && isNewVar {
625
- c.tsw.WriteLiterally(": $.GoError | null")
626
- }
627
- c.tsw.WriteLiterally(" = null as $.GoError | null")
628
- c.tsw.WriteLine("")
629
- }
630
-
631
- return nil
632
- }
633
-
634
- // writeProtobufUnmarshalJSONAssignment handles: err = out.UnmarshalJSON(data)
635
- // Generates: out = ExampleMsg.fromJsonString(data); err = null;
636
- func (c *GoToTSCompiler) writeProtobufUnmarshalJSONAssignment(lhs []ast.Expr, callExpr *ast.CallExpr, tok token.Token) error {
637
- if len(lhs) != 1 {
638
- return fmt.Errorf("protobuf unmarshal JSON assignment requires exactly 1 LHS variable, got %d", len(lhs))
639
- }
640
-
641
- selectorExpr := callExpr.Fun.(*ast.SelectorExpr)
642
- receiverType := c.pkg.TypesInfo.TypeOf(selectorExpr.X)
643
- if ptrType, ok := receiverType.(*types.Pointer); ok {
644
- receiverType = ptrType.Elem()
645
- }
646
-
647
- // Get the type name for the static method call
648
- var typeName string
649
- if namedType, ok := receiverType.(*types.Named); ok {
650
- typeName = namedType.Obj().Name()
651
- } else {
652
- return fmt.Errorf("could not determine protobuf type name")
653
- }
654
-
655
- // The LHS should be the err variable, but we need to assign to the receiver instead
656
- errExpr := lhs[0]
657
- if errIdent, ok := errExpr.(*ast.Ident); ok {
658
- // First, assign the result of fromJsonString to the receiver
659
- if err := c.WriteValueExpr(selectorExpr.X); err != nil {
660
- return fmt.Errorf("failed to write receiver for UnmarshalJSON: %w", err)
661
- }
662
- c.tsw.WriteLiterally(" = ")
663
- c.tsw.WriteLiterally(typeName)
664
- c.tsw.WriteLiterally(".fromJsonString(")
665
- if len(callExpr.Args) > 0 {
666
- if err := c.WriteValueExpr(callExpr.Args[0]); err != nil {
667
- return fmt.Errorf("failed to write argument for UnmarshalJSON: %w", err)
668
- }
669
- }
670
- c.tsw.WriteLiterally(")")
671
- c.tsw.WriteLine("")
672
-
673
- // Then set err to null (but only if it's not a blank identifier)
674
- if errIdent.Name != "_" {
675
- // For := assignments, check if this is a new variable
676
- isNewVar := true
677
- if tok == token.DEFINE {
678
- // Check if the variable is already in scope by looking at Uses
679
- if obj := c.pkg.TypesInfo.Uses[errIdent]; obj != nil {
680
- isNewVar = false
681
- }
682
- }
683
-
684
- if tok == token.DEFINE && isNewVar {
685
- c.tsw.WriteLiterally("let ")
686
- }
687
- c.tsw.WriteLiterally(errIdent.Name)
688
- if tok == token.DEFINE && isNewVar {
689
- c.tsw.WriteLiterally(": $.GoError | null")
690
- }
691
- c.tsw.WriteLiterally(" = null as $.GoError | null")
692
- c.tsw.WriteLine("")
693
- }
694
- }
695
-
696
- return nil
697
- }