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
@@ -4,6 +4,24 @@
4
4
  // UintSize is the size of a uint in bits
5
5
  export const UintSize = 32 // Assuming 32-bit for JavaScript numbers
6
6
 
7
+ type Word64 = number | bigint
8
+
9
+ const uint64Mask = (1n << 64n) - 1n
10
+
11
+ function toUint64(x: Word64): bigint {
12
+ return BigInt(x) & uint64Mask
13
+ }
14
+
15
+ function useBigIntResult(...values: Word64[]): boolean {
16
+ return values.some((value) => typeof value === 'bigint')
17
+ }
18
+
19
+ function word64Result(value: bigint, useBigInt: boolean): Word64 {
20
+ return useBigInt || value > BigInt(Number.MAX_SAFE_INTEGER) ?
21
+ value
22
+ : Number(value)
23
+ }
24
+
7
25
  // --- Leading zeros ---
8
26
  export function LeadingZeros(x: number): number {
9
27
  return Math.clz32(x >>> 0)
@@ -21,8 +39,9 @@ export function LeadingZeros32(x: number): number {
21
39
  return Math.clz32(x >>> 0)
22
40
  }
23
41
 
24
- export function LeadingZeros64(x: bigint): number {
42
+ export function LeadingZeros64(x: Word64): number {
25
43
  // For 64-bit, we need to handle it differently
44
+ x = toUint64(x)
26
45
  if (x === 0n) return 64
27
46
  let count = 0
28
47
  let mask = 1n << 63n
@@ -59,7 +78,8 @@ export function TrailingZeros32(x: number): number {
59
78
  return count
60
79
  }
61
80
 
62
- export function TrailingZeros64(x: bigint): number {
81
+ export function TrailingZeros64(x: Word64): number {
82
+ x = toUint64(x)
63
83
  if (x === 0n) return 64
64
84
  let count = 0
65
85
  while ((x & 1n) === 0n && count < 64) {
@@ -93,7 +113,8 @@ export function OnesCount32(x: number): number {
93
113
  return count
94
114
  }
95
115
 
96
- export function OnesCount64(x: bigint): number {
116
+ export function OnesCount64(x: Word64): number {
117
+ x = toUint64(x)
97
118
  let count = 0
98
119
  while (x > 0n) {
99
120
  count++
@@ -128,12 +149,17 @@ export function RotateLeft32(x: number, k: number): number {
128
149
  return ((x << k) | (x >>> (n - k))) >>> 0
129
150
  }
130
151
 
131
- export function RotateLeft64(x: bigint, k: number): bigint {
152
+ export function RotateLeft64(x: number, k: number): number
153
+ export function RotateLeft64(x: bigint, k: number): bigint
154
+ export function RotateLeft64(x: Word64, k: number): Word64 {
132
155
  const n = 64
133
156
  k = k % n
134
- const mask = (1n << 64n) - 1n
135
- x = x & mask
136
- return ((x << BigInt(k)) | (x >> BigInt(n - k))) & mask
157
+ const useBigInt = useBigIntResult(x)
158
+ const word = toUint64(x)
159
+ return word64Result(
160
+ ((word << BigInt(k)) | (word >> BigInt(n - k))) & uint64Mask,
161
+ useBigInt,
162
+ )
137
163
  }
138
164
 
139
165
  // --- Reverse ---
@@ -168,25 +194,35 @@ export function Reverse32(x: number): number {
168
194
  return x >>> 0
169
195
  }
170
196
 
171
- export function Reverse64(x: bigint): bigint {
197
+ export function Reverse64(x: number): number
198
+ export function Reverse64(x: bigint): bigint
199
+ export function Reverse64(x: Word64): Word64 {
172
200
  // Implement 64-bit reverse using similar bit manipulation
173
- const mask = (1n << 64n) - 1n
174
- x = x & mask
201
+ const useBigInt = useBigIntResult(x)
202
+ let word = toUint64(x)
175
203
 
176
204
  // Swap 32-bit halves
177
- x = ((x & 0xffffffff00000000n) >> 32n) | ((x & 0x00000000ffffffffn) << 32n)
205
+ word =
206
+ ((word & 0xffffffff00000000n) >> 32n) |
207
+ ((word & 0x00000000ffffffffn) << 32n)
178
208
  // Swap 16-bit chunks
179
- x = ((x & 0xffff0000ffff0000n) >> 16n) | ((x & 0x0000ffff0000ffffn) << 16n)
209
+ word =
210
+ ((word & 0xffff0000ffff0000n) >> 16n) |
211
+ ((word & 0x0000ffff0000ffffn) << 16n)
180
212
  // Swap 8-bit chunks
181
- x = ((x & 0xff00ff00ff00ff00n) >> 8n) | ((x & 0x00ff00ff00ff00ffn) << 8n)
213
+ word =
214
+ ((word & 0xff00ff00ff00ff00n) >> 8n) | ((word & 0x00ff00ff00ff00ffn) << 8n)
182
215
  // Swap 4-bit chunks
183
- x = ((x & 0xf0f0f0f0f0f0f0f0n) >> 4n) | ((x & 0x0f0f0f0f0f0f0f0fn) << 4n)
216
+ word =
217
+ ((word & 0xf0f0f0f0f0f0f0f0n) >> 4n) | ((word & 0x0f0f0f0f0f0f0f0fn) << 4n)
184
218
  // Swap 2-bit chunks
185
- x = ((x & 0xccccccccccccccccn) >> 2n) | ((x & 0x3333333333333333n) << 2n)
219
+ word =
220
+ ((word & 0xccccccccccccccccn) >> 2n) | ((word & 0x3333333333333333n) << 2n)
186
221
  // Swap 1-bit chunks
187
- x = ((x & 0xaaaaaaaaaaaaaaaan) >> 1n) | ((x & 0x5555555555555555n) << 1n)
222
+ word =
223
+ ((word & 0xaaaaaaaaaaaaaaaan) >> 1n) | ((word & 0x5555555555555555n) << 1n)
188
224
 
189
- return x & mask
225
+ return word64Result(word & uint64Mask, useBigInt)
190
226
  }
191
227
 
192
228
  // --- ReverseBytes ---
@@ -209,20 +245,23 @@ export function ReverseBytes32(x: number): number {
209
245
  )
210
246
  }
211
247
 
212
- export function ReverseBytes64(x: bigint): bigint {
213
- const mask = (1n << 64n) - 1n
214
- x = x & mask
215
-
216
- return (
217
- (((x & 0xffn) << 56n) |
218
- ((x & 0xff00n) << 40n) |
219
- ((x & 0xff0000n) << 24n) |
220
- ((x & 0xff000000n) << 8n) |
221
- ((x & 0xff00000000n) >> 8n) |
222
- ((x & 0xff0000000000n) >> 24n) |
223
- ((x & 0xff000000000000n) >> 40n) |
224
- ((x & 0xff00000000000000n) >> 56n)) &
225
- mask
248
+ export function ReverseBytes64(x: number): number
249
+ export function ReverseBytes64(x: bigint): bigint
250
+ export function ReverseBytes64(x: Word64): Word64 {
251
+ const useBigInt = useBigIntResult(x)
252
+ const word = toUint64(x)
253
+
254
+ return word64Result(
255
+ (((word & 0xffn) << 56n) |
256
+ ((word & 0xff00n) << 40n) |
257
+ ((word & 0xff0000n) << 24n) |
258
+ ((word & 0xff000000n) << 8n) |
259
+ ((word & 0xff00000000n) >> 8n) |
260
+ ((word & 0xff0000000000n) >> 24n) |
261
+ ((word & 0xff000000000000n) >> 40n) |
262
+ ((word & 0xff00000000000000n) >> 56n)) &
263
+ uint64Mask,
264
+ useBigInt,
226
265
  )
227
266
  }
228
267
 
@@ -243,7 +282,7 @@ export function Len32(x: number): number {
243
282
  return 32 - LeadingZeros32(x)
244
283
  }
245
284
 
246
- export function Len64(x: bigint): number {
285
+ export function Len64(x: Word64): number {
247
286
  return 64 - LeadingZeros64(x)
248
287
  }
249
288
 
@@ -260,26 +299,20 @@ export function Mul32(x: number, y: number): [number, number] {
260
299
  return [hi, lo]
261
300
  }
262
301
 
263
- export function Mul64(x: bigint, y: bigint): [bigint, bigint] {
264
- const mask32 = 0xffffffffn
265
-
266
- // Split into 32-bit parts
267
- const x0 = x & mask32
268
- const x1 = x >> 32n
269
- const y0 = y & mask32
270
- const y1 = y >> 32n
271
-
272
- // Multiply parts
273
- const p00 = x0 * y0
274
- const p01 = x0 * y1
275
- const p10 = x1 * y0
276
- const p11 = x1 * y1
302
+ export function Mul64(x: number, y: number): [number, number]
303
+ export function Mul64(x: bigint, y: bigint): [bigint, bigint]
304
+ export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
305
+ const useBigInt = useBigIntResult(x, y)
306
+ x = toUint64(x)
307
+ y = toUint64(y)
308
+ const product = x * y
309
+ const lo = product & uint64Mask
310
+ const hi = product >> 64n
277
311
 
278
- // Combine results
279
- const lo = p00 + ((p01 + p10) << 32n)
280
- const hi = p11 + ((p01 + p10) >> 32n) + (lo < p00 ? 1n : 0n)
281
-
282
- return [hi, lo]
312
+ return [
313
+ word64Result(hi & uint64Mask, useBigInt),
314
+ word64Result(lo, useBigInt),
315
+ ]
283
316
  }
284
317
 
285
318
  // --- Division functions ---
@@ -302,7 +335,13 @@ export function Div32(hi: number, lo: number, y: number): [number, number] {
302
335
  return [Number(quotient), Number(remainder)]
303
336
  }
304
337
 
305
- export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint] {
338
+ export function Div64(hi: number, lo: number, y: number): [number, number]
339
+ export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
340
+ export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
341
+ const useBigInt = useBigIntResult(hi, lo, y)
342
+ hi = toUint64(hi)
343
+ lo = toUint64(lo)
344
+ y = toUint64(y)
306
345
  if (y === 0n) {
307
346
  throw new Error('division by zero')
308
347
  }
@@ -313,7 +352,7 @@ export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint] {
313
352
  const quotient = dividend / y
314
353
  const remainder = dividend % y
315
354
 
316
- return [quotient, remainder]
355
+ return [word64Result(quotient, useBigInt), word64Result(remainder, useBigInt)]
317
356
  }
318
357
 
319
358
  // --- Add and Sub with carry ---
@@ -328,12 +367,14 @@ export function Add32(x: number, y: number, carry: number): [number, number] {
328
367
  return [result, carryOut]
329
368
  }
330
369
 
331
- export function Add64(x: bigint, y: bigint, carry: bigint): [bigint, bigint] {
332
- const mask = (1n << 64n) - 1n
333
- const sum = (x & mask) + (y & mask) + (carry & mask)
334
- const result = sum & mask
335
- const carryOut = sum > mask ? 1n : 0n
336
- return [result, carryOut]
370
+ export function Add64(x: number, y: number, carry: number): [number, number]
371
+ export function Add64(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
372
+ export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
373
+ const useBigInt = useBigIntResult(x, y, carry)
374
+ const sum = toUint64(x) + toUint64(y) + toUint64(carry)
375
+ const result = sum & uint64Mask
376
+ const carryOut = sum > uint64Mask ? 1n : 0n
377
+ return [word64Result(result, useBigInt), word64Result(carryOut, useBigInt)]
337
378
  }
338
379
 
339
380
  export function Sub(x: number, y: number, borrow: number): [number, number] {
@@ -347,10 +388,12 @@ export function Sub32(x: number, y: number, borrow: number): [number, number] {
347
388
  return [result, borrowOut]
348
389
  }
349
390
 
350
- export function Sub64(x: bigint, y: bigint, borrow: bigint): [bigint, bigint] {
351
- const mask = (1n << 64n) - 1n
352
- const diff = (x & mask) - (y & mask) - (borrow & mask)
353
- const result = diff & mask
391
+ export function Sub64(x: number, y: number, borrow: number): [number, number]
392
+ export function Sub64(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
393
+ export function Sub64(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
394
+ const useBigInt = useBigIntResult(x, y, borrow)
395
+ const diff = toUint64(x) - toUint64(y) - toUint64(borrow)
396
+ const result = diff & uint64Mask
354
397
  const borrowOut = diff < 0n ? 1n : 0n
355
- return [result, borrowOut]
398
+ return [word64Result(result, useBigInt), word64Result(borrowOut, useBigInt)]
356
399
  }
@@ -69,12 +69,18 @@ describe('Mathematical Constants', () => {
69
69
  expect(MaxUint32).toBe(4294967295)
70
70
  })
71
71
 
72
- it('should have correct bigint limits', () => {
73
- expect(MaxInt).toBe(9223372036854775807n)
74
- expect(MinInt).toBe(-9223372036854775808n)
75
- expect(MaxInt64).toBe(9223372036854775807n)
76
- expect(MinInt64).toBe(-9223372036854775808n)
72
+ it('should have correct wide integer limits', () => {
73
+ expect(MaxInt).toBe(Number(9223372036854775807n))
74
+ expect(MinInt).toBe(Number(-9223372036854775808n))
75
+ expect(MaxInt64).toBe(Number(9223372036854775807n))
76
+ expect(MinInt64).toBe(Number(-9223372036854775808n))
77
77
  expect(MaxUint).toBe(0xffffffffffffffffn)
78
78
  expect(MaxUint64).toBe(0xffffffffffffffffn)
79
79
  })
80
+
81
+ it('should typecheck current number-based uint64 comparisons', () => {
82
+ const counter: number = 0
83
+ const atLimit: boolean = counter === MaxUint64
84
+ expect(atLimit).toBe(false)
85
+ })
80
86
  })
@@ -47,10 +47,10 @@ export let SmallestNonzeroFloat64: number = Number.MIN_VALUE
47
47
  let intSize: number = (32 << ((~(0 as number) >> 63)))
48
48
 
49
49
  // MaxInt32 or MaxInt64 depending on intSize.
50
- export let MaxInt: bigint = 9223372036854775807n
50
+ export let MaxInt: number = 9223372036854775807
51
51
 
52
52
  // MinInt32 or MinInt64 depending on intSize.
53
- export let MinInt: bigint = -9223372036854775808n
53
+ export let MinInt: number = -9223372036854775808
54
54
 
55
55
  // 127
56
56
  export let MaxInt8: number = 127
@@ -71,10 +71,10 @@ export let MaxInt32: number = 2147483647
71
71
  export let MinInt32: number = -2147483648
72
72
 
73
73
  // 9223372036854775807
74
- export let MaxInt64: bigint = 9223372036854775807n
74
+ export let MaxInt64: number = 9223372036854775807
75
75
 
76
76
  // -9223372036854775808
77
- export let MinInt64: bigint = -9223372036854775808n
77
+ export let MinInt64: number = -9223372036854775808
78
78
 
79
79
  // MaxUint32 or MaxUint64 depending on intSize.
80
80
  export let MaxUint: bigint = 0xFFFFFFFFFFFFFFFFn
@@ -89,5 +89,4 @@ export let MaxUint16: number = 65535
89
89
  export let MaxUint32: number = 4294967295
90
90
 
91
91
  // 18446744073709551615
92
- export let MaxUint64: bigint = 0xFFFFFFFFFFFFFFFFn
93
-
92
+ export let MaxUint64: number | bigint = 0xFFFFFFFFFFFFFFFFn
@@ -0,0 +1,60 @@
1
+ export function FormatMediaType(
2
+ t: string,
3
+ param: Map<string, string> | Record<string, string> | null,
4
+ ): string {
5
+ if (!isToken(t)) {
6
+ return ''
7
+ }
8
+ let out = t
9
+ const entries =
10
+ param instanceof Map ?
11
+ Array.from(param.entries())
12
+ : Object.entries(param ?? {})
13
+ entries.sort(([a], [b]) => a.localeCompare(b))
14
+ for (const [key, value] of entries) {
15
+ if (!isToken(key)) {
16
+ return ''
17
+ }
18
+ out += formatParam(key, String(value))
19
+ }
20
+ return out
21
+ }
22
+
23
+ function formatParam(key: string, value: string): string {
24
+ if (isToken(value)) {
25
+ return `; ${key}=${value}`
26
+ }
27
+ return `; ${key}*=utf-8''${percentEncode(value)}`
28
+ }
29
+
30
+ function isToken(value: string): boolean {
31
+ return /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(value)
32
+ }
33
+
34
+ function percentEncode(value: string): string {
35
+ let out = ''
36
+ for (const byte of new TextEncoder().encode(value)) {
37
+ if (
38
+ (byte >= 0x30 && byte <= 0x39) ||
39
+ (byte >= 0x41 && byte <= 0x5a) ||
40
+ (byte >= 0x61 && byte <= 0x7a) ||
41
+ byte === 0x21 ||
42
+ byte === 0x23 ||
43
+ byte === 0x24 ||
44
+ byte === 0x26 ||
45
+ byte === 0x2b ||
46
+ byte === 0x2d ||
47
+ byte === 0x2e ||
48
+ byte === 0x5e ||
49
+ byte === 0x5f ||
50
+ byte === 0x60 ||
51
+ byte === 0x7c ||
52
+ byte === 0x7e
53
+ ) {
54
+ out += String.fromCharCode(byte)
55
+ continue
56
+ }
57
+ out += `%${byte.toString(16).toUpperCase().padStart(2, '0')}`
58
+ }
59
+ return out
60
+ }
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as $ from '@goscript/builtin/index.js'
4
+
5
+ import { Handler, Header_Get, Header_Set, MethodGet, NewRequest, StatusPartialContent } from '../index.js'
6
+ import { NewServer, NewUnstartedServer, Server_Start } from './index.js'
7
+
8
+ describe('net/http/httptest override', () => {
9
+ it('exports server helpers for typechecked server tests', () => {
10
+ const handler: Handler = {
11
+ ServeHTTP: () => undefined,
12
+ }
13
+
14
+ const srv = NewServer(handler)
15
+ expect(srv.URL).toBe('http://127.0.0.1')
16
+ expect(srv.Client()).toBeTruthy()
17
+ expect(srv.Config().Handler).toBe(handler)
18
+ expect(Server_Start(NewUnstartedServer(handler))?.Error()).toBe(
19
+ 'net/http/httptest: Server.Start is not implemented in GoScript',
20
+ )
21
+ })
22
+
23
+ it('routes Client.Do through the in-memory server handler', async () => {
24
+ const srv = NewServer({
25
+ ServeHTTP(w, r) {
26
+ Header_Set(w!.Header(), 'Content-Range', 'bytes 0-3/4')
27
+ const range = Header_Get($.pointerValue(r)!.Header, 'Range')
28
+ if (range !== 'bytes=0-3') {
29
+ w!.WriteHeader(400)
30
+ w!.Write($.stringToBytes(range))
31
+ return
32
+ }
33
+ w!.WriteHeader(StatusPartialContent)
34
+ w!.Write($.stringToBytes('data'))
35
+ },
36
+ })
37
+ const [req, reqErr] = NewRequest(MethodGet, srv.URL + '/pack.kvf', null)
38
+ expect(reqErr).toBeNull()
39
+ Header_Set(req!.Header, 'Range', 'bytes=0-3')
40
+
41
+ const [resp, err] = await srv.Client().Do(req)
42
+
43
+ expect(err).toBeNull()
44
+ expect(resp?.StatusCode).toBe(StatusPartialContent)
45
+ expect(Header_Get(resp!.Header, 'Content-Range')).toBe('bytes 0-3/4')
46
+ const buf = new Uint8Array(4)
47
+ const [n, readErr] = resp!.Body!.Read(buf)
48
+ expect(readErr).toBeNull()
49
+ expect(n).toBe(4)
50
+ expect(Buffer.from(buf).toString('utf8')).toBe('data')
51
+ expect(resp!.Body!.Close()).toBeNull()
52
+ })
53
+ })
@@ -0,0 +1,120 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as bytes from '@goscript/bytes/index.js'
3
+ import * as errors from '@goscript/errors/index.js'
4
+ import * as http from '@goscript/net/http/index.js'
5
+ import * as io from '@goscript/io/index.js'
6
+
7
+ class responseBody implements io.ReadCloser {
8
+ private reader: bytes.Reader
9
+
10
+ constructor(data: $.Bytes) {
11
+ this.reader = bytes.NewReader(Uint8Array.from(data ?? []))
12
+ }
13
+
14
+ public Read(p: $.Bytes): [number, $.GoError] {
15
+ return this.reader.Read(p)
16
+ }
17
+
18
+ public Close(): $.GoError {
19
+ return null
20
+ }
21
+ }
22
+
23
+ export class ResponseRecorder implements http.ResponseWriter {
24
+ public Code = 200
25
+ public Body = new bytes.Buffer()
26
+ private headerMap = new http.Header()
27
+ private wroteHeader = false
28
+
29
+ public Header(): http.Header {
30
+ return this.headerMap
31
+ }
32
+
33
+ public Write(p: $.Slice<number>): [number, $.GoError] {
34
+ if (!this.wroteHeader) {
35
+ this.WriteHeader(http.StatusOK)
36
+ }
37
+ return this.Body.Write(p)
38
+ }
39
+
40
+ public WriteHeader(statusCode: number): void {
41
+ if (this.wroteHeader) {
42
+ return
43
+ }
44
+ this.wroteHeader = true
45
+ this.Code = statusCode
46
+ }
47
+
48
+ public Result(): http.Response {
49
+ return new http.Response({
50
+ Body: new responseBody(this.Body.Bytes()),
51
+ Header: this.headerMap,
52
+ StatusCode: this.Code,
53
+ })
54
+ }
55
+ }
56
+
57
+ export function NewRecorder(): ResponseRecorder {
58
+ return new ResponseRecorder()
59
+ }
60
+
61
+ export function NewRequest(method: string, target: string, body: io.Reader | null): http.Request {
62
+ const [req, err] = http.NewRequest(method, target, body)
63
+ if (err != null || req == null) {
64
+ throw err ?? errors.New('net/http/httptest: NewRequest returned nil request')
65
+ }
66
+ return req
67
+ }
68
+
69
+ export class Server {
70
+ public URL: string
71
+ private handler: http.Handler | null
72
+
73
+ constructor(init?: Partial<Server> & { Handler?: http.Handler | null }) {
74
+ this.URL = init?.URL ?? 'http://127.0.0.1'
75
+ this.handler = init?.Handler ?? null
76
+ }
77
+
78
+ public Client(): http.Client {
79
+ return new http.Client({ Transport: new serverTransport(this) })
80
+ }
81
+
82
+ public Close(): void {}
83
+
84
+ public Config(): http.Server {
85
+ return new http.Server({ Handler: this.handler })
86
+ }
87
+
88
+ public ServeHTTP(w: http.ResponseWriter | null, r: http.Request | $.VarRef<http.Request> | null): void | Promise<void> {
89
+ return this.handler?.ServeHTTP(w, r)
90
+ }
91
+ }
92
+
93
+ class serverTransport implements http.RoundTripper {
94
+ constructor(private server: Server) {}
95
+
96
+ public RoundTrip(req: http.Request | $.VarRef<http.Request> | null): [http.Response | null, $.GoError] {
97
+ const request = $.pointerValue<http.Request | null>(req)
98
+ if (request == null) {
99
+ return [null, errors.New('net/http: nil Request')]
100
+ }
101
+ const recorder = NewRecorder()
102
+ const served = this.server.ServeHTTP(recorder, request)
103
+ if (served instanceof Promise) {
104
+ return [null, errors.New('net/http/httptest: async handlers are not supported by Client.Do')]
105
+ }
106
+ return [recorder.Result(), null]
107
+ }
108
+ }
109
+
110
+ export function NewServer(handler: http.Handler | null): Server {
111
+ return new Server({ Handler: handler })
112
+ }
113
+
114
+ export function NewUnstartedServer(handler: http.Handler | null): Server {
115
+ return new Server({ Handler: handler })
116
+ }
117
+
118
+ export function Server_Start(_s: Server | $.VarRef<Server> | null): $.GoError {
119
+ return errors.New('net/http/httptest: Server.Start is not implemented in GoScript')
120
+ }