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
@@ -0,0 +1,357 @@
1
+ package compiler
2
+
3
+ import (
4
+ "bytes"
5
+ "context"
6
+ "errors"
7
+ "io"
8
+ "io/fs"
9
+ "maps"
10
+ "os"
11
+ "path"
12
+ "path/filepath"
13
+ "slices"
14
+ "strings"
15
+
16
+ gs "github.com/aperturerobotics/goscript"
17
+ jsoniter "github.com/aperturerobotics/json-iterator-lite"
18
+ )
19
+
20
+ // OverrideFacts is the immutable compiler-visible view of GoScript overrides.
21
+ type OverrideFacts struct {
22
+ packages map[string]overridePackageFacts
23
+ }
24
+
25
+ type overridePackageFacts struct {
26
+ metadata OverrideMetadata
27
+ copyPackage overrideCopyPackage
28
+ dependencies []string
29
+ }
30
+
31
+ type overridePackageRoot struct {
32
+ pkgPath string
33
+ fsys fs.FS
34
+ dir string
35
+ }
36
+
37
+ // HasPackage returns true when pkgPath has a GoScript override package.
38
+ func (f *OverrideFacts) HasPackage(pkgPath string) bool {
39
+ if f == nil || pkgPath == "" {
40
+ return false
41
+ }
42
+ _, ok := f.packages[pkgPath]
43
+ return ok
44
+ }
45
+
46
+ // Metadata returns compiler-visible override metadata for a package path.
47
+ func (f *OverrideFacts) Metadata(pkgPath string) OverrideMetadata {
48
+ if f == nil {
49
+ return newOverrideMetadata()
50
+ }
51
+ pkg := f.packages[pkgPath]
52
+ return cloneOverrideMetadata(pkg.metadata)
53
+ }
54
+
55
+ // IsMethodAsync returns true when override metadata marks a method async.
56
+ func (f *OverrideFacts) IsMethodAsync(pkgPath, method string) bool {
57
+ if f == nil {
58
+ return false
59
+ }
60
+ pkg := f.packages[pkgPath]
61
+ return pkg.metadata.AsyncMethods[method]
62
+ }
63
+
64
+ // IsFunctionAsync returns true when override metadata marks a package-level function async.
65
+ func (f *OverrideFacts) IsFunctionAsync(pkgPath, function string) bool {
66
+ if f == nil {
67
+ return false
68
+ }
69
+ pkg := f.packages[pkgPath]
70
+ return pkg.metadata.AsyncFunctions[function]
71
+ }
72
+
73
+ func (f *OverrideFacts) copyPackage(pkgPath string) (overrideCopyPackage, []string, bool) {
74
+ if f == nil {
75
+ return overrideCopyPackage{}, nil, false
76
+ }
77
+ pkg, ok := f.packages[pkgPath]
78
+ if !ok {
79
+ return overrideCopyPackage{}, nil, false
80
+ }
81
+ return cloneOverrideCopyPackage(pkg.copyPackage), slices.Clone(pkg.dependencies), true
82
+ }
83
+
84
+ func (f *OverrideFacts) importPackageRoot(importPath string) (string, bool) {
85
+ if f == nil {
86
+ return "", false
87
+ }
88
+ importPath = strings.TrimPrefix(importPath, "@goscript/")
89
+ importPath = strings.TrimSuffix(importPath, ".js")
90
+ importPath = strings.TrimSuffix(importPath, ".ts")
91
+ if before, ok := strings.CutSuffix(importPath, "/index"); ok {
92
+ importPath = before
93
+ }
94
+ parts := strings.Split(importPath, "/")
95
+ for idx := len(parts); idx > 0; idx-- {
96
+ candidate := strings.Join(parts[:idx], "/")
97
+ if f.HasPackage(candidate) {
98
+ return candidate, true
99
+ }
100
+ }
101
+ return "", false
102
+ }
103
+
104
+ func buildOverrideFacts(ctx context.Context, overrideDirs []string) (*OverrideFacts, []Diagnostic) {
105
+ roots, diagnostics := discoverOverridePackageRoots(overrideDirs)
106
+ if diagnosticsHaveErrors(diagnostics) {
107
+ return nil, diagnostics
108
+ }
109
+ paths := make([]string, 0, len(roots))
110
+ for pkgPath := range roots {
111
+ paths = append(paths, pkgPath)
112
+ }
113
+ slices.Sort(paths)
114
+
115
+ facts := &OverrideFacts{packages: make(map[string]overridePackageFacts, len(paths))}
116
+ for _, pkgPath := range paths {
117
+ if err := ctx.Err(); err != nil {
118
+ return facts, []Diagnostic{contextCanceledDiagnostic(err)}
119
+ }
120
+ metadata, err := loadOverrideMetadata(roots[pkgPath])
121
+ if err != nil {
122
+ diagnostics = append(diagnostics, overrideError("read override metadata", pkgPath, err))
123
+ continue
124
+ }
125
+ copyPackage, dependencies, packageDiagnostics := loadOverrideCopyPackage(roots[pkgPath], roots, metadata)
126
+ diagnostics = append(diagnostics, packageDiagnostics...)
127
+ if diagnosticsHaveErrors(packageDiagnostics) {
128
+ continue
129
+ }
130
+ facts.packages[pkgPath] = overridePackageFacts{
131
+ metadata: cloneOverrideMetadata(metadata),
132
+ copyPackage: copyPackage,
133
+ dependencies: dependencies,
134
+ }
135
+ }
136
+ if diagnosticsHaveErrors(diagnostics) {
137
+ return facts, diagnostics
138
+ }
139
+ return facts, diagnostics
140
+ }
141
+
142
+ func discoverOverridePackageRoots(overrideDirs []string) (map[string]overridePackageRoot, []Diagnostic) {
143
+ roots := make(map[string]overridePackageRoot)
144
+ var diagnostics []Diagnostic
145
+ for _, dir := range overrideDirs {
146
+ dir = strings.TrimSpace(dir)
147
+ if dir == "" {
148
+ continue
149
+ }
150
+ abs, err := filepath.Abs(dir)
151
+ if err != nil {
152
+ diagnostics = append(diagnostics, overrideError("resolve override directory", dir, err))
153
+ continue
154
+ }
155
+ if err := discoverOverridePackageRootsInFS(roots, os.DirFS(abs), ".", false); err != nil {
156
+ diagnostics = append(diagnostics, overrideError("discover override packages", abs, err))
157
+ }
158
+ }
159
+ if err := discoverOverridePackageRootsInFS(roots, gs.GsOverrides, "gs", true); err != nil {
160
+ diagnostics = append(diagnostics, overrideError("discover override packages", "embedded gs", err))
161
+ }
162
+ return roots, diagnostics
163
+ }
164
+
165
+ func discoverOverridePackageRootsInFS(
166
+ roots map[string]overridePackageRoot,
167
+ fsys fs.FS,
168
+ rootDir string,
169
+ embedded bool,
170
+ ) error {
171
+ return fs.WalkDir(fsys, rootDir, func(filePath string, entry fs.DirEntry, err error) error {
172
+ if err != nil {
173
+ return err
174
+ }
175
+ if entry.IsDir() || path.Base(filePath) != "index.ts" {
176
+ return nil
177
+ }
178
+ pkgPath := strings.TrimPrefix(path.Dir(filePath), rootDir+"/")
179
+ if rootDir == "." {
180
+ pkgPath = path.Dir(filePath)
181
+ }
182
+ if pkgPath != "." && pkgPath != "" {
183
+ if _, exists := roots[pkgPath]; !exists || !embedded {
184
+ roots[pkgPath] = overridePackageRoot{
185
+ pkgPath: pkgPath,
186
+ fsys: fsys,
187
+ dir: path.Dir(filePath),
188
+ }
189
+ }
190
+ }
191
+ return nil
192
+ })
193
+ }
194
+
195
+ func loadOverrideMetadata(root overridePackageRoot) (OverrideMetadata, error) {
196
+ metadata := newOverrideMetadata()
197
+ data, err := fs.ReadFile(root.fsys, path.Join(root.dir, "meta.json"))
198
+ if err != nil {
199
+ if errors.Is(err, fs.ErrNotExist) {
200
+ return metadata, nil
201
+ }
202
+ return OverrideMetadata{}, err
203
+ }
204
+
205
+ iter := jsoniter.ParseBytes(data)
206
+ for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
207
+ switch field {
208
+ case "dependencies":
209
+ for iter.ReadArray() {
210
+ metadata.Dependencies = append(metadata.Dependencies, iter.ReadString())
211
+ }
212
+ case "asyncMethods":
213
+ for method := iter.ReadObject(); method != ""; method = iter.ReadObject() {
214
+ metadata.AsyncMethods[method] = iter.ReadBool()
215
+ }
216
+ case "asyncFunctions":
217
+ for function := iter.ReadObject(); function != ""; function = iter.ReadObject() {
218
+ metadata.AsyncFunctions[function] = iter.ReadBool()
219
+ }
220
+ default:
221
+ iter.Skip()
222
+ }
223
+ }
224
+ if iter.Error != nil && !errors.Is(iter.Error, io.EOF) {
225
+ return OverrideMetadata{}, iter.Error
226
+ }
227
+ return metadata, nil
228
+ }
229
+
230
+ func loadOverrideCopyPackage(
231
+ root overridePackageRoot,
232
+ roots map[string]overridePackageRoot,
233
+ metadata OverrideMetadata,
234
+ ) (overrideCopyPackage, []string, []Diagnostic) {
235
+ pkgPath := root.pkgPath
236
+ if _, ok := roots[pkgPath]; !ok {
237
+ return overrideCopyPackage{}, nil, []Diagnostic{{
238
+ Severity: DiagnosticSeverityError,
239
+ Code: "goscript/overrides:missing-package",
240
+ Message: "override package does not exist",
241
+ Detail: pkgPath,
242
+ }}
243
+ }
244
+
245
+ facts := &OverrideFacts{packages: make(map[string]overridePackageFacts, len(roots))}
246
+ for root := range roots {
247
+ facts.packages[root] = overridePackageFacts{}
248
+ }
249
+
250
+ copyPackage := overrideCopyPackage{path: pkgPath}
251
+ dependencySet := make(map[string]bool)
252
+ for _, dependency := range metadata.Dependencies {
253
+ dependency = strings.TrimSpace(dependency)
254
+ if dependency != "" && dependency != pkgPath {
255
+ dependencySet[dependency] = true
256
+ }
257
+ }
258
+
259
+ err := fs.WalkDir(root.fsys, root.dir, func(filePath string, entry fs.DirEntry, walkErr error) error {
260
+ if walkErr != nil {
261
+ return walkErr
262
+ }
263
+ if entry.IsDir() {
264
+ nestedPkg := strings.TrimPrefix(filePath, root.dir+"/")
265
+ if root.dir == "." {
266
+ nestedPkg = filePath
267
+ } else if nestedPkg != filePath {
268
+ nestedPkg = path.Join(pkgPath, nestedPkg)
269
+ }
270
+ if _, ok := roots[nestedPkg]; nestedPkg != pkgPath && ok {
271
+ return fs.SkipDir
272
+ }
273
+ return nil
274
+ }
275
+ if !isOverrideSourceFile(filePath) {
276
+ return nil
277
+ }
278
+ data, readErr := fs.ReadFile(root.fsys, filePath)
279
+ if readErr != nil {
280
+ return readErr
281
+ }
282
+ rel := strings.TrimPrefix(filePath, root.dir+"/")
283
+ if root.dir == "." {
284
+ rel = filePath
285
+ } else if rel != filePath {
286
+ rel = path.Join(pkgPath, rel)
287
+ }
288
+ copyPackage.files = append(copyPackage.files, overrideCopyFile{
289
+ path: rel,
290
+ data: data,
291
+ })
292
+ for _, imported := range scanOverrideImports(string(data)) {
293
+ dependency, ok := facts.importPackageRoot(imported)
294
+ if ok && dependency != "builtin" && dependency != pkgPath {
295
+ dependencySet[dependency] = true
296
+ }
297
+ }
298
+ return nil
299
+ })
300
+ if err != nil {
301
+ return overrideCopyPackage{}, nil, []Diagnostic{overrideError("read override package", pkgPath, err)}
302
+ }
303
+
304
+ if len(copyPackage.files) == 0 {
305
+ return overrideCopyPackage{}, nil, []Diagnostic{{
306
+ Severity: DiagnosticSeverityError,
307
+ Code: "goscript/overrides:empty-package",
308
+ Message: "override package does not contain TypeScript source files",
309
+ Detail: pkgPath,
310
+ }}
311
+ }
312
+ slices.SortFunc(copyPackage.files, func(a, b overrideCopyFile) int {
313
+ return strings.Compare(a.path, b.path)
314
+ })
315
+
316
+ dependencies := make([]string, 0, len(dependencySet))
317
+ for dependency := range dependencySet {
318
+ dependencies = append(dependencies, dependency)
319
+ }
320
+ slices.Sort(dependencies)
321
+ return copyPackage, dependencies, nil
322
+ }
323
+
324
+ func newOverrideMetadata() OverrideMetadata {
325
+ return OverrideMetadata{
326
+ AsyncFunctions: make(map[string]bool),
327
+ AsyncMethods: make(map[string]bool),
328
+ }
329
+ }
330
+
331
+ func cloneOverrideMetadata(metadata OverrideMetadata) OverrideMetadata {
332
+ return OverrideMetadata{
333
+ Dependencies: slices.Clone(metadata.Dependencies),
334
+ AsyncFunctions: cloneBoolMap(metadata.AsyncFunctions),
335
+ AsyncMethods: cloneBoolMap(metadata.AsyncMethods),
336
+ }
337
+ }
338
+
339
+ func cloneBoolMap(values map[string]bool) map[string]bool {
340
+ cloned := make(map[string]bool, len(values))
341
+ maps.Copy(cloned, values)
342
+ return cloned
343
+ }
344
+
345
+ func cloneOverrideCopyPackage(pkg overrideCopyPackage) overrideCopyPackage {
346
+ cloned := overrideCopyPackage{
347
+ path: pkg.path,
348
+ files: make([]overrideCopyFile, 0, len(pkg.files)),
349
+ }
350
+ for _, file := range pkg.files {
351
+ cloned.files = append(cloned.files, overrideCopyFile{
352
+ path: file.path,
353
+ data: bytes.Clone(file.data),
354
+ })
355
+ }
356
+ return cloned
357
+ }
@@ -2,82 +2,57 @@ package compiler
2
2
 
3
3
  import (
4
4
  "context"
5
- "errors"
6
- "io"
7
- "io/fs"
8
5
  "os"
9
- "path"
10
6
  "path/filepath"
11
7
  "slices"
12
8
  "strings"
13
-
14
- gs "github.com/aperturerobotics/goscript"
15
- jsoniter "github.com/aperturerobotics/json-iterator-lite"
16
9
  )
17
10
 
18
11
  // OverrideMetadata describes compiler-visible facts from a package override.
19
12
  type OverrideMetadata struct {
20
13
  // Dependencies are override package dependencies.
21
14
  Dependencies []string
15
+ // AsyncFunctions maps package-level function names to async status.
16
+ AsyncFunctions map[string]bool
22
17
  // AsyncMethods maps Type.Method keys to async status.
23
18
  AsyncMethods map[string]bool
24
19
  }
25
20
 
26
21
  // OverrideRegistryOwner owns GoScript override package metadata and copy plans.
27
22
  type OverrideRegistryOwner struct {
28
- metadata map[string]*OverrideMetadata
29
- packageRootCache map[string]bool
23
+ overrideDirs []string
24
+ facts *OverrideFacts
30
25
  }
31
26
 
32
27
  // NewOverrideRegistryOwner creates the override registry owner.
33
- func NewOverrideRegistryOwner() *OverrideRegistryOwner {
34
- return &OverrideRegistryOwner{
35
- metadata: make(map[string]*OverrideMetadata),
36
- }
28
+ func NewOverrideRegistryOwner(overrideDirs ...string) *OverrideRegistryOwner {
29
+ return &OverrideRegistryOwner{overrideDirs: slices.Clone(overrideDirs)}
37
30
  }
38
31
 
39
- // Metadata returns compiler-visible override metadata for a package path.
40
- func (o *OverrideRegistryOwner) Metadata(pkgPath string) (*OverrideMetadata, error) {
32
+ // Facts returns the immutable compiler-visible override facts.
33
+ func (o *OverrideRegistryOwner) Facts(ctx context.Context) (*OverrideFacts, []Diagnostic) {
41
34
  if o == nil {
42
35
  o = NewOverrideRegistryOwner()
43
36
  }
44
- if metadata := o.metadata[pkgPath]; metadata != nil {
45
- return metadata, nil
46
- }
47
-
48
- metadata := &OverrideMetadata{
49
- AsyncMethods: make(map[string]bool),
37
+ if o.facts != nil {
38
+ return o.facts, nil
50
39
  }
51
- data, err := gs.GsOverrides.ReadFile("gs/" + pkgPath + "/meta.json")
52
- if err != nil {
53
- if errors.Is(err, fs.ErrNotExist) {
54
- o.metadata[pkgPath] = metadata
55
- return metadata, nil
56
- }
57
- return nil, err
40
+ facts, diagnostics := buildOverrideFacts(ctx, o.overrideDirs)
41
+ if diagnosticsHaveErrors(diagnostics) {
42
+ return facts, diagnostics
58
43
  }
44
+ o.facts = facts
45
+ return facts, diagnostics
46
+ }
59
47
 
60
- iter := jsoniter.ParseBytes(data)
61
- for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
62
- switch field {
63
- case "dependencies":
64
- for iter.ReadArray() {
65
- metadata.Dependencies = append(metadata.Dependencies, iter.ReadString())
66
- }
67
- case "asyncMethods":
68
- for method := iter.ReadObject(); method != ""; method = iter.ReadObject() {
69
- metadata.AsyncMethods[method] = iter.ReadBool()
70
- }
71
- default:
72
- iter.Skip()
73
- }
74
- }
75
- if iter.Error != nil && !errors.Is(iter.Error, io.EOF) {
76
- return nil, iter.Error
48
+ // Metadata returns compiler-visible override metadata for a package path.
49
+ func (o *OverrideRegistryOwner) Metadata(pkgPath string) (*OverrideMetadata, error) {
50
+ facts, diagnostics := o.Facts(context.Background())
51
+ if diagnosticsHaveErrors(diagnostics) {
52
+ return nil, NewCompileError(diagnostics)
77
53
  }
78
-
79
- o.metadata[pkgPath] = metadata
80
- return metadata, nil
54
+ metadata := facts.Metadata(pkgPath)
55
+ return &metadata, nil
81
56
  }
82
57
 
83
58
  // CopyPlan builds the ordered override package copy plan for a request.
@@ -107,17 +82,17 @@ func (o *OverrideRegistryOwner) CopyPlan(
107
82
  Message: "override copy planning requires a package graph",
108
83
  }}
109
84
  }
110
- if _, err := o.packageRoots(); err != nil {
111
- return nil, []Diagnostic{overrideError("discover override packages", "", err)}
85
+ facts, diagnostics := o.Facts(ctx)
86
+ if diagnosticsHaveErrors(diagnostics) {
87
+ return nil, diagnostics
112
88
  }
113
89
 
114
- var diagnostics []Diagnostic
115
90
  visiting := make(map[string]bool)
116
91
  visited := make(map[string]bool)
117
- diagnostics = append(diagnostics, o.addPackageToPlan(ctx, plan, "builtin", visiting, visited)...)
92
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, "builtin", visiting, visited)...)
118
93
  for _, node := range graph.Nodes {
119
94
  if node.OverrideCandidate {
120
- diagnostics = append(diagnostics, o.addPackageToPlan(ctx, plan, node.PkgPath, visiting, visited)...)
95
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, node.PkgPath, visiting, visited)...)
121
96
  }
122
97
  }
123
98
  if diagnosticsHaveErrors(diagnostics) {
@@ -181,11 +156,20 @@ func (o *OverrideRegistryOwner) CopyPackages(
181
156
 
182
157
  // IsMethodAsync returns true when override metadata marks a method async.
183
158
  func (o *OverrideRegistryOwner) IsMethodAsync(pkgPath, method string) (bool, error) {
184
- metadata, err := o.Metadata(pkgPath)
185
- if err != nil {
186
- return false, err
159
+ facts, diagnostics := o.Facts(context.Background())
160
+ if diagnosticsHaveErrors(diagnostics) {
161
+ return false, NewCompileError(diagnostics)
162
+ }
163
+ return facts.IsMethodAsync(pkgPath, method), nil
164
+ }
165
+
166
+ // IsFunctionAsync returns true when override metadata marks a package-level function async.
167
+ func (o *OverrideRegistryOwner) IsFunctionAsync(pkgPath, function string) (bool, error) {
168
+ facts, diagnostics := o.Facts(context.Background())
169
+ if diagnosticsHaveErrors(diagnostics) {
170
+ return false, NewCompileError(diagnostics)
187
171
  }
188
- return metadata.AsyncMethods[method], nil
172
+ return facts.IsFunctionAsync(pkgPath, function), nil
189
173
  }
190
174
 
191
175
  type overrideCopyPlan struct {
@@ -204,6 +188,7 @@ type overrideCopyFile struct {
204
188
 
205
189
  func (o *OverrideRegistryOwner) addPackageToPlan(
206
190
  ctx context.Context,
191
+ facts *OverrideFacts,
207
192
  plan *overrideCopyPlan,
208
193
  pkgPath string,
209
194
  visiting map[string]bool,
@@ -228,13 +213,19 @@ func (o *OverrideRegistryOwner) addPackageToPlan(
228
213
  }}
229
214
  }
230
215
 
231
- pkg, dependencies, diagnostics := o.loadCopyPackage(pkgPath)
232
- if diagnosticsHaveErrors(diagnostics) {
233
- return diagnostics
216
+ pkg, dependencies, ok := facts.copyPackage(pkgPath)
217
+ if !ok {
218
+ return []Diagnostic{{
219
+ Severity: DiagnosticSeverityError,
220
+ Code: "goscript/overrides:missing-package",
221
+ Message: "override package does not exist",
222
+ Detail: pkgPath,
223
+ }}
234
224
  }
235
225
  visiting[pkgPath] = true
226
+ var diagnostics []Diagnostic
236
227
  for _, dependency := range dependencies {
237
- diagnostics = append(diagnostics, o.addPackageToPlan(ctx, plan, dependency, visiting, visited)...)
228
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, dependency, visiting, visited)...)
238
229
  }
239
230
  delete(visiting, pkgPath)
240
231
  if diagnosticsHaveErrors(diagnostics) {
@@ -246,135 +237,6 @@ func (o *OverrideRegistryOwner) addPackageToPlan(
246
237
  return diagnostics
247
238
  }
248
239
 
249
- func (o *OverrideRegistryOwner) loadCopyPackage(pkgPath string) (overrideCopyPackage, []string, []Diagnostic) {
250
- roots, err := o.packageRoots()
251
- if err != nil {
252
- return overrideCopyPackage{}, nil, []Diagnostic{overrideError("discover override packages", "", err)}
253
- }
254
- if !roots[pkgPath] {
255
- return overrideCopyPackage{}, nil, []Diagnostic{{
256
- Severity: DiagnosticSeverityError,
257
- Code: "goscript/overrides:missing-package",
258
- Message: "override package does not exist",
259
- Detail: pkgPath,
260
- }}
261
- }
262
-
263
- metadata, err := o.Metadata(pkgPath)
264
- if err != nil {
265
- return overrideCopyPackage{}, nil, []Diagnostic{overrideError("read override metadata", pkgPath, err)}
266
- }
267
-
268
- copyPackage := overrideCopyPackage{path: pkgPath}
269
- dependencySet := make(map[string]bool)
270
- for _, dependency := range metadata.Dependencies {
271
- dependency = strings.TrimSpace(dependency)
272
- if dependency != "" && dependency != pkgPath {
273
- dependencySet[dependency] = true
274
- }
275
- }
276
-
277
- root := "gs/" + pkgPath
278
- err = fs.WalkDir(gs.GsOverrides, root, func(filePath string, entry fs.DirEntry, walkErr error) error {
279
- if walkErr != nil {
280
- return walkErr
281
- }
282
- if entry.IsDir() {
283
- nestedPkg := strings.TrimPrefix(filePath, "gs/")
284
- if nestedPkg != pkgPath && roots[nestedPkg] {
285
- return fs.SkipDir
286
- }
287
- return nil
288
- }
289
- if !isOverrideSourceFile(filePath) {
290
- return nil
291
- }
292
- data, readErr := gs.GsOverrides.ReadFile(filePath)
293
- if readErr != nil {
294
- return readErr
295
- }
296
- rel := strings.TrimPrefix(filePath, "gs/")
297
- copyPackage.files = append(copyPackage.files, overrideCopyFile{
298
- path: rel,
299
- data: data,
300
- })
301
- for _, imported := range scanOverrideImports(string(data)) {
302
- dependency, ok := o.importPackageRoot(imported)
303
- if ok && dependency != "builtin" && dependency != pkgPath {
304
- dependencySet[dependency] = true
305
- }
306
- }
307
- return nil
308
- })
309
- if err != nil {
310
- return overrideCopyPackage{}, nil, []Diagnostic{overrideError("read override package", pkgPath, err)}
311
- }
312
-
313
- if len(copyPackage.files) == 0 {
314
- return overrideCopyPackage{}, nil, []Diagnostic{{
315
- Severity: DiagnosticSeverityError,
316
- Code: "goscript/overrides:empty-package",
317
- Message: "override package does not contain TypeScript source files",
318
- Detail: pkgPath,
319
- }}
320
- }
321
- slices.SortFunc(copyPackage.files, func(a, b overrideCopyFile) int {
322
- return strings.Compare(a.path, b.path)
323
- })
324
-
325
- dependencies := make([]string, 0, len(dependencySet))
326
- for dependency := range dependencySet {
327
- dependencies = append(dependencies, dependency)
328
- }
329
- slices.Sort(dependencies)
330
- return copyPackage, dependencies, nil
331
- }
332
-
333
- func (o *OverrideRegistryOwner) packageRoots() (map[string]bool, error) {
334
- if o.packageRootCache != nil {
335
- return o.packageRootCache, nil
336
- }
337
- roots := make(map[string]bool)
338
- if err := fs.WalkDir(gs.GsOverrides, "gs", func(filePath string, entry fs.DirEntry, err error) error {
339
- if err != nil {
340
- return err
341
- }
342
- if entry.IsDir() || path.Base(filePath) != "index.ts" {
343
- return nil
344
- }
345
- pkgPath := strings.TrimPrefix(path.Dir(filePath), "gs/")
346
- if pkgPath != "." && pkgPath != "" {
347
- roots[pkgPath] = true
348
- }
349
- return nil
350
- }); err != nil {
351
- return nil, err
352
- }
353
- o.packageRootCache = roots
354
- return roots, nil
355
- }
356
-
357
- func (o *OverrideRegistryOwner) importPackageRoot(importPath string) (string, bool) {
358
- roots, err := o.packageRoots()
359
- if err != nil {
360
- return "", false
361
- }
362
- importPath = strings.TrimPrefix(importPath, "@goscript/")
363
- importPath = strings.TrimSuffix(importPath, ".js")
364
- importPath = strings.TrimSuffix(importPath, ".ts")
365
- if before, ok := strings.CutSuffix(importPath, "/index"); ok {
366
- importPath = before
367
- }
368
- parts := strings.Split(importPath, "/")
369
- for idx := len(parts); idx > 0; idx-- {
370
- candidate := strings.Join(parts[:idx], "/")
371
- if roots[candidate] {
372
- return candidate, true
373
- }
374
- }
375
- return "", false
376
- }
377
-
378
240
  func isOverrideSourceFile(filePath string) bool {
379
241
  return strings.HasSuffix(filePath, ".ts") && !strings.HasSuffix(filePath, ".test.ts")
380
242
  }