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
package/gs/time/time.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import * as $ from '../builtin/index.js'
1
2
  import { makeChannel, ChannelRef, makeChannelRef } from '../builtin/channel.js'
2
3
 
3
4
  // Time represents a time instant with nanosecond precision
@@ -132,11 +133,40 @@ export class Time {
132
133
  return this._nsec
133
134
  }
134
135
 
136
+ public Date(): [number, Month, number] {
137
+ return [this.Year(), this.Month(), this.Day()]
138
+ }
139
+
140
+ public Clock(): [number, number, number] {
141
+ return [this.Hour(), this.Minute(), this.Second()]
142
+ }
143
+
144
+ public Zone(): [string, number] {
145
+ if (this._location.offsetSeconds !== undefined) {
146
+ return [this._location.name, this._location.offsetSeconds]
147
+ }
148
+ const offset = -this._date.getTimezoneOffset() * 60
149
+ return [this._location.name, offset]
150
+ }
151
+
135
152
  // Location returns the time zone information associated with t
136
153
  public Location(): Location {
137
154
  return this._location
138
155
  }
139
156
 
157
+ // UTC returns t with the location set to UTC.
158
+ public UTC(): Time {
159
+ return Time.create(this._date, this._nsec, undefined, UTC)
160
+ }
161
+
162
+ // In returns a copy of t representing the same instant in loc.
163
+ public In(loc: Location | $.VarRef<Location> | null): Time {
164
+ if (loc === null) {
165
+ throw new Error('time: missing Location in call to Time.In')
166
+ }
167
+ return Time.create(this._date, this._nsec, undefined, $.pointerValue(loc))
168
+ }
169
+
140
170
  // Format returns a textual representation of the time value formatted according to the layout
141
171
  public Format(layout: string): string {
142
172
  // Implementation of Go's time formatting based on reference time:
@@ -498,7 +528,7 @@ export class Time {
498
528
  // Add adds the duration d to t, returning the sum
499
529
  // Preserves monotonic reading if present
500
530
  public Add(d: Duration): Time {
501
- const durationNs = d
531
+ const durationNs = durationNumber(d)
502
532
  const newDate = new globalThis.Date(
503
533
  this._date.getTime() + Math.floor(durationNs / 1000000),
504
534
  )
@@ -508,6 +538,33 @@ export class Time {
508
538
  return Time.create(newDate, newNsec, newMonotonic, this._location)
509
539
  }
510
540
 
541
+ public AddDate(years: number, months: number, days: number): Time {
542
+ if (this._location.offsetSeconds !== undefined) {
543
+ const offsetMs = this._location.offsetSeconds * 1000
544
+ const local = new globalThis.Date(this._date.getTime() + offsetMs)
545
+ const shifted = globalThis.Date.UTC(
546
+ local.getUTCFullYear() + years,
547
+ local.getUTCMonth() + months,
548
+ local.getUTCDate() + days,
549
+ local.getUTCHours(),
550
+ local.getUTCMinutes(),
551
+ local.getUTCSeconds(),
552
+ local.getUTCMilliseconds(),
553
+ )
554
+ return Time.create(
555
+ new globalThis.Date(shifted - offsetMs),
556
+ this._nsec,
557
+ undefined,
558
+ this._location,
559
+ )
560
+ }
561
+ const shifted = new globalThis.Date(this._date.getTime())
562
+ shifted.setFullYear(shifted.getFullYear() + years)
563
+ shifted.setMonth(shifted.getMonth() + months)
564
+ shifted.setDate(shifted.getDate() + days)
565
+ return Time.create(shifted, this._nsec, undefined, this._location)
566
+ }
567
+
511
568
  // Equal reports whether t and u represent the same time instant
512
569
  // Uses monotonic clock if both times have it
513
570
  public Equal(u: Time): boolean {
@@ -517,6 +574,10 @@ export class Time {
517
574
  return this._date.getTime() === u._date.getTime() && this._nsec === u._nsec
518
575
  }
519
576
 
577
+ public IsZero(): boolean {
578
+ return this.Equal(new Time())
579
+ }
580
+
520
581
  // Before reports whether the time instant t is before u
521
582
  // Uses monotonic clock if both times have it
522
583
  public Before(u: Time): boolean {
@@ -579,6 +640,25 @@ export class Time {
579
640
  // Duration represents a span of time (nanoseconds)
580
641
  export type Duration = number
581
642
 
643
+ const maxDuration = Number(9223372036854775807n)
644
+ const minDuration = Number(-9223372036854775808n)
645
+ const maxTimerDelayMilliseconds = 0x7fffffff
646
+
647
+ function durationNumber(d: Duration): number {
648
+ return Number(d)
649
+ }
650
+
651
+ function timeoutMilliseconds(d: Duration): number {
652
+ const ms = durationNumber(d) / 1000000
653
+ if (!Number.isFinite(ms) || ms > maxTimerDelayMilliseconds) {
654
+ return maxTimerDelayMilliseconds
655
+ }
656
+ if (ms <= 0) {
657
+ return 0
658
+ }
659
+ return ms
660
+ }
661
+
582
662
  // Duration comparison function
583
663
  export function Duration_lt(receiver: Duration, other: Duration): boolean {
584
664
  return receiver < other
@@ -589,7 +669,147 @@ export function Duration_multiply(
589
669
  receiver: Duration,
590
670
  multiplier: number,
591
671
  ): Duration {
592
- return receiver * multiplier
672
+ return durationNumber(receiver) * multiplier
673
+ }
674
+
675
+ export function Duration_Abs(receiver: Duration): Duration {
676
+ const value = durationNumber(receiver)
677
+ if (value >= 0) {
678
+ return value
679
+ }
680
+ if (value === minDuration) {
681
+ return maxDuration
682
+ }
683
+ return -value
684
+ }
685
+
686
+ export function Duration_Hours(receiver: Duration): number {
687
+ return durationNumber(receiver) / Hour
688
+ }
689
+
690
+ export function Duration_Microseconds(receiver: Duration): number {
691
+ return Math.trunc(durationNumber(receiver) / Microsecond)
692
+ }
693
+
694
+ export function Duration_Milliseconds(receiver: Duration): number {
695
+ return Math.trunc(durationNumber(receiver) / Millisecond)
696
+ }
697
+
698
+ export function Duration_Minutes(receiver: Duration): number {
699
+ return durationNumber(receiver) / Minute
700
+ }
701
+
702
+ export function Duration_Nanoseconds(receiver: Duration): number {
703
+ return durationNumber(receiver)
704
+ }
705
+
706
+ export function Duration_Round(
707
+ receiver: Duration,
708
+ multiple: Duration,
709
+ ): Duration {
710
+ const value = durationNumber(receiver)
711
+ const unit = durationNumber(multiple)
712
+ if (unit <= 0) {
713
+ return value
714
+ }
715
+ const rounded =
716
+ value >= 0 ?
717
+ Math.floor(value / unit + 0.5) * unit
718
+ : Math.ceil(value / unit - 0.5) * unit
719
+ return Math.max(minDuration, Math.min(maxDuration, rounded))
720
+ }
721
+
722
+ // Duration_Seconds returns the duration as a floating point number of seconds.
723
+ export function Duration_Seconds(receiver: Duration): number {
724
+ return durationNumber(receiver) / Second
725
+ }
726
+
727
+ export function Duration_Truncate(
728
+ receiver: Duration,
729
+ multiple: Duration,
730
+ ): Duration {
731
+ const value = durationNumber(receiver)
732
+ const unit = durationNumber(multiple)
733
+ if (unit <= 0) {
734
+ return value
735
+ }
736
+ return value - (value % unit)
737
+ }
738
+
739
+ export function Duration_String(receiver: Duration): string {
740
+ const value = durationNumber(receiver)
741
+ if (value === 0) {
742
+ return '0s'
743
+ }
744
+ const sign = value < 0 ? '-' : ''
745
+ let remaining = Math.abs(value)
746
+ if (remaining < Second) {
747
+ return sign + formatSubsecond(remaining)
748
+ }
749
+ const hours = Math.floor(remaining / Hour)
750
+ remaining -= hours * Hour
751
+ const minutes = Math.floor(remaining / Minute)
752
+ remaining -= minutes * Minute
753
+ const seconds = Math.floor(remaining / Second)
754
+ remaining -= seconds * Second
755
+
756
+ let out = sign
757
+ if (hours !== 0) {
758
+ out += `${hours}h`
759
+ }
760
+ if (minutes !== 0) {
761
+ out += `${minutes}m`
762
+ }
763
+ if (seconds !== 0 || remaining !== 0) {
764
+ out += formatSeconds(seconds, remaining)
765
+ }
766
+ return out
767
+ }
768
+
769
+ export function Duration_format(
770
+ receiver: Duration,
771
+ buf: $.VarRef<number[]>,
772
+ ): number {
773
+ const text = Duration_String(receiver)
774
+ const bytes = Array.from(new TextEncoder().encode(text))
775
+ const start = Math.max(0, buf.value.length - bytes.length)
776
+ for (
777
+ let idx = 0;
778
+ idx < bytes.length && start + idx < buf.value.length;
779
+ idx++
780
+ ) {
781
+ buf.value[start + idx] = bytes[idx]!
782
+ }
783
+ return start
784
+ }
785
+
786
+ function formatSeconds(seconds: number, nanos: number): string {
787
+ if (nanos === 0) {
788
+ return `${seconds}s`
789
+ }
790
+ const fraction = String(nanos).padStart(9, '0').replace(/0+$/, '')
791
+ return `${seconds}.${fraction}s`
792
+ }
793
+
794
+ function formatSubsecond(nanos: number): string {
795
+ if (nanos >= Millisecond) {
796
+ return formatUnit(nanos, Millisecond, 'ms')
797
+ }
798
+ if (nanos >= Microsecond) {
799
+ return formatUnit(nanos, Microsecond, '\u00b5s')
800
+ }
801
+ return `${nanos}ns`
802
+ }
803
+
804
+ function formatUnit(nanos: number, unit: number, suffix: string): string {
805
+ const whole = Math.floor(nanos / unit)
806
+ const rem = nanos % unit
807
+ if (rem === 0) {
808
+ return `${whole}${suffix}`
809
+ }
810
+ const scale = Math.log10(unit)
811
+ const fraction = String(rem).padStart(scale, '0').replace(/0+$/, '')
812
+ return `${whole}.${fraction}${suffix}`
593
813
  }
594
814
 
595
815
  // Location represents a time zone
@@ -692,17 +912,13 @@ export class Timer {
692
912
  private _timeout: NodeJS.Timeout | number
693
913
  private _duration: Duration
694
914
  private _callback?: () => void
915
+ private _channel = makeChannel(1, new Time(), 'both')
916
+ public C: ChannelRef<Time> = makeChannelRef(this._channel, 'receive')
695
917
 
696
918
  constructor(duration: Duration, callback?: () => void) {
697
919
  this._duration = duration
698
920
  this._callback = callback
699
- const ms = duration / 1000000 // Convert nanoseconds to milliseconds
700
-
701
- if (callback) {
702
- this._timeout = setTimeout(callback, ms)
703
- } else {
704
- this._timeout = setTimeout(() => {}, ms)
705
- }
921
+ this._timeout = this.start(duration)
706
922
  }
707
923
 
708
924
  // Stop prevents the Timer from firing
@@ -718,13 +934,19 @@ export class Timer {
718
934
  // Reset changes the timer to expire after duration d
719
935
  public Reset(d: Duration): boolean {
720
936
  this.Stop()
721
- const ms = d / 1000000
937
+ this._duration = d
938
+ this._timeout = this.start(d)
939
+ return true
940
+ }
941
+
942
+ private start(d: Duration): NodeJS.Timeout | number {
943
+ const ms = timeoutMilliseconds(d)
722
944
  if (this._callback) {
723
- this._timeout = setTimeout(this._callback, ms)
724
- } else {
725
- this._timeout = setTimeout(() => {}, ms)
945
+ return setTimeout(this._callback, ms)
726
946
  }
727
- return true
947
+ return setTimeout(() => {
948
+ this._channel.send(Now()).catch(() => {})
949
+ }, ms)
728
950
  }
729
951
  }
730
952
 
@@ -733,11 +955,12 @@ export class Ticker {
733
955
  private _interval: NodeJS.Timeout | number
734
956
  private _duration: Duration
735
957
  private _stopped: boolean = false
958
+ private _channel = makeChannel(1, new Time(), 'both')
959
+ public C: ChannelRef<Time> = makeChannelRef(this._channel, 'receive')
736
960
 
737
961
  constructor(duration: Duration) {
738
962
  this._duration = duration
739
- const ms = duration / 1000000 // Convert nanoseconds to milliseconds
740
- this._interval = setInterval(() => {}, ms)
963
+ this._interval = this.start(duration)
741
964
  }
742
965
 
743
966
  // Stop turns off a ticker
@@ -755,20 +978,22 @@ export class Ticker {
755
978
  this.Stop()
756
979
  this._stopped = false
757
980
  this._duration = d
758
- const ms = d / 1000000
759
- this._interval = setInterval(() => {}, ms)
981
+ this._interval = this.start(d)
760
982
  }
761
983
 
762
984
  // Channel returns an async iterator that yields time values
763
985
  public async *Channel(): AsyncIterableIterator<Time> {
764
- const ms = this._duration / 1000000
765
986
  while (!this._stopped) {
766
- await new Promise((resolve) => setTimeout(resolve, ms))
767
- if (!this._stopped) {
768
- yield Now()
769
- }
987
+ yield await this.C.receive()
770
988
  }
771
989
  }
990
+
991
+ private start(d: Duration): NodeJS.Timeout | number {
992
+ const ms = timeoutMilliseconds(d)
993
+ return setInterval(() => {
994
+ this._channel.send(Now()).catch(() => {})
995
+ }, ms)
996
+ }
772
997
  }
773
998
 
774
999
  // Now returns the current local time with monotonic clock reading
@@ -861,17 +1086,29 @@ export function Until(t: Time): Duration {
861
1086
 
862
1087
  // Sleep pauses the current execution for at least the duration d
863
1088
  export async function Sleep(d: Duration): Promise<void> {
864
- const ms = d / 1000000 // Convert nanoseconds to milliseconds
1089
+ const ms = timeoutMilliseconds(d)
865
1090
  return new Promise((resolve) => setTimeout(resolve, ms))
866
1091
  }
867
1092
 
868
1093
  // Export month constants
1094
+ export const January = Month.January
1095
+ export const February = Month.February
1096
+ export const March = Month.March
1097
+ export const April = Month.April
869
1098
  export const May = Month.May
1099
+ export const June = Month.June
1100
+ export const July = Month.July
1101
+ export const August = Month.August
1102
+ export const September = Month.September
1103
+ export const October = Month.October
1104
+ export const November = Month.November
1105
+ export const December = Month.December
870
1106
 
871
1107
  // Time layout constants (matching Go's time package)
872
1108
  export const DateTime = '2006-01-02 15:04:05'
873
1109
  export const Layout = "01/02 03:04:05PM '06 -0700"
874
1110
  export const RFC3339 = '2006-01-02T15:04:05Z07:00'
1111
+ export const RFC3339Nano = '2006-01-02T15:04:05.999999999Z07:00'
875
1112
  export const Kitchen = '3:04PM'
876
1113
 
877
1114
  // Unix returns the local Time corresponding to the given Unix time,
@@ -907,12 +1144,12 @@ export function UnixNano(nsec: number): Time {
907
1144
  // ParseDuration parses a duration string
908
1145
  // A duration string is a possibly signed sequence of decimal numbers,
909
1146
  // each with optional fraction and a unit suffix
910
- export function ParseDuration(s: string): Duration {
1147
+ export function ParseDuration(s: string): [Duration, $.GoError] {
911
1148
  const regex = /^([+-]?)(\d+(?:\.\d+)?)(ns|us|µs|ms|s|m|h)$/
912
1149
  const match = s.match(regex)
913
1150
 
914
1151
  if (!match) {
915
- throw new Error(`time: invalid duration "${s}"`)
1152
+ return [0, $.newError(`time: invalid duration "${s}"`)]
916
1153
  }
917
1154
 
918
1155
  const [, sign, valueStr, unit] = match
@@ -941,14 +1178,14 @@ export function ParseDuration(s: string): Duration {
941
1178
  nanoseconds = value * 3600000000000
942
1179
  break
943
1180
  default:
944
- throw new Error(`time: unknown unit "${unit}" in duration "${s}"`)
1181
+ return [0, $.newError(`time: unknown unit "${unit}" in duration "${s}"`)]
945
1182
  }
946
1183
 
947
- return nanoseconds
1184
+ return [nanoseconds, null]
948
1185
  }
949
1186
 
950
1187
  // Parse parses a formatted string and returns the time value it represents
951
- export function Parse(layout: string, value: string): Time {
1188
+ export function Parse(layout: string, value: string): [Time, $.GoError] {
952
1189
  return ParseInLocation(layout, value, UTC)
953
1190
  }
954
1191
 
@@ -957,7 +1194,7 @@ export function ParseInLocation(
957
1194
  layout: string,
958
1195
  value: string,
959
1196
  loc: Location,
960
- ): Time {
1197
+ ): [Time, $.GoError] {
961
1198
  // This is a simplified implementation
962
1199
  // A full implementation would need to parse according to the layout format
963
1200
 
@@ -965,48 +1202,63 @@ export function ParseInLocation(
965
1202
  if (layout === RFC3339 || layout === '2006-01-02T15:04:05Z07:00') {
966
1203
  const date = new globalThis.Date(value)
967
1204
  if (isNaN(date.getTime())) {
968
- throw new ParseError(
969
- layout,
970
- value,
971
- '',
972
- '',
973
- `parsing time "${value}" as "${layout}": cannot parse`,
974
- )
1205
+ return [
1206
+ new Time(),
1207
+ $.toGoError(
1208
+ new ParseError(
1209
+ layout,
1210
+ value,
1211
+ '',
1212
+ '',
1213
+ `parsing time "${value}" as "${layout}": cannot parse`,
1214
+ ),
1215
+ ),
1216
+ ]
975
1217
  }
976
- return Time.create(date, 0, undefined, loc)
1218
+ return [Time.create(date, 0, undefined, loc), null]
977
1219
  }
978
1220
 
979
1221
  if (layout === DateTime || layout === '2006-01-02 15:04:05') {
980
1222
  const date = new globalThis.Date(value)
981
1223
  if (isNaN(date.getTime())) {
982
- throw new ParseError(
983
- layout,
984
- value,
985
- '',
986
- '',
987
- `parsing time "${value}" as "${layout}": cannot parse`,
988
- )
1224
+ return [
1225
+ new Time(),
1226
+ $.toGoError(
1227
+ new ParseError(
1228
+ layout,
1229
+ value,
1230
+ '',
1231
+ '',
1232
+ `parsing time "${value}" as "${layout}": cannot parse`,
1233
+ ),
1234
+ ),
1235
+ ]
989
1236
  }
990
- return Time.create(date, 0, undefined, loc)
1237
+ return [Time.create(date, 0, undefined, loc), null]
991
1238
  }
992
1239
 
993
1240
  // Fallback to standard Date parsing
994
1241
  const date = new globalThis.Date(value)
995
1242
  if (isNaN(date.getTime())) {
996
- throw new ParseError(
997
- layout,
998
- value,
999
- '',
1000
- '',
1001
- `parsing time "${value}" as "${layout}": cannot parse`,
1002
- )
1243
+ return [
1244
+ new Time(),
1245
+ $.toGoError(
1246
+ new ParseError(
1247
+ layout,
1248
+ value,
1249
+ '',
1250
+ '',
1251
+ `parsing time "${value}" as "${layout}": cannot parse`,
1252
+ ),
1253
+ ),
1254
+ ]
1003
1255
  }
1004
- return Time.create(date, 0, undefined, loc)
1256
+ return [Time.create(date, 0, undefined, loc), null]
1005
1257
  }
1006
1258
 
1007
1259
  // After waits for the duration to elapse and then sends the current time on the returned channel
1008
1260
  export function After(d: Duration): ChannelRef<Time> {
1009
- const ms = d / 1000000 // Convert nanoseconds to milliseconds
1261
+ const ms = timeoutMilliseconds(d)
1010
1262
 
1011
1263
  // Create a buffered channel with capacity 1
1012
1264
  const channel = makeChannel(1, new Time(), 'both')
@@ -1035,8 +1287,8 @@ export function NewTicker(d: Duration): Ticker {
1035
1287
  }
1036
1288
 
1037
1289
  // Tick is a convenience wrapper for NewTicker providing access to the ticking channel only
1038
- export function Tick(d: Duration): AsyncIterableIterator<Time> {
1039
- return new Ticker(d).Channel()
1290
+ export function Tick(d: Duration): ChannelRef<Time> {
1291
+ return new Ticker(d).C
1040
1292
  }
1041
1293
 
1042
1294
  // LoadLocation returns the Location with the given name
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as $ from '@goscript/builtin/index.js'
4
+
5
+ import {
6
+ CategoryAliases,
7
+ Cn,
8
+ Is,
9
+ Range16,
10
+ Range32,
11
+ RangeTable,
12
+ } from './unicode.js'
13
+
14
+ describe('unicode overrides', () => {
15
+ it('accepts generated struct-literal constructor shapes', () => {
16
+ const table = new RangeTable({
17
+ R16: $.arrayToSlice<Range16>([
18
+ new Range16({ Lo: 0x41, Hi: 0x5a, Stride: 1 }),
19
+ ]),
20
+ R32: $.arrayToSlice<Range32>([
21
+ new Range32({ Lo: 0x10000, Hi: 0x10002, Stride: 1 }),
22
+ ]),
23
+ LatinOffset: 1,
24
+ })
25
+
26
+ expect(table.LatinOffset).toBe(1)
27
+ expect(Is(table, 0x41)).toBe(true)
28
+ expect(Is(table, 0x10001)).toBe(true)
29
+ expect(Is(table, 0x61)).toBe(false)
30
+ })
31
+
32
+ it('exports category aliases used by regexp/syntax', () => {
33
+ expect(CategoryAliases.get('digit')).toBe('Nd')
34
+ expect(Cn).toBeInstanceOf(RangeTable)
35
+ })
36
+ })