goscript 0.0.84 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +267 -243
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +70 -69
  5. package/cmd/goscript/cmd_compile_test.go +79 -0
  6. package/cmd/goscript/main.go +11 -5
  7. package/compiler/build-flags.go +38 -0
  8. package/compiler/compile-request.go +220 -0
  9. package/compiler/compiler.go +16 -1336
  10. package/compiler/compliance_test.go +188 -0
  11. package/compiler/config.go +6 -13
  12. package/compiler/diagnostic.go +70 -0
  13. package/compiler/gotest/owner.go +24 -0
  14. package/compiler/gotest/package-result.go +67 -0
  15. package/compiler/gotest/request.go +145 -0
  16. package/compiler/gotest/result.go +28 -0
  17. package/compiler/gotest/runner.go +588 -0
  18. package/compiler/gotest/runner_test.go +627 -0
  19. package/compiler/gotest/test.go +9 -0
  20. package/compiler/index.test.ts +28 -28
  21. package/compiler/index.ts +40 -72
  22. package/compiler/lowered-program.go +184 -0
  23. package/compiler/lowering.go +8072 -0
  24. package/compiler/override-facts.go +307 -0
  25. package/compiler/override-registry.go +283 -0
  26. package/compiler/override-registry_test.go +254 -0
  27. package/compiler/package-graph.go +254 -0
  28. package/compiler/package-graph_test.go +316 -0
  29. package/compiler/package-test-function.go +9 -0
  30. package/compiler/package-test-graph-package.go +40 -0
  31. package/compiler/package-test-graph-variant.go +105 -0
  32. package/compiler/package-test-graph.go +117 -0
  33. package/compiler/package-test-graph_test.go +144 -0
  34. package/compiler/result.go +13 -0
  35. package/compiler/runtime-contract.go +439 -0
  36. package/compiler/runtime-contract_test.go +104 -0
  37. package/compiler/semantic-model-types.go +113 -0
  38. package/compiler/semantic-model.go +1422 -0
  39. package/compiler/semantic-model_test.go +471 -0
  40. package/compiler/service.go +133 -0
  41. package/compiler/skeleton_test.go +1775 -0
  42. package/compiler/tsworkspace/owner.go +334 -0
  43. package/compiler/tsworkspace/owner_test.go +93 -0
  44. package/compiler/tsworkspace/result.go +17 -0
  45. package/compiler/typescript-emitter.go +1040 -0
  46. package/compiler/wasm/compile.go +2 -3
  47. package/compiler/wasm/compile_test.go +79 -0
  48. package/compiler/wasm_api.go +140 -124
  49. package/dist/compiler/index.d.ts +1 -3
  50. package/dist/compiler/index.js +31 -55
  51. package/dist/compiler/index.js.map +1 -1
  52. package/dist/gs/builtin/builtin.d.ts +33 -2
  53. package/dist/gs/builtin/builtin.js +217 -6
  54. package/dist/gs/builtin/builtin.js.map +1 -1
  55. package/dist/gs/builtin/channel.d.ts +11 -3
  56. package/dist/gs/builtin/channel.js +12 -0
  57. package/dist/gs/builtin/channel.js.map +1 -1
  58. package/dist/gs/builtin/hostio.d.ts +15 -1
  59. package/dist/gs/builtin/hostio.js +134 -49
  60. package/dist/gs/builtin/hostio.js.map +1 -1
  61. package/dist/gs/builtin/index.d.ts +1 -0
  62. package/dist/gs/builtin/index.js +1 -0
  63. package/dist/gs/builtin/index.js.map +1 -1
  64. package/dist/gs/builtin/slice.d.ts +23 -3
  65. package/dist/gs/builtin/slice.js +216 -44
  66. package/dist/gs/builtin/slice.js.map +1 -1
  67. package/dist/gs/builtin/type.d.ts +16 -2
  68. package/dist/gs/builtin/type.js +134 -21
  69. package/dist/gs/builtin/type.js.map +1 -1
  70. package/dist/gs/builtin/varRef.d.ts +5 -0
  71. package/dist/gs/builtin/varRef.js +23 -0
  72. package/dist/gs/builtin/varRef.js.map +1 -1
  73. package/dist/gs/bytes/buffer.gs.js +48 -44
  74. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  75. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/context/context.d.ts +5 -4
  79. package/dist/gs/context/context.js +10 -10
  80. package/dist/gs/context/context.js.map +1 -1
  81. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  82. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  83. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  84. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  85. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  86. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  87. package/dist/gs/crypto/rand/index.d.ts +5 -0
  88. package/dist/gs/crypto/rand/index.js +77 -0
  89. package/dist/gs/crypto/rand/index.js.map +1 -0
  90. package/dist/gs/embed/index.d.ts +7 -0
  91. package/dist/gs/embed/index.js +16 -0
  92. package/dist/gs/embed/index.js.map +1 -0
  93. package/dist/gs/encoding/json/index.d.ts +4 -0
  94. package/dist/gs/encoding/json/index.js +178 -0
  95. package/dist/gs/encoding/json/index.js.map +1 -0
  96. package/dist/gs/errors/errors.d.ts +4 -0
  97. package/dist/gs/errors/errors.js +81 -0
  98. package/dist/gs/errors/errors.js.map +1 -1
  99. package/dist/gs/fmt/fmt.d.ts +4 -4
  100. package/dist/gs/fmt/fmt.js +42 -11
  101. package/dist/gs/fmt/fmt.js.map +1 -1
  102. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +36 -1
  103. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
  104. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  105. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  106. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  107. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  108. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  109. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  110. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  111. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  112. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  113. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  114. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  115. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  116. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
  117. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  118. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  119. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  120. package/dist/gs/go/scanner/index.d.ts +42 -0
  121. package/dist/gs/go/scanner/index.js +155 -0
  122. package/dist/gs/go/scanner/index.js.map +1 -0
  123. package/dist/gs/go/token/index.d.ts +187 -0
  124. package/dist/gs/go/token/index.js +578 -0
  125. package/dist/gs/go/token/index.js.map +1 -0
  126. package/dist/gs/internal/abi/index.d.ts +4 -0
  127. package/dist/gs/internal/abi/index.js +10 -0
  128. package/dist/gs/internal/abi/index.js.map +1 -1
  129. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  130. package/dist/gs/internal/bytealg/index.js +14 -0
  131. package/dist/gs/internal/bytealg/index.js.map +1 -1
  132. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  133. package/dist/gs/internal/byteorder/index.js +56 -25
  134. package/dist/gs/internal/byteorder/index.js.map +1 -1
  135. package/dist/gs/internal/godebug/index.d.ts +12 -0
  136. package/dist/gs/internal/godebug/index.js +30 -0
  137. package/dist/gs/internal/godebug/index.js.map +1 -0
  138. package/dist/gs/io/fs/fs.js.map +1 -1
  139. package/dist/gs/io/fs/index.d.ts +1 -0
  140. package/dist/gs/io/fs/index.js +1 -0
  141. package/dist/gs/io/fs/index.js.map +1 -1
  142. package/dist/gs/io/fs/readdir.js.map +1 -1
  143. package/dist/gs/io/fs/readfile.js.map +1 -1
  144. package/dist/gs/io/fs/readlink.d.ts +8 -0
  145. package/dist/gs/io/fs/readlink.js +64 -0
  146. package/dist/gs/io/fs/readlink.js.map +1 -0
  147. package/dist/gs/io/fs/stat.js.map +1 -1
  148. package/dist/gs/io/fs/sub.js.map +1 -1
  149. package/dist/gs/io/fs/walk.d.ts +3 -3
  150. package/dist/gs/io/fs/walk.js +7 -7
  151. package/dist/gs/io/fs/walk.js.map +1 -1
  152. package/dist/gs/io/io.d.ts +40 -6
  153. package/dist/gs/io/io.js +151 -26
  154. package/dist/gs/io/io.js.map +1 -1
  155. package/dist/gs/maps/iter.d.ts +3 -3
  156. package/dist/gs/maps/iter.js +3 -3
  157. package/dist/gs/maps/iter.js.map +1 -1
  158. package/dist/gs/maps/maps.d.ts +2 -2
  159. package/dist/gs/maps/maps.js +1 -1
  160. package/dist/gs/maps/maps.js.map +1 -1
  161. package/dist/gs/math/bits/index.d.ts +13 -4
  162. package/dist/gs/math/bits/index.js +66 -34
  163. package/dist/gs/math/bits/index.js.map +1 -1
  164. package/dist/gs/math/const.gs.d.ts +5 -5
  165. package/dist/gs/math/const.gs.js +4 -4
  166. package/dist/gs/math/const.gs.js.map +1 -1
  167. package/dist/gs/mime/index.d.ts +1 -0
  168. package/dist/gs/mime/index.js +50 -0
  169. package/dist/gs/mime/index.js.map +1 -0
  170. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  171. package/dist/gs/net/http/httptest/index.js +21 -0
  172. package/dist/gs/net/http/httptest/index.js.map +1 -0
  173. package/dist/gs/net/http/index.d.ts +27 -0
  174. package/dist/gs/net/http/index.js +61 -0
  175. package/dist/gs/net/http/index.js.map +1 -0
  176. package/dist/gs/os/dir_unix.gs.js +2 -2
  177. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  178. package/dist/gs/os/error.gs.js +2 -4
  179. package/dist/gs/os/error.gs.js.map +1 -1
  180. package/dist/gs/os/exec.gs.js.map +1 -1
  181. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  182. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  183. package/dist/gs/os/root_js.gs.js.map +1 -1
  184. package/dist/gs/os/tempfile.gs.js +66 -9
  185. package/dist/gs/os/tempfile.gs.js.map +1 -1
  186. package/dist/gs/os/types.gs.js.map +1 -1
  187. package/dist/gs/os/types_js.gs.js +9 -9
  188. package/dist/gs/os/types_js.gs.js.map +1 -1
  189. package/dist/gs/os/types_unix.gs.js.map +1 -1
  190. package/dist/gs/path/filepath/match.js +165 -3
  191. package/dist/gs/path/filepath/match.js.map +1 -1
  192. package/dist/gs/path/filepath/path.d.ts +3 -1
  193. package/dist/gs/path/filepath/path.js +133 -4
  194. package/dist/gs/path/filepath/path.js.map +1 -1
  195. package/dist/gs/path/match.js.map +1 -1
  196. package/dist/gs/path/path.d.ts +4 -1
  197. package/dist/gs/path/path.js +16 -4
  198. package/dist/gs/path/path.js.map +1 -1
  199. package/dist/gs/reflect/index.d.ts +3 -3
  200. package/dist/gs/reflect/index.js +2 -2
  201. package/dist/gs/reflect/index.js.map +1 -1
  202. package/dist/gs/reflect/map.js +3 -0
  203. package/dist/gs/reflect/map.js.map +1 -1
  204. package/dist/gs/reflect/type.d.ts +9 -5
  205. package/dist/gs/reflect/type.js +233 -21
  206. package/dist/gs/reflect/type.js.map +1 -1
  207. package/dist/gs/reflect/types.js.map +1 -1
  208. package/dist/gs/reflect/visiblefields.js.map +1 -1
  209. package/dist/gs/runtime/debug/index.d.ts +2 -0
  210. package/dist/gs/runtime/debug/index.js +8 -0
  211. package/dist/gs/runtime/debug/index.js.map +1 -0
  212. package/dist/gs/runtime/runtime.d.ts +35 -3
  213. package/dist/gs/runtime/runtime.js +72 -0
  214. package/dist/gs/runtime/runtime.js.map +1 -1
  215. package/dist/gs/slices/slices.d.ts +24 -5
  216. package/dist/gs/slices/slices.js +214 -5
  217. package/dist/gs/slices/slices.js.map +1 -1
  218. package/dist/gs/sort/slice.gs.d.ts +3 -3
  219. package/dist/gs/sort/slice.gs.js +6 -6
  220. package/dist/gs/sort/slice.gs.js.map +1 -1
  221. package/dist/gs/sort/sort.gs.d.ts +4 -4
  222. package/dist/gs/sort/sort.gs.js +11 -8
  223. package/dist/gs/sort/sort.gs.js.map +1 -1
  224. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  225. package/dist/gs/strconv/quote.gs.js.map +1 -1
  226. package/dist/gs/strings/builder.d.ts +1 -1
  227. package/dist/gs/strings/builder.js +3 -2
  228. package/dist/gs/strings/builder.js.map +1 -1
  229. package/dist/gs/strings/reader.js.map +1 -1
  230. package/dist/gs/strings/replace.js.map +1 -1
  231. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  232. package/dist/gs/sync/atomic/type.gs.js +0 -2
  233. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  234. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  235. package/dist/gs/sync/sync.d.ts +3 -0
  236. package/dist/gs/sync/sync.js +39 -0
  237. package/dist/gs/sync/sync.js.map +1 -1
  238. package/dist/gs/syscall/constants.d.ts +36 -24
  239. package/dist/gs/syscall/constants.js +12 -0
  240. package/dist/gs/syscall/constants.js.map +1 -1
  241. package/dist/gs/syscall/errors.d.ts +2 -0
  242. package/dist/gs/syscall/errors.js +8 -0
  243. package/dist/gs/syscall/errors.js.map +1 -1
  244. package/dist/gs/syscall/fs.d.ts +43 -0
  245. package/dist/gs/syscall/fs.js +102 -0
  246. package/dist/gs/syscall/fs.js.map +1 -1
  247. package/dist/gs/syscall/js/index.d.ts +90 -0
  248. package/dist/gs/syscall/js/index.js +375 -0
  249. package/dist/gs/syscall/js/index.js.map +1 -0
  250. package/dist/gs/syscall/types.d.ts +22 -0
  251. package/dist/gs/syscall/types.js +45 -1
  252. package/dist/gs/syscall/types.js.map +1 -1
  253. package/dist/gs/testing/index.d.ts +1 -0
  254. package/dist/gs/testing/index.js +2 -0
  255. package/dist/gs/testing/index.js.map +1 -0
  256. package/dist/gs/testing/testing.d.ts +77 -0
  257. package/dist/gs/testing/testing.js +301 -0
  258. package/dist/gs/testing/testing.js.map +1 -0
  259. package/dist/gs/time/time.d.ts +41 -4
  260. package/dist/gs/time/time.js +205 -36
  261. package/dist/gs/time/time.js.map +1 -1
  262. package/dist/gs/unicode/unicode.d.ts +23 -1
  263. package/dist/gs/unicode/unicode.js +79 -10
  264. package/dist/gs/unicode/unicode.js.map +1 -1
  265. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  266. package/dist/gs/unicode/utf8/utf8.js +24 -11
  267. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  268. package/dist/gs/unique/index.d.ts +11 -0
  269. package/dist/gs/unique/index.js +71 -0
  270. package/dist/gs/unique/index.js.map +1 -0
  271. package/go.mod +2 -2
  272. package/go.sum +9 -0
  273. package/gs/builtin/builtin.ts +266 -8
  274. package/gs/builtin/channel.ts +22 -0
  275. package/gs/builtin/hostio.test.ts +177 -0
  276. package/gs/builtin/hostio.ts +171 -56
  277. package/gs/builtin/index.ts +1 -0
  278. package/gs/builtin/runtime-contract.test.ts +356 -0
  279. package/gs/builtin/slice.ts +259 -50
  280. package/gs/builtin/type.ts +188 -30
  281. package/gs/builtin/varRef.ts +38 -1
  282. package/gs/bytes/buffer.gs.ts +48 -44
  283. package/gs/bytes/meta.json +8 -3
  284. package/gs/bytes/reader.gs.ts +20 -19
  285. package/gs/context/context.test.ts +41 -0
  286. package/gs/context/context.ts +22 -26
  287. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  288. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  289. package/gs/crypto/rand/index.test.ts +32 -0
  290. package/gs/crypto/rand/index.ts +90 -0
  291. package/gs/crypto/rand/meta.json +5 -0
  292. package/gs/embed/index.ts +20 -0
  293. package/gs/embed/meta.json +5 -0
  294. package/gs/encoding/json/index.test.ts +79 -0
  295. package/gs/encoding/json/index.ts +210 -0
  296. package/gs/errors/errors.test.ts +82 -0
  297. package/gs/errors/errors.ts +104 -0
  298. package/gs/fmt/fmt.ts +56 -16
  299. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
  300. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
  301. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  302. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  303. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  304. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  305. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
  306. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  307. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  308. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  309. package/gs/go/internal/scannerhooks/index.ts +9 -0
  310. package/gs/go/scanner/index.test.ts +72 -0
  311. package/gs/go/scanner/index.ts +204 -0
  312. package/gs/go/token/index.test.ts +67 -0
  313. package/gs/go/token/index.ts +686 -0
  314. package/gs/internal/abi/index.test.ts +18 -0
  315. package/gs/internal/abi/index.ts +14 -0
  316. package/gs/internal/bytealg/index.test.ts +18 -0
  317. package/gs/internal/bytealg/index.ts +16 -0
  318. package/gs/internal/byteorder/index.test.ts +39 -0
  319. package/gs/internal/byteorder/index.ts +100 -27
  320. package/gs/internal/godebug/index.test.ts +16 -0
  321. package/gs/internal/godebug/index.ts +35 -0
  322. package/gs/io/fs/index.ts +1 -0
  323. package/gs/io/fs/meta.json +5 -0
  324. package/gs/io/fs/readlink.test.ts +43 -0
  325. package/gs/io/fs/readlink.ts +77 -0
  326. package/gs/io/fs/walk.test.ts +61 -0
  327. package/gs/io/fs/walk.ts +9 -9
  328. package/gs/io/io.ts +174 -31
  329. package/gs/io/meta.json +10 -2
  330. package/gs/maps/iter.ts +12 -6
  331. package/gs/maps/maps.ts +8 -6
  332. package/gs/math/bits/index.ts +103 -47
  333. package/gs/math/const.gs.test.ts +11 -5
  334. package/gs/math/const.gs.ts +5 -6
  335. package/gs/mime/index.ts +54 -0
  336. package/gs/net/http/httptest/index.ts +25 -0
  337. package/gs/net/http/index.test.ts +20 -0
  338. package/gs/net/http/index.ts +81 -0
  339. package/gs/os/dir_unix.gs.ts +2 -3
  340. package/gs/os/file_unix_js.test.ts +50 -0
  341. package/gs/os/meta.json +1 -2
  342. package/gs/os/tempfile.gs.test.ts +85 -0
  343. package/gs/os/tempfile.gs.ts +71 -11
  344. package/gs/os/types_js.gs.ts +11 -11
  345. package/gs/path/filepath/match.test.ts +31 -12
  346. package/gs/path/filepath/match.ts +178 -3
  347. package/gs/path/filepath/path.test.ts +25 -0
  348. package/gs/path/filepath/path.ts +159 -5
  349. package/gs/path/path.ts +20 -5
  350. package/gs/reflect/index.ts +2 -1
  351. package/gs/reflect/map.test.ts +19 -0
  352. package/gs/reflect/map.ts +4 -0
  353. package/gs/reflect/type.ts +298 -29
  354. package/gs/reflect/typefor.test.ts +75 -0
  355. package/gs/runtime/debug/index.test.ts +24 -0
  356. package/gs/runtime/debug/index.ts +8 -0
  357. package/gs/runtime/runtime.test.ts +19 -0
  358. package/gs/runtime/runtime.ts +98 -3
  359. package/gs/slices/slices.test.ts +94 -0
  360. package/gs/slices/slices.ts +245 -5
  361. package/gs/sort/meta.json +7 -0
  362. package/gs/sort/slice.gs.ts +16 -7
  363. package/gs/sort/sort.gs.ts +16 -13
  364. package/gs/strings/builder.ts +4 -3
  365. package/gs/sync/atomic/type.gs.ts +13 -14
  366. package/gs/sync/meta.json +3 -1
  367. package/gs/sync/sync.test.ts +36 -0
  368. package/gs/sync/sync.ts +39 -0
  369. package/gs/syscall/constants.ts +39 -24
  370. package/gs/syscall/errors.ts +10 -0
  371. package/gs/syscall/fs.ts +195 -0
  372. package/gs/syscall/js/index.ts +458 -0
  373. package/gs/syscall/js/meta.json +4 -0
  374. package/gs/syscall/net.test.ts +85 -0
  375. package/gs/syscall/types.ts +56 -0
  376. package/gs/testing/index.ts +1 -0
  377. package/gs/testing/meta.json +5 -0
  378. package/gs/testing/testing.test.ts +90 -0
  379. package/gs/testing/testing.ts +382 -0
  380. package/gs/time/time.test.ts +106 -0
  381. package/gs/time/time.ts +278 -57
  382. package/gs/unicode/unicode.test.ts +25 -0
  383. package/gs/unicode/unicode.ts +119 -9
  384. package/gs/unicode/utf8/utf8.test.ts +13 -0
  385. package/gs/unicode/utf8/utf8.ts +28 -16
  386. package/gs/unique/index.ts +91 -0
  387. package/package.json +14 -13
  388. package/compiler/analysis.go +0 -3475
  389. package/compiler/analysis_test.go +0 -338
  390. package/compiler/assignment.go +0 -580
  391. package/compiler/builtin_test.go +0 -92
  392. package/compiler/code-writer.go +0 -115
  393. package/compiler/compiler_test.go +0 -149
  394. package/compiler/composite-lit.go +0 -779
  395. package/compiler/config_test.go +0 -62
  396. package/compiler/constraint.go +0 -86
  397. package/compiler/decl.go +0 -801
  398. package/compiler/expr-call-async.go +0 -188
  399. package/compiler/expr-call-builtins.go +0 -208
  400. package/compiler/expr-call-helpers.go +0 -382
  401. package/compiler/expr-call-make.go +0 -318
  402. package/compiler/expr-call-type-conversion.go +0 -520
  403. package/compiler/expr-call.go +0 -413
  404. package/compiler/expr-selector.go +0 -343
  405. package/compiler/expr-star.go +0 -82
  406. package/compiler/expr-type.go +0 -442
  407. package/compiler/expr-value.go +0 -89
  408. package/compiler/expr.go +0 -773
  409. package/compiler/field.go +0 -183
  410. package/compiler/gs_dependencies_test.go +0 -298
  411. package/compiler/lit.go +0 -322
  412. package/compiler/output.go +0 -72
  413. package/compiler/primitive.go +0 -149
  414. package/compiler/protobuf.go +0 -697
  415. package/compiler/sanitize.go +0 -100
  416. package/compiler/spec-struct.go +0 -995
  417. package/compiler/spec-value.go +0 -540
  418. package/compiler/spec.go +0 -725
  419. package/compiler/stmt-assign.go +0 -664
  420. package/compiler/stmt-for.go +0 -266
  421. package/compiler/stmt-range.go +0 -475
  422. package/compiler/stmt-select.go +0 -262
  423. package/compiler/stmt-type-switch.go +0 -147
  424. package/compiler/stmt.go +0 -1308
  425. package/compiler/type-assert.go +0 -386
  426. package/compiler/type-info.go +0 -156
  427. package/compiler/type-utils.go +0 -207
  428. package/compiler/type.go +0 -892
@@ -0,0 +1,307 @@
1
+ package compiler
2
+
3
+ import (
4
+ "bytes"
5
+ "context"
6
+ "errors"
7
+ "io"
8
+ "io/fs"
9
+ "maps"
10
+ "path"
11
+ "slices"
12
+ "strings"
13
+
14
+ gs "github.com/aperturerobotics/goscript"
15
+ jsoniter "github.com/aperturerobotics/json-iterator-lite"
16
+ )
17
+
18
+ // OverrideFacts is the immutable compiler-visible view of GoScript overrides.
19
+ type OverrideFacts struct {
20
+ packages map[string]overridePackageFacts
21
+ }
22
+
23
+ type overridePackageFacts struct {
24
+ metadata OverrideMetadata
25
+ copyPackage overrideCopyPackage
26
+ dependencies []string
27
+ }
28
+
29
+ // HasPackage returns true when pkgPath has a GoScript override package.
30
+ func (f *OverrideFacts) HasPackage(pkgPath string) bool {
31
+ if f == nil || pkgPath == "" {
32
+ return false
33
+ }
34
+ _, ok := f.packages[pkgPath]
35
+ return ok
36
+ }
37
+
38
+ // Metadata returns compiler-visible override metadata for a package path.
39
+ func (f *OverrideFacts) Metadata(pkgPath string) OverrideMetadata {
40
+ if f == nil {
41
+ return newOverrideMetadata()
42
+ }
43
+ pkg := f.packages[pkgPath]
44
+ return cloneOverrideMetadata(pkg.metadata)
45
+ }
46
+
47
+ // IsMethodAsync returns true when override metadata marks a method async.
48
+ func (f *OverrideFacts) IsMethodAsync(pkgPath, method string) bool {
49
+ if f == nil {
50
+ return false
51
+ }
52
+ pkg := f.packages[pkgPath]
53
+ return pkg.metadata.AsyncMethods[method]
54
+ }
55
+
56
+ // IsFunctionAsync returns true when override metadata marks a package-level function async.
57
+ func (f *OverrideFacts) IsFunctionAsync(pkgPath, function string) bool {
58
+ if f == nil {
59
+ return false
60
+ }
61
+ pkg := f.packages[pkgPath]
62
+ return pkg.metadata.AsyncFunctions[function]
63
+ }
64
+
65
+ func (f *OverrideFacts) copyPackage(pkgPath string) (overrideCopyPackage, []string, bool) {
66
+ if f == nil {
67
+ return overrideCopyPackage{}, nil, false
68
+ }
69
+ pkg, ok := f.packages[pkgPath]
70
+ if !ok {
71
+ return overrideCopyPackage{}, nil, false
72
+ }
73
+ return cloneOverrideCopyPackage(pkg.copyPackage), slices.Clone(pkg.dependencies), true
74
+ }
75
+
76
+ func (f *OverrideFacts) importPackageRoot(importPath string) (string, bool) {
77
+ if f == nil {
78
+ return "", false
79
+ }
80
+ importPath = strings.TrimPrefix(importPath, "@goscript/")
81
+ importPath = strings.TrimSuffix(importPath, ".js")
82
+ importPath = strings.TrimSuffix(importPath, ".ts")
83
+ if before, ok := strings.CutSuffix(importPath, "/index"); ok {
84
+ importPath = before
85
+ }
86
+ parts := strings.Split(importPath, "/")
87
+ for idx := len(parts); idx > 0; idx-- {
88
+ candidate := strings.Join(parts[:idx], "/")
89
+ if f.HasPackage(candidate) {
90
+ return candidate, true
91
+ }
92
+ }
93
+ return "", false
94
+ }
95
+
96
+ func buildOverrideFacts(ctx context.Context) (*OverrideFacts, []Diagnostic) {
97
+ roots, err := discoverOverridePackageRoots()
98
+ if err != nil {
99
+ return nil, []Diagnostic{overrideError("discover override packages", "", err)}
100
+ }
101
+ paths := make([]string, 0, len(roots))
102
+ for pkgPath := range roots {
103
+ paths = append(paths, pkgPath)
104
+ }
105
+ slices.Sort(paths)
106
+
107
+ facts := &OverrideFacts{packages: make(map[string]overridePackageFacts, len(paths))}
108
+ var diagnostics []Diagnostic
109
+ for _, pkgPath := range paths {
110
+ if err := ctx.Err(); err != nil {
111
+ return facts, []Diagnostic{contextCanceledDiagnostic(err)}
112
+ }
113
+ metadata, err := loadOverrideMetadata(pkgPath)
114
+ if err != nil {
115
+ diagnostics = append(diagnostics, overrideError("read override metadata", pkgPath, err))
116
+ continue
117
+ }
118
+ copyPackage, dependencies, packageDiagnostics := loadOverrideCopyPackage(pkgPath, roots, metadata)
119
+ diagnostics = append(diagnostics, packageDiagnostics...)
120
+ if diagnosticsHaveErrors(packageDiagnostics) {
121
+ continue
122
+ }
123
+ facts.packages[pkgPath] = overridePackageFacts{
124
+ metadata: cloneOverrideMetadata(metadata),
125
+ copyPackage: copyPackage,
126
+ dependencies: dependencies,
127
+ }
128
+ }
129
+ if diagnosticsHaveErrors(diagnostics) {
130
+ return facts, diagnostics
131
+ }
132
+ return facts, diagnostics
133
+ }
134
+
135
+ func discoverOverridePackageRoots() (map[string]bool, error) {
136
+ roots := make(map[string]bool)
137
+ if err := fs.WalkDir(gs.GsOverrides, "gs", func(filePath string, entry fs.DirEntry, err error) error {
138
+ if err != nil {
139
+ return err
140
+ }
141
+ if entry.IsDir() || path.Base(filePath) != "index.ts" {
142
+ return nil
143
+ }
144
+ pkgPath := strings.TrimPrefix(path.Dir(filePath), "gs/")
145
+ if pkgPath != "." && pkgPath != "" {
146
+ roots[pkgPath] = true
147
+ }
148
+ return nil
149
+ }); err != nil {
150
+ return nil, err
151
+ }
152
+ return roots, nil
153
+ }
154
+
155
+ func loadOverrideMetadata(pkgPath string) (OverrideMetadata, error) {
156
+ metadata := newOverrideMetadata()
157
+ data, err := gs.GsOverrides.ReadFile("gs/" + pkgPath + "/meta.json")
158
+ if err != nil {
159
+ if errors.Is(err, fs.ErrNotExist) {
160
+ return metadata, nil
161
+ }
162
+ return OverrideMetadata{}, err
163
+ }
164
+
165
+ iter := jsoniter.ParseBytes(data)
166
+ for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
167
+ switch field {
168
+ case "dependencies":
169
+ for iter.ReadArray() {
170
+ metadata.Dependencies = append(metadata.Dependencies, iter.ReadString())
171
+ }
172
+ case "asyncMethods":
173
+ for method := iter.ReadObject(); method != ""; method = iter.ReadObject() {
174
+ metadata.AsyncMethods[method] = iter.ReadBool()
175
+ }
176
+ case "asyncFunctions":
177
+ for function := iter.ReadObject(); function != ""; function = iter.ReadObject() {
178
+ metadata.AsyncFunctions[function] = iter.ReadBool()
179
+ }
180
+ default:
181
+ iter.Skip()
182
+ }
183
+ }
184
+ if iter.Error != nil && !errors.Is(iter.Error, io.EOF) {
185
+ return OverrideMetadata{}, iter.Error
186
+ }
187
+ return metadata, nil
188
+ }
189
+
190
+ func loadOverrideCopyPackage(
191
+ pkgPath string,
192
+ roots map[string]bool,
193
+ metadata OverrideMetadata,
194
+ ) (overrideCopyPackage, []string, []Diagnostic) {
195
+ if !roots[pkgPath] {
196
+ return overrideCopyPackage{}, nil, []Diagnostic{{
197
+ Severity: DiagnosticSeverityError,
198
+ Code: "goscript/overrides:missing-package",
199
+ Message: "override package does not exist",
200
+ Detail: pkgPath,
201
+ }}
202
+ }
203
+
204
+ facts := &OverrideFacts{packages: make(map[string]overridePackageFacts, len(roots))}
205
+ for root := range roots {
206
+ facts.packages[root] = overridePackageFacts{}
207
+ }
208
+
209
+ copyPackage := overrideCopyPackage{path: pkgPath}
210
+ dependencySet := make(map[string]bool)
211
+ for _, dependency := range metadata.Dependencies {
212
+ dependency = strings.TrimSpace(dependency)
213
+ if dependency != "" && dependency != pkgPath {
214
+ dependencySet[dependency] = true
215
+ }
216
+ }
217
+
218
+ root := "gs/" + pkgPath
219
+ err := fs.WalkDir(gs.GsOverrides, root, func(filePath string, entry fs.DirEntry, walkErr error) error {
220
+ if walkErr != nil {
221
+ return walkErr
222
+ }
223
+ if entry.IsDir() {
224
+ nestedPkg := strings.TrimPrefix(filePath, "gs/")
225
+ if nestedPkg != pkgPath && roots[nestedPkg] {
226
+ return fs.SkipDir
227
+ }
228
+ return nil
229
+ }
230
+ if !isOverrideSourceFile(filePath) {
231
+ return nil
232
+ }
233
+ data, readErr := gs.GsOverrides.ReadFile(filePath)
234
+ if readErr != nil {
235
+ return readErr
236
+ }
237
+ rel := strings.TrimPrefix(filePath, "gs/")
238
+ copyPackage.files = append(copyPackage.files, overrideCopyFile{
239
+ path: rel,
240
+ data: data,
241
+ })
242
+ for _, imported := range scanOverrideImports(string(data)) {
243
+ dependency, ok := facts.importPackageRoot(imported)
244
+ if ok && dependency != "builtin" && dependency != pkgPath {
245
+ dependencySet[dependency] = true
246
+ }
247
+ }
248
+ return nil
249
+ })
250
+ if err != nil {
251
+ return overrideCopyPackage{}, nil, []Diagnostic{overrideError("read override package", pkgPath, err)}
252
+ }
253
+
254
+ if len(copyPackage.files) == 0 {
255
+ return overrideCopyPackage{}, nil, []Diagnostic{{
256
+ Severity: DiagnosticSeverityError,
257
+ Code: "goscript/overrides:empty-package",
258
+ Message: "override package does not contain TypeScript source files",
259
+ Detail: pkgPath,
260
+ }}
261
+ }
262
+ slices.SortFunc(copyPackage.files, func(a, b overrideCopyFile) int {
263
+ return strings.Compare(a.path, b.path)
264
+ })
265
+
266
+ dependencies := make([]string, 0, len(dependencySet))
267
+ for dependency := range dependencySet {
268
+ dependencies = append(dependencies, dependency)
269
+ }
270
+ slices.Sort(dependencies)
271
+ return copyPackage, dependencies, nil
272
+ }
273
+
274
+ func newOverrideMetadata() OverrideMetadata {
275
+ return OverrideMetadata{
276
+ AsyncFunctions: make(map[string]bool),
277
+ AsyncMethods: make(map[string]bool),
278
+ }
279
+ }
280
+
281
+ func cloneOverrideMetadata(metadata OverrideMetadata) OverrideMetadata {
282
+ return OverrideMetadata{
283
+ Dependencies: slices.Clone(metadata.Dependencies),
284
+ AsyncFunctions: cloneBoolMap(metadata.AsyncFunctions),
285
+ AsyncMethods: cloneBoolMap(metadata.AsyncMethods),
286
+ }
287
+ }
288
+
289
+ func cloneBoolMap(values map[string]bool) map[string]bool {
290
+ cloned := make(map[string]bool, len(values))
291
+ maps.Copy(cloned, values)
292
+ return cloned
293
+ }
294
+
295
+ func cloneOverrideCopyPackage(pkg overrideCopyPackage) overrideCopyPackage {
296
+ cloned := overrideCopyPackage{
297
+ path: pkg.path,
298
+ files: make([]overrideCopyFile, 0, len(pkg.files)),
299
+ }
300
+ for _, file := range pkg.files {
301
+ cloned.files = append(cloned.files, overrideCopyFile{
302
+ path: file.path,
303
+ data: bytes.Clone(file.data),
304
+ })
305
+ }
306
+ return cloned
307
+ }
@@ -0,0 +1,283 @@
1
+ package compiler
2
+
3
+ import (
4
+ "context"
5
+ "os"
6
+ "path/filepath"
7
+ "slices"
8
+ "strings"
9
+ )
10
+
11
+ // OverrideMetadata describes compiler-visible facts from a package override.
12
+ type OverrideMetadata struct {
13
+ // Dependencies are override package dependencies.
14
+ Dependencies []string
15
+ // AsyncFunctions maps package-level function names to async status.
16
+ AsyncFunctions map[string]bool
17
+ // AsyncMethods maps Type.Method keys to async status.
18
+ AsyncMethods map[string]bool
19
+ }
20
+
21
+ // OverrideRegistryOwner owns GoScript override package metadata and copy plans.
22
+ type OverrideRegistryOwner struct {
23
+ facts *OverrideFacts
24
+ }
25
+
26
+ // NewOverrideRegistryOwner creates the override registry owner.
27
+ func NewOverrideRegistryOwner() *OverrideRegistryOwner {
28
+ return &OverrideRegistryOwner{}
29
+ }
30
+
31
+ // Facts returns the immutable compiler-visible override facts.
32
+ func (o *OverrideRegistryOwner) Facts(ctx context.Context) (*OverrideFacts, []Diagnostic) {
33
+ if o == nil {
34
+ o = NewOverrideRegistryOwner()
35
+ }
36
+ if o.facts != nil {
37
+ return o.facts, nil
38
+ }
39
+ facts, diagnostics := buildOverrideFacts(ctx)
40
+ if diagnosticsHaveErrors(diagnostics) {
41
+ return facts, diagnostics
42
+ }
43
+ o.facts = facts
44
+ return facts, diagnostics
45
+ }
46
+
47
+ // Metadata returns compiler-visible override metadata for a package path.
48
+ func (o *OverrideRegistryOwner) Metadata(pkgPath string) (*OverrideMetadata, error) {
49
+ facts, diagnostics := o.Facts(context.Background())
50
+ if diagnosticsHaveErrors(diagnostics) {
51
+ return nil, NewCompileError(diagnostics)
52
+ }
53
+ metadata := facts.Metadata(pkgPath)
54
+ return &metadata, nil
55
+ }
56
+
57
+ // CopyPlan builds the ordered override package copy plan for a request.
58
+ func (o *OverrideRegistryOwner) CopyPlan(
59
+ ctx context.Context,
60
+ req *CompileRequest,
61
+ graph *PackageGraph,
62
+ ) (*overrideCopyPlan, []Diagnostic) {
63
+ if o == nil {
64
+ o = NewOverrideRegistryOwner()
65
+ }
66
+ if err := ctx.Err(); err != nil {
67
+ return nil, []Diagnostic{{
68
+ Severity: DiagnosticSeverityError,
69
+ Code: "goscript/context:canceled",
70
+ Message: err.Error(),
71
+ }}
72
+ }
73
+ plan := &overrideCopyPlan{}
74
+ if req == nil || req.RuntimeEmissionMode == RuntimeEmissionModeReference {
75
+ return plan, nil
76
+ }
77
+ if graph == nil {
78
+ return nil, []Diagnostic{{
79
+ Severity: DiagnosticSeverityError,
80
+ Code: "goscript/overrides:no-graph",
81
+ Message: "override copy planning requires a package graph",
82
+ }}
83
+ }
84
+ facts, diagnostics := o.Facts(ctx)
85
+ if diagnosticsHaveErrors(diagnostics) {
86
+ return nil, diagnostics
87
+ }
88
+
89
+ visiting := make(map[string]bool)
90
+ visited := make(map[string]bool)
91
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, "builtin", visiting, visited)...)
92
+ for _, node := range graph.Nodes {
93
+ if node.OverrideCandidate {
94
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, node.PkgPath, visiting, visited)...)
95
+ }
96
+ }
97
+ if diagnosticsHaveErrors(diagnostics) {
98
+ return nil, diagnostics
99
+ }
100
+ return plan, diagnostics
101
+ }
102
+
103
+ // CopyPackages writes override packages from a copy plan to the request output tree.
104
+ func (o *OverrideRegistryOwner) CopyPackages(
105
+ ctx context.Context,
106
+ req *CompileRequest,
107
+ plan *overrideCopyPlan,
108
+ ) ([]string, []Diagnostic) {
109
+ if err := ctx.Err(); err != nil {
110
+ return nil, []Diagnostic{{
111
+ Severity: DiagnosticSeverityError,
112
+ Code: "goscript/context:canceled",
113
+ Message: err.Error(),
114
+ }}
115
+ }
116
+ if req == nil {
117
+ return nil, []Diagnostic{{
118
+ Severity: DiagnosticSeverityError,
119
+ Code: "goscript/overrides:no-request",
120
+ Message: "override package copying requires a compile request",
121
+ }}
122
+ }
123
+ if plan == nil || len(plan.packages) == 0 {
124
+ return nil, nil
125
+ }
126
+
127
+ var copied []string
128
+ var diagnostics []Diagnostic
129
+ for _, pkg := range plan.packages {
130
+ if err := ctx.Err(); err != nil {
131
+ diagnostics = append(diagnostics, Diagnostic{
132
+ Severity: DiagnosticSeverityError,
133
+ Code: "goscript/context:canceled",
134
+ Message: err.Error(),
135
+ })
136
+ break
137
+ }
138
+ for _, file := range pkg.files {
139
+ dest := filepath.Join(req.OutputPath, "@goscript", filepath.FromSlash(file.path))
140
+ if err := os.MkdirAll(filepath.Dir(dest), 0o755); err != nil {
141
+ diagnostics = append(diagnostics, overrideError("create override output", file.path, err))
142
+ continue
143
+ }
144
+ if err := os.WriteFile(dest, file.data, 0o644); err != nil {
145
+ diagnostics = append(diagnostics, overrideError("write override file", file.path, err))
146
+ }
147
+ }
148
+ copied = append(copied, pkg.path)
149
+ }
150
+ if diagnosticsHaveErrors(diagnostics) {
151
+ return copied, diagnostics
152
+ }
153
+ return copied, diagnostics
154
+ }
155
+
156
+ // IsMethodAsync returns true when override metadata marks a method async.
157
+ func (o *OverrideRegistryOwner) IsMethodAsync(pkgPath, method string) (bool, error) {
158
+ facts, diagnostics := o.Facts(context.Background())
159
+ if diagnosticsHaveErrors(diagnostics) {
160
+ return false, NewCompileError(diagnostics)
161
+ }
162
+ return facts.IsMethodAsync(pkgPath, method), nil
163
+ }
164
+
165
+ // IsFunctionAsync returns true when override metadata marks a package-level function async.
166
+ func (o *OverrideRegistryOwner) IsFunctionAsync(pkgPath, function string) (bool, error) {
167
+ facts, diagnostics := o.Facts(context.Background())
168
+ if diagnosticsHaveErrors(diagnostics) {
169
+ return false, NewCompileError(diagnostics)
170
+ }
171
+ return facts.IsFunctionAsync(pkgPath, function), nil
172
+ }
173
+
174
+ type overrideCopyPlan struct {
175
+ packages []overrideCopyPackage
176
+ }
177
+
178
+ type overrideCopyPackage struct {
179
+ path string
180
+ files []overrideCopyFile
181
+ }
182
+
183
+ type overrideCopyFile struct {
184
+ path string
185
+ data []byte
186
+ }
187
+
188
+ func (o *OverrideRegistryOwner) addPackageToPlan(
189
+ ctx context.Context,
190
+ facts *OverrideFacts,
191
+ plan *overrideCopyPlan,
192
+ pkgPath string,
193
+ visiting map[string]bool,
194
+ visited map[string]bool,
195
+ ) []Diagnostic {
196
+ if err := ctx.Err(); err != nil {
197
+ return []Diagnostic{{
198
+ Severity: DiagnosticSeverityError,
199
+ Code: "goscript/context:canceled",
200
+ Message: err.Error(),
201
+ }}
202
+ }
203
+ if visited[pkgPath] {
204
+ return nil
205
+ }
206
+ if visiting[pkgPath] {
207
+ return []Diagnostic{{
208
+ Severity: DiagnosticSeverityError,
209
+ Code: "goscript/overrides:dependency-cycle",
210
+ Message: "override package dependencies contain a cycle",
211
+ Detail: pkgPath,
212
+ }}
213
+ }
214
+
215
+ pkg, dependencies, ok := facts.copyPackage(pkgPath)
216
+ if !ok {
217
+ return []Diagnostic{{
218
+ Severity: DiagnosticSeverityError,
219
+ Code: "goscript/overrides:missing-package",
220
+ Message: "override package does not exist",
221
+ Detail: pkgPath,
222
+ }}
223
+ }
224
+ visiting[pkgPath] = true
225
+ var diagnostics []Diagnostic
226
+ for _, dependency := range dependencies {
227
+ diagnostics = append(diagnostics, o.addPackageToPlan(ctx, facts, plan, dependency, visiting, visited)...)
228
+ }
229
+ delete(visiting, pkgPath)
230
+ if diagnosticsHaveErrors(diagnostics) {
231
+ return diagnostics
232
+ }
233
+
234
+ visited[pkgPath] = true
235
+ plan.packages = append(plan.packages, pkg)
236
+ return diagnostics
237
+ }
238
+
239
+ func isOverrideSourceFile(filePath string) bool {
240
+ return strings.HasSuffix(filePath, ".ts") && !strings.HasSuffix(filePath, ".test.ts")
241
+ }
242
+
243
+ func scanOverrideImports(data string) []string {
244
+ imports := make(map[string]bool)
245
+ for line := range strings.SplitSeq(data, "\n") {
246
+ line = strings.TrimSpace(line)
247
+ if strings.HasPrefix(line, "//") {
248
+ continue
249
+ }
250
+ for _, quote := range []string{"\"", "'"} {
251
+ prefix := quote + "@goscript/"
252
+ remaining := line
253
+ for {
254
+ idx := strings.Index(remaining, prefix)
255
+ if idx < 0 {
256
+ break
257
+ }
258
+ remaining = remaining[idx+len(quote):]
259
+ end := strings.Index(remaining, quote)
260
+ if end < 0 {
261
+ break
262
+ }
263
+ imports[remaining[:end]] = true
264
+ remaining = remaining[end+len(quote):]
265
+ }
266
+ }
267
+ }
268
+ result := make([]string, 0, len(imports))
269
+ for imported := range imports {
270
+ result = append(result, imported)
271
+ }
272
+ slices.Sort(result)
273
+ return result
274
+ }
275
+
276
+ func overrideError(action, detail string, err error) Diagnostic {
277
+ return Diagnostic{
278
+ Severity: DiagnosticSeverityError,
279
+ Code: "goscript/overrides:io",
280
+ Message: "failed to " + action,
281
+ Detail: strings.TrimSpace(detail + " " + err.Error()),
282
+ }
283
+ }