goscript 0.1.0 → 0.1.2

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 (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.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/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
@@ -18,6 +18,7 @@ export enum TypeKind {
18
18
  */
19
19
  export interface BaseTypeInfo {
20
20
  name?: string
21
+ typeName?: string
21
22
  kind: TypeKind
22
23
  zeroValue?: any
23
24
  }
@@ -44,6 +45,7 @@ export interface MethodSignature {
44
45
  */
45
46
  export interface StructFieldInfo {
46
47
  type: TypeInfo | string // The field's type
48
+ name?: string // The Go field name when it differs from the TypeScript key.
47
49
  tag?: string // The struct field tag (e.g., `json:"name,omitempty"`)
48
50
  }
49
51
 
@@ -203,6 +205,19 @@ export interface Comparable {
203
205
 
204
206
  // Registry to store runtime type information
205
207
  const typeRegistry = new Map<string, TypeInfo>()
208
+ const duplicateTypeRegistry = new Map<string, TypeInfo[]>()
209
+
210
+ function registerTypeInfo(name: string, typeInfo: TypeInfo): void {
211
+ const existing = typeRegistry.get(name)
212
+ if (existing && existing !== typeInfo) {
213
+ const candidates = duplicateTypeRegistry.get(name) ?? [existing]
214
+ if (!candidates.includes(typeInfo)) {
215
+ candidates.push(typeInfo)
216
+ }
217
+ duplicateTypeRegistry.set(name, candidates)
218
+ }
219
+ typeRegistry.set(name, typeInfo)
220
+ }
206
221
 
207
222
  /**
208
223
  * Registers a struct type with the runtime type system.
@@ -229,10 +244,17 @@ export const registerStructType = (
229
244
  ctor,
230
245
  fields,
231
246
  }
232
- typeRegistry.set(name, typeInfo)
247
+ registerTypeInfo(name, typeInfo)
233
248
  return typeInfo
234
249
  }
235
250
 
251
+ function resolveZeroValue<T>(zeroValue: any): T {
252
+ if (typeof zeroValue === 'function') {
253
+ return zeroValue() as T
254
+ }
255
+ return zeroValue as T
256
+ }
257
+
236
258
  /**
237
259
  * Registers an interface type with the runtime type system.
238
260
  *
@@ -252,7 +274,7 @@ export const registerInterfaceType = (
252
274
  zeroValue,
253
275
  methods,
254
276
  }
255
- typeRegistry.set(name, typeInfo)
277
+ registerTypeInfo(name, typeInfo)
256
278
  return typeInfo
257
279
  }
258
280
 
@@ -293,6 +315,14 @@ function normalizeTypeInfo(info: string | TypeInfo): TypeInfo {
293
315
  return info
294
316
  }
295
317
 
318
+ function typeInfoRuntimeName(info: TypeInfo): string | undefined {
319
+ return info.typeName || info.name
320
+ }
321
+
322
+ function goTypeMatchesTypeInfo(goType: string, info: TypeInfo): boolean {
323
+ return goType === typeInfoRuntimeName(info)
324
+ }
325
+
296
326
  function compareOptionalTypeInfo(
297
327
  type1?: string | TypeInfo,
298
328
  type2?: string | TypeInfo,
@@ -500,13 +530,9 @@ function matchesStructType(value: any, info: TypeInfo): boolean {
500
530
 
501
531
  if (fieldsExist && sameFieldCount && allFieldsInStruct) {
502
532
  return Object.entries(info.fields).every(([fieldName, fieldType]) => {
503
- const fieldTypeInfo = isStructFieldInfo(fieldType)
504
- ? fieldType.type
505
- : fieldType
506
- return matchesType(
507
- value[fieldName],
508
- normalizeTypeInfo(fieldTypeInfo),
509
- )
533
+ const fieldTypeInfo =
534
+ isStructFieldInfo(fieldType) ? fieldType.type : fieldType
535
+ return matchesType(value[fieldName], normalizeTypeInfo(fieldTypeInfo))
510
536
  })
511
537
  }
512
538
 
@@ -526,11 +552,13 @@ function matchesStructType(value: any, info: TypeInfo): boolean {
526
552
  */
527
553
  function matchesInterfaceType(value: any, info: TypeInfo): boolean {
528
554
  // Check basic conditions first
529
- if (
530
- !isInterfaceTypeInfo(info) ||
531
- typeof value !== 'object' ||
532
- value === null
533
- ) {
555
+ if (!isInterfaceTypeInfo(info) || value === null || value === undefined) {
556
+ return false
557
+ }
558
+ if (info.methods.length === 0) {
559
+ return true
560
+ }
561
+ if (typeof value !== 'object') {
534
562
  return false
535
563
  }
536
564
 
@@ -667,9 +695,15 @@ function matchesMapType(value: any, info: TypeInfo): boolean {
667
695
  */
668
696
  function matchesArrayOrSliceType(value: any, info: TypeInfo): boolean {
669
697
  // For slices and arrays, check if the value is an array and sample element types
670
- if (!Array.isArray(value)) return false
671
698
  if (!isArrayTypeInfo(info) && !isSliceTypeInfo(info)) return false
672
699
 
700
+ if (value instanceof Uint8Array) {
701
+ if (isArrayTypeInfo(info) && value.length !== info.length) return false
702
+ return isNumberElementType(info.elemType)
703
+ }
704
+
705
+ if (!Array.isArray(value)) return false
706
+
673
707
  if (info.elemType) {
674
708
  const arr = value as any[]
675
709
  if (arr.length === 0) return true // Empty array matches any array type
@@ -690,6 +724,21 @@ function matchesArrayOrSliceType(value: any, info: TypeInfo): boolean {
690
724
  return true
691
725
  }
692
726
 
727
+ function isNumberElementType(typeInfo: string | TypeInfo | undefined): boolean {
728
+ if (typeInfo === undefined) return true
729
+ const info = normalizeTypeInfo(typeInfo)
730
+ return (
731
+ info.kind === TypeKind.Basic &&
732
+ (info.name === undefined ||
733
+ info.name === 'number' ||
734
+ info.name === 'int' ||
735
+ info.name === 'uint' ||
736
+ info.name === 'uint8' ||
737
+ info.name === 'byte' ||
738
+ info.name === 'float64')
739
+ )
740
+ }
741
+
693
742
  // Symbol used to mark struct instances that represent values (not pointers)
694
743
  const STRUCT_VALUE_MARKER = Symbol('structValue')
695
744
 
@@ -701,6 +750,32 @@ export function markAsStructValue<T>(value: T): T {
701
750
  return value
702
751
  }
703
752
 
753
+ export function cloneStructValue<T>(value: T): T {
754
+ const cloneable = value as T & {
755
+ __goscriptClone?: () => T
756
+ clone?: () => T
757
+ }
758
+ if (typeof cloneable.__goscriptClone === 'function') {
759
+ return cloneable.__goscriptClone()
760
+ }
761
+ if (typeof cloneable.clone === 'function') {
762
+ return cloneable.clone()
763
+ }
764
+ throw new Error('runtime error: value is not cloneable')
765
+ }
766
+
767
+ export function cloneArrayValue<T>(value: T): T {
768
+ if (value instanceof Uint8Array) {
769
+ const out = new Uint8Array(value.length)
770
+ out.set(value)
771
+ return out as T
772
+ }
773
+ if (Array.isArray(value)) {
774
+ return value.map((item) => cloneArrayValue(item)) as T
775
+ }
776
+ return value
777
+ }
778
+
704
779
  // Check if a struct instance is marked as a value
705
780
  function isMarkedAsStructValue(value: any): boolean {
706
781
  return (
@@ -729,6 +804,10 @@ function matchesPointerType(value: any, info: TypeInfo): boolean {
729
804
 
730
805
  if (!isPointerTypeInfo(info)) return false
731
806
 
807
+ if (typeof value.__goType === 'string') {
808
+ return compareTypeStringWithTypeInfo(value.__goType, info)
809
+ }
810
+
732
811
  if (!info.elemType) return false
733
812
 
734
813
  let elem = info.elemType
@@ -854,6 +933,13 @@ function matchesType(value: any, info: TypeInfo): boolean {
854
933
  if (value === null || value === undefined) {
855
934
  return false
856
935
  }
936
+ if (
937
+ typeof value === 'object' &&
938
+ typeof value.__goType === 'string' &&
939
+ goTypeMatchesTypeInfo(value.__goType, info)
940
+ ) {
941
+ return true
942
+ }
857
943
 
858
944
  switch (info.kind) {
859
945
  case TypeKind.Basic:
@@ -1011,7 +1097,10 @@ export function typeAssert<T>(
1011
1097
 
1012
1098
  // Handle typed nil pointers (created by typedNil() for conversions like (*T)(nil))
1013
1099
  if (typeof value === 'object' && value !== null && value.__isTypedNil) {
1014
- if (isInterfaceTypeInfo(normalizedType) && matchesInterfaceType(value, normalizedType)) {
1100
+ if (
1101
+ isInterfaceTypeInfo(normalizedType) &&
1102
+ matchesInterfaceType(value, normalizedType)
1103
+ ) {
1015
1104
  return { value: value as T, ok: true }
1016
1105
  }
1017
1106
  // For typed nils, we need to compare the stored type with the expected type
@@ -1029,6 +1118,17 @@ export function typeAssert<T>(
1029
1118
  if (isPointerTypeInfo(normalizedType) && value === null) {
1030
1119
  return { value: null as unknown as T, ok: false }
1031
1120
  }
1121
+ if (
1122
+ typeof value === 'object' &&
1123
+ value !== null &&
1124
+ typeof value.__goType === 'string' &&
1125
+ goTypeMatchesTypeInfo(value.__goType, normalizedType)
1126
+ ) {
1127
+ if ('__goValue' in value) {
1128
+ return { value: value.__goValue as T, ok: true }
1129
+ }
1130
+ return { value: value as T, ok: true }
1131
+ }
1032
1132
 
1033
1133
  // Removed struct matching logic - struct types should use nominal matching
1034
1134
  // via matchesStructType in matchesType, not structural matching here
@@ -1040,9 +1140,9 @@ export function typeAssert<T>(
1040
1140
  ) {
1041
1141
  if (normalizedType.keyType || normalizedType.elemType) {
1042
1142
  const entries =
1043
- value instanceof Map
1044
- ? Array.from(value.entries())
1045
- : Object.entries(value)
1143
+ value instanceof Map ?
1144
+ Array.from(value.entries())
1145
+ : Object.entries(value)
1046
1146
 
1047
1147
  if (entries.length === 0) {
1048
1148
  return { value: value as T, ok: true }
@@ -1080,29 +1180,26 @@ export function typeAssert<T>(
1080
1180
 
1081
1181
  const matches = matchesType(value, normalizedType)
1082
1182
  if (matches) {
1083
- // Special handling for pointer type assertions:
1084
- // If the value is a VarRef and we're asserting to a pointer type,
1085
- // return the inner value (value.value), not the VarRef object itself
1086
- if (
1087
- isPointerTypeInfo(normalizedType) &&
1088
- typeof value === 'object' &&
1089
- value !== null &&
1090
- 'value' in value
1091
- ) {
1092
- return { value: value.value as T, ok: true }
1093
- }
1094
1183
  return { value: value as T, ok: true }
1095
1184
  }
1096
1185
 
1186
+ if (typeof typeInfo === 'string') {
1187
+ for (const candidate of duplicateTypeRegistry.get(typeInfo) ?? []) {
1188
+ if (candidate !== normalizedType && matchesType(value, candidate)) {
1189
+ return { value: value as T, ok: true }
1190
+ }
1191
+ }
1192
+ }
1193
+
1097
1194
  // If we get here, the assertion failed
1098
1195
  // For registered types, use the zero value from the registry
1099
1196
  if (typeof typeInfo === 'string') {
1100
1197
  const registeredType = typeRegistry.get(typeInfo)
1101
1198
  if (registeredType && registeredType.zeroValue !== undefined) {
1102
- return { value: registeredType.zeroValue as T, ok: false }
1199
+ return { value: resolveZeroValue<T>(registeredType.zeroValue), ok: false }
1103
1200
  }
1104
1201
  } else if (normalizedType.zeroValue !== undefined) {
1105
- return { value: normalizedType.zeroValue as T, ok: false }
1202
+ return { value: resolveZeroValue<T>(normalizedType.zeroValue), ok: false }
1106
1203
  }
1107
1204
 
1108
1205
  return { value: null as unknown as T, ok: false }
@@ -1166,7 +1263,7 @@ export function is(value: any, typeInfo: string | TypeInfo): boolean {
1166
1263
  */
1167
1264
  export interface TypeSwitchCase {
1168
1265
  types: (string | TypeInfo)[] // Array of types for this case (e.g., case int, string:)
1169
- body: (value?: any) => void // Function representing the case body. 'value' is the asserted value if applicable.
1266
+ body: (value?: any) => any // Function representing the case body. 'value' is the asserted value if applicable.
1170
1267
  }
1171
1268
 
1172
1269
  /**
@@ -1180,16 +1277,15 @@ export interface TypeSwitchCase {
1180
1277
  export function typeSwitch(
1181
1278
  value: any,
1182
1279
  cases: TypeSwitchCase[],
1183
- defaultCase?: () => void,
1184
- ): void {
1280
+ defaultCase?: () => any,
1281
+ ): any {
1185
1282
  for (const caseObj of cases) {
1186
1283
  // For cases with multiple types (case T1, T2:), use $.is
1187
1284
  if (caseObj.types.length > 1) {
1188
1285
  const matchesAny = caseObj.types.some((typeInfo) => is(value, typeInfo))
1189
1286
  if (matchesAny) {
1190
1287
  // For multi-type cases, the case variable (if any) gets the original value
1191
- caseObj.body(value)
1192
- return // Found a match, exit switch
1288
+ return caseObj.body(value)
1193
1289
  }
1194
1290
  } else if (caseObj.types.length === 1) {
1195
1291
  // For single-type cases (case T:), use $.typeAssert to get the typed value and ok status
@@ -1197,9 +1293,7 @@ export function typeSwitch(
1197
1293
  const { value: assertedValue, ok } = typeAssert(value, typeInfo)
1198
1294
  if (ok) {
1199
1295
  // Pass the asserted value to the case body function
1200
- caseObj.body(assertedValue)
1201
-
1202
- return // Found a match, exit switch
1296
+ return caseObj.body(assertedValue)
1203
1297
  }
1204
1298
  }
1205
1299
  // Note: Cases with 0 types are not valid in Go type switches
@@ -1207,7 +1301,7 @@ export function typeSwitch(
1207
1301
 
1208
1302
  // If no case matched and a default case exists, execute it
1209
1303
  if (defaultCase) {
1210
- defaultCase()
1304
+ return defaultCase()
1211
1305
  }
1212
1306
  }
1213
1307
 
@@ -1228,6 +1322,13 @@ export function typedNil(typeName: string): any {
1228
1322
 
1229
1323
  export function interfaceValue<T>(value: unknown, typeName: string): T {
1230
1324
  if (value !== null && value !== undefined) {
1325
+ if (typeof value === 'object') {
1326
+ Object.defineProperty(value, '__goType', {
1327
+ value: typeName,
1328
+ writable: true,
1329
+ configurable: true,
1330
+ })
1331
+ }
1231
1332
  return value as T
1232
1333
  }
1233
1334
 
@@ -1255,6 +1356,24 @@ export function interfaceValue<T>(value: unknown, typeName: string): T {
1255
1356
  return nilValue as T
1256
1357
  }
1257
1358
 
1359
+ export function namedValueInterfaceValue<T>(
1360
+ value: unknown,
1361
+ typeName: string,
1362
+ methods: Record<string, (receiver: any, ...args: any[]) => any>,
1363
+ ): T {
1364
+ const boxed: any = {
1365
+ __goType: typeName,
1366
+ __goValue: value,
1367
+ valueOf: () => value,
1368
+ toString: () => String(value),
1369
+ [Symbol.toPrimitive]: () => value as any,
1370
+ }
1371
+ for (const [name, method] of Object.entries(methods)) {
1372
+ boxed[name] = (...args: any[]) => method(value, ...args)
1373
+ }
1374
+ return boxed as T
1375
+ }
1376
+
1258
1377
  export function namedFunction<T>(fn: T, typeName: string): T {
1259
1378
  if (typeof fn !== 'function') {
1260
1379
  return fn
@@ -5,7 +5,14 @@
5
5
  * var myVariable int // variable referenced
6
6
  * myOtherVar := &myVariable
7
7
  */
8
- export type VarRef<T> = { value: T; __isVarRef?: true }
8
+ export type VarRef<T> = {
9
+ value: T
10
+ __isVarRef?: true
11
+ __goType?: string
12
+ __goAddress?: () => number
13
+ __goCollection?: unknown
14
+ __goIndex?: number
15
+ }
9
16
 
10
17
  /** Wrap a non-null T in a variable reference. */
11
18
  export function varRef<T>(v: T): VarRef<T> {
@@ -15,6 +22,22 @@ export function varRef<T>(v: T): VarRef<T> {
15
22
  return { value: v, __isVarRef: true }
16
23
  }
17
24
 
25
+ /** Create a variable reference to an object field. */
26
+ export function fieldRef<T extends object, K extends keyof T>(
27
+ target: T,
28
+ key: K,
29
+ ): VarRef<T[K]> {
30
+ return {
31
+ get value(): T[K] {
32
+ return target[key]
33
+ },
34
+ set value(value: T[K]) {
35
+ target[key] = value
36
+ },
37
+ __isVarRef: true,
38
+ }
39
+ }
40
+
18
41
  /** Check if a value is a VarRef (pointer) */
19
42
  export function isVarRef(v: unknown): v is VarRef<unknown> {
20
43
  return v !== null && typeof v === 'object' && (v as any).__isVarRef === true
@@ -29,3 +52,19 @@ export function unref<T>(b: VarRef<T>): T {
29
52
  }
30
53
  return b.value
31
54
  }
55
+
56
+ export function unsupportedPointerRef<T>(_value: unknown): VarRef<T> {
57
+ return {
58
+ get value(): T {
59
+ throw new Error(
60
+ 'unsafe pointer dereference is not supported in JavaScript/TypeScript',
61
+ )
62
+ },
63
+ set value(_value: T) {
64
+ throw new Error(
65
+ 'unsafe pointer dereference is not supported in JavaScript/TypeScript',
66
+ )
67
+ },
68
+ __isVarRef: true,
69
+ }
70
+ }