goscript 0.1.3 → 0.2.0

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 (330) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -2,6 +2,7 @@ import * as $ from "@goscript/builtin/index.js";
2
2
  import { ErrClosed, ErrInvalid, ErrUnimplemented } from "./error.gs.js";
3
3
 
4
4
  import * as fs from "@goscript/io/fs/index.js"
5
+ import { FileInfoToDirEntry } from "@goscript/io/fs/readdir.js"
5
6
  import * as io from "@goscript/io/index.js"
6
7
  import * as time from "@goscript/time/index.js"
7
8
  import * as syscall from "@goscript/syscall/index.js"
@@ -219,6 +220,70 @@ export function createFileInfo(name: string, stat: HostStatLike): fs.FileInfo {
219
220
  })
220
221
  }
221
222
 
223
+ function joinFilePath(dir: string, name: string): string {
224
+ if (dir === "" || dir === ".") {
225
+ return name
226
+ }
227
+ return dir.replace(/\/+$/, "") + "/" + name
228
+ }
229
+
230
+ function readDirectoryInfos(name: string): [fs.FileInfo[] | null, $.GoError] {
231
+ const denoObj = getDeno()
232
+ if (denoObj?.readDirSync) {
233
+ try {
234
+ const infos: fs.FileInfo[] = []
235
+ for (const entry of denoObj.readDirSync(name)) {
236
+ infos.push(createFileInfo(entry.name, {
237
+ isDirectory: () => entry.isDirectory,
238
+ isSymbolicLink: () => entry.isSymlink,
239
+ mode: 0,
240
+ size: 0,
241
+ }))
242
+ }
243
+ return [infos, null]
244
+ } catch (err) {
245
+ return [null, newHostError(err)]
246
+ }
247
+ }
248
+ const nodeFS = getNodeFS()
249
+ if (nodeFS?.readdirSync) {
250
+ try {
251
+ const infos = nodeFS.readdirSync(name, { withFileTypes: true }).map((entry: any) => {
252
+ const childName = String(entry.name)
253
+ const childPath = joinFilePath(name, childName)
254
+ if (nodeFS.lstatSync) {
255
+ try {
256
+ return createFileInfo(childName, nodeFS.lstatSync(childPath))
257
+ } catch {
258
+ // Fall back to Dirent metadata when the child cannot be statted.
259
+ }
260
+ }
261
+ return createFileInfo(childName, {
262
+ isDirectory: () => typeof entry.isDirectory === "function" ? entry.isDirectory() : false,
263
+ isSymbolicLink: () => typeof entry.isSymbolicLink === "function" ? entry.isSymbolicLink() : false,
264
+ mode: 0,
265
+ size: 0,
266
+ })
267
+ })
268
+ return [infos, null]
269
+ } catch (err) {
270
+ return [null, newHostError(err)]
271
+ }
272
+ }
273
+ return [null, ErrUnimplemented]
274
+ }
275
+
276
+ function consumeDirectoryEntries<T>(entries: T[], offset: number, n: number): [$.Slice<T>, number, $.GoError] {
277
+ if (n <= 0) {
278
+ return [$.arrayToSlice(entries.slice(offset)), entries.length, null]
279
+ }
280
+ if (offset >= entries.length) {
281
+ return [null, offset, io.EOF]
282
+ }
283
+ const next = Math.min(entries.length, offset + n)
284
+ return [$.arrayToSlice(entries.slice(offset, next)), next, null]
285
+ }
286
+
222
287
  export function createHostFile(name: string, fd: number = -1, handle: DenoFileLike | null = null): File {
223
288
  return new File({
224
289
  fd,
@@ -260,6 +325,10 @@ export class File {
260
325
  public name: string
261
326
  public closed: boolean
262
327
  public fd: number
328
+ public dirEntryOffset: number
329
+ public dirInfoOffset: number
330
+ public cachedDirEntries: fs.DirEntry[] | null
331
+ public cachedDirInfos: fs.FileInfo[] | null
263
332
 
264
333
  public _fields: {
265
334
  file: $.VarRef<file | null>;
@@ -269,6 +338,10 @@ export class File {
269
338
  this.name = init?.name ?? ""
270
339
  this.closed = init?.closed ?? false
271
340
  this.fd = init?.fd ?? -1
341
+ this.dirEntryOffset = 0
342
+ this.dirInfoOffset = 0
343
+ this.cachedDirEntries = null
344
+ this.cachedDirInfos = null
272
345
  this._fields = {
273
346
  file: $.varRef(init?.file ?? null)
274
347
  }
@@ -284,19 +357,58 @@ export class File {
284
357
  }
285
358
 
286
359
  public Readdir(n: number): [$.Slice<fs.FileInfo>, $.GoError] {
287
- return [null, ErrUnimplemented]
360
+ if (this.closed) {
361
+ return [null, ErrClosed]
362
+ }
363
+ if (this.cachedDirInfos === null) {
364
+ const [infos, err] = readDirectoryInfos(this.name)
365
+ if (err !== null) {
366
+ return [null, err]
367
+ }
368
+ this.cachedDirInfos = infos ?? []
369
+ this.dirInfoOffset = 0
370
+ }
371
+ const [out, next, err] = consumeDirectoryEntries(this.cachedDirInfos, this.dirInfoOffset, n)
372
+ this.dirInfoOffset = next
373
+ return [out, err]
288
374
  }
289
375
 
290
376
  public Readdirnames(n: number): [$.Slice<string>, $.GoError] {
291
- return [null, ErrUnimplemented]
377
+ const [infos, err] = this.Readdir(n)
378
+ if (err !== null) {
379
+ return [null, err]
380
+ }
381
+ return [$.arrayToSlice((infos ?? []).map((info) => info!.Name())), null]
292
382
  }
293
383
 
294
384
  public ReadDir(n: number): [$.Slice<fs.DirEntry>, $.GoError] {
295
- return [null, ErrUnimplemented]
385
+ if (this.closed) {
386
+ return [null, ErrClosed]
387
+ }
388
+ if (this.cachedDirEntries === null) {
389
+ const [infos, err] = readDirectoryInfos(this.name)
390
+ if (err !== null) {
391
+ return [null, err]
392
+ }
393
+ this.cachedDirEntries = (infos ?? []).map((info) => FileInfoToDirEntry(info)).filter((entry): entry is fs.DirEntry => entry !== null)
394
+ this.dirEntryOffset = 0
395
+ }
396
+ const [out, next, err] = consumeDirectoryEntries(this.cachedDirEntries, this.dirEntryOffset, n)
397
+ this.dirEntryOffset = next
398
+ return [out, err]
296
399
  }
297
400
 
298
401
  public readdir(n: number, mode: readdirMode): [$.Slice<string>, $.Slice<fs.DirEntry>, $.Slice<fs.FileInfo>, $.GoError] {
299
- return [null, null, null, ErrUnimplemented]
402
+ if (mode === readdirName) {
403
+ const [names, err] = this.Readdirnames(n)
404
+ return [names, null, null, err]
405
+ }
406
+ if (mode === readdirDirEntry) {
407
+ const [entries, err] = this.ReadDir(n)
408
+ return [null, entries, null, err]
409
+ }
410
+ const [infos, err] = this.Readdir(n)
411
+ return [null, null, infos, err]
300
412
  }
301
413
 
302
414
  public Name(): string {
@@ -366,11 +478,34 @@ export class File {
366
478
  return [0, ErrUnimplemented]
367
479
  }
368
480
 
369
- public ReadFrom(r: io.Reader): [number, $.GoError] {
481
+ public async ReadFrom(r: io.Reader): Promise<[number, $.GoError]> {
370
482
  if (this.closed) {
371
483
  return [0, ErrClosed]
372
484
  }
373
- return io.Copy(this, r) as any
485
+ const buf = $.makeSlice<number>(32 * 1024, undefined, "byte")
486
+ let written = 0
487
+ while (true) {
488
+ const [nr, er] = await (r.Read(buf) as any)
489
+ if (nr > 0) {
490
+ const [nw, ew] = this.Write($.goSlice(buf, 0, nr))
491
+ if (nw < 0 || nr < nw) {
492
+ return [written, ew ?? io.ErrShortWrite]
493
+ }
494
+ written += nw
495
+ if (ew !== null) {
496
+ return [written, ew]
497
+ }
498
+ if (nr !== nw) {
499
+ return [written, io.ErrShortWrite]
500
+ }
501
+ }
502
+ if (er !== null) {
503
+ if (er === io.EOF) {
504
+ return [written, null]
505
+ }
506
+ return [written, er]
507
+ }
508
+ }
374
509
  }
375
510
 
376
511
  public Write(b: $.Bytes): [number, $.GoError] {
@@ -424,11 +559,34 @@ export class File {
424
559
  return [0, ErrUnimplemented]
425
560
  }
426
561
 
427
- public WriteTo(w: io.Writer): [number, $.GoError] {
562
+ public async WriteTo(w: io.Writer): Promise<[number, $.GoError]> {
428
563
  if (this.closed) {
429
564
  return [0, ErrClosed]
430
565
  }
431
- return io.Copy(w, this) as any
566
+ const buf = $.makeSlice<number>(32 * 1024, undefined, "byte")
567
+ let written = 0
568
+ while (true) {
569
+ const [nr, er] = this.Read(buf)
570
+ if (nr > 0) {
571
+ const [nw, ew] = await (w.Write($.goSlice(buf, 0, nr)) as any)
572
+ if (nw < 0 || nr < nw) {
573
+ return [written, ew ?? io.ErrShortWrite]
574
+ }
575
+ written += nw
576
+ if (ew !== null) {
577
+ return [written, ew]
578
+ }
579
+ if (nr !== nw) {
580
+ return [written, io.ErrShortWrite]
581
+ }
582
+ }
583
+ if (er !== null) {
584
+ if (er === io.EOF) {
585
+ return [written, null]
586
+ }
587
+ return [written, er]
588
+ }
589
+ }
432
590
  }
433
591
 
434
592
  public Seek(offset: number, whence: number): [number, $.GoError] {
@@ -665,7 +823,7 @@ export class File {
665
823
  { name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
666
824
  ],
667
825
  File,
668
- { "file": { kind: $.TypeKind.Pointer, elemType: "file" }, "name": { kind: $.TypeKind.Basic, name: "string" }, "closed": { kind: $.TypeKind.Basic, name: "boolean" }, "fd": { kind: $.TypeKind.Basic, name: "number" } }
826
+ [{ name: "file", key: "file", type: { kind: $.TypeKind.Pointer, elemType: "file" } }, { name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "closed", key: "closed", type: { kind: $.TypeKind.Basic, name: "boolean" } }, { name: "fd", key: "fd", type: { kind: $.TypeKind.Basic, name: "number" } }]
669
827
  );
670
828
  }
671
829
 
@@ -681,6 +839,9 @@ class file {
681
839
 
682
840
  // readdirMode mirrors the Go runtime helper enum.
683
841
  type readdirMode = number
842
+ const readdirName: readdirMode = 0
843
+ const readdirDirEntry: readdirMode = 1
844
+ const readdirFileInfo: readdirMode = 2
684
845
 
685
846
  // File mode constants
686
847
  export let ModeDir: fs.FileMode = fs.ModeDir
@@ -108,7 +108,7 @@ class fileStat {
108
108
  new fileStat(),
109
109
  [{ name: "Name", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "string" } }] }, { name: "IsDir", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "boolean" } }] }, { name: "Size", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }] }, { name: "Mode", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }] }, { name: "ModTime", args: [], returns: [{ type: "Time" }] }, { name: "Sys", args: [], returns: [{ type: { kind: $.TypeKind.Interface, methods: [] } }] }],
110
110
  fileStat,
111
- {"name": { kind: $.TypeKind.Basic, name: "string" }, "size": { kind: $.TypeKind.Basic, name: "number" }, "mode": { kind: $.TypeKind.Basic, name: "number" }, "modTime": "Time", "sys": "Stat_t"}
111
+ [{ name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "size", key: "size", type: { kind: $.TypeKind.Basic, name: "number" } }, { name: "mode", key: "mode", type: { kind: $.TypeKind.Basic, name: "number" } }, { name: "modTime", key: "modTime", type: "Time" }, { name: "sys", key: "sys", type: "Stat_t" }]
112
112
  );
113
113
  }
114
114
 
package/gs/path/path.ts CHANGED
@@ -112,14 +112,18 @@ class lazybuf {
112
112
  },
113
113
  ],
114
114
  lazybuf,
115
- {
116
- s: { kind: $.TypeKind.Basic, name: 'string' },
117
- buf: {
118
- kind: $.TypeKind.Slice,
119
- elemType: { kind: $.TypeKind.Basic, name: 'number' },
115
+ [
116
+ { name: 's', key: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
117
+ {
118
+ name: 'buf',
119
+ key: 'buf',
120
+ type: {
121
+ kind: $.TypeKind.Slice,
122
+ elemType: { kind: $.TypeKind.Basic, name: 'number' },
123
+ },
120
124
  },
121
- w: { kind: $.TypeKind.Basic, name: 'number' },
122
- },
125
+ { name: 'w', key: 'w', type: { kind: $.TypeKind.Basic, name: 'number' } },
126
+ ],
123
127
  )
124
128
  }
125
129
 
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { DeepEqual } from './deepequal.js'
3
- import { Value, BasicType, Int, String as StringType } from './type.js'
3
+ import { Value, BasicType, Int, String as StringType, Uint32 } from './type.js'
4
4
 
5
5
  describe('DeepEqual', () => {
6
6
  it('should compare primitive values correctly', () => {
@@ -38,4 +38,13 @@ describe('DeepEqual', () => {
38
38
  expect(DeepEqual(v1, v2)).toBe(true)
39
39
  expect(DeepEqual(v1, v3)).toBe(false)
40
40
  })
41
+
42
+ it('reads numeric boxed values with basic numeric kinds', () => {
43
+ const v = new Value(
44
+ { sentinel: true, valueOf: () => 7 } as any,
45
+ new BasicType(Uint32, 'uint32'),
46
+ )
47
+
48
+ expect(v.Uint()).toBe(7)
49
+ })
41
50
  })
@@ -4,6 +4,7 @@ import {
4
4
  TypeKind,
5
5
  arrayToSlice,
6
6
  asArray,
7
+ isOwnedPointerHandle,
7
8
  registerStructType,
8
9
  } from '../builtin/index.js'
9
10
  import { NewAt, TypeOf, ValueOf } from './index.js'
@@ -16,34 +17,48 @@ class Person {
16
17
  return this.Name
17
18
  }
18
19
  }
19
- ;(Person as any).__typeInfo = { name: 'main.Person' }
20
20
 
21
21
  describe('reflect struct field access', () => {
22
- it('finds struct fields by name and index', () => {
23
- registerStructType(
22
+ it('finds struct fields by name and index', async () => {
23
+ ;(Person as any).__typeInfo = registerStructType(
24
24
  'main.Person',
25
25
  new Person(),
26
- [{ name: 'String', args: [], returns: [] }],
26
+ [
27
+ {
28
+ name: 'String',
29
+ args: [],
30
+ returns: [{ type: { kind: TypeKind.Basic, name: 'string' } }],
31
+ },
32
+ ],
27
33
  Person,
28
- {
29
- Name: 'string',
30
- Count: { kind: TypeKind.Basic, name: 'int' },
31
- },
34
+ [
35
+ { name: 'FullName', key: 'Name', type: 'string' },
36
+ {
37
+ name: 'Count',
38
+ key: 'Count',
39
+ type: { kind: TypeKind.Basic, name: 'int' },
40
+ },
41
+ ],
32
42
  )
33
43
 
34
44
  const person = new Person()
35
45
  const typ = TypeOf(person)
36
- const [field, ok] = typ.FieldByName('Name')
46
+ const [field, ok] = typ.FieldByName('FullName')
37
47
 
38
48
  expect(ok).toBe(true)
39
- expect(field.Name).toBe('Name')
49
+ expect(field.Name).toBe('FullName')
40
50
  expect(field.Index).toEqual([0])
41
51
  expect(typ.FieldByNameFunc((name) => name === 'Count')[0].Name).toBe(
42
52
  'Count',
43
53
  )
44
54
  expect(typ.AssignableTo(typ)).toBe(true)
45
- expect(typ.MethodByName('String')[1]).toBe(true)
46
- expect(ValueOf(person).FieldByName('Name').String()).toBe('Ada')
55
+ const [method, methodOK] = typ.MethodByName('String')
56
+ expect(methodOK).toBe(true)
57
+ expect(method.Type.NumIn()).toBe(1)
58
+ expect(method.Type.In(0).String()).toBe('main.Person')
59
+ expect(method.Type.NumOut()).toBe(1)
60
+ expect(method.Type.Out(0).String()).toBe('string')
61
+ expect(ValueOf(person).FieldByName('FullName').String()).toBe('Ada')
47
62
  expect(
48
63
  ValueOf(person)
49
64
  .FieldByIndex(arrayToSlice([1]))
@@ -53,10 +68,17 @@ describe('reflect struct field access', () => {
53
68
 
54
69
  const stringMethod = ValueOf(person).MethodByName('String')
55
70
  expect(stringMethod.IsValid()).toBe(true)
56
- expect(asArray(stringMethod.Call(arrayToSlice([])))[0].String()).toBe('Ada')
71
+ expect(stringMethod.Type().NumIn()).toBe(0)
72
+ expect(stringMethod.Type().NumOut()).toBe(1)
73
+ expect(stringMethod.Type().Out(0).String()).toBe('string')
74
+ expect(asArray(await stringMethod.Call(arrayToSlice([])))[0].String()).toBe(
75
+ 'Ada',
76
+ )
57
77
 
58
- const nameField = ValueOf(person).FieldByName('Name')
59
- const namePtr = NewAt(nameField.Type(), nameField.UnsafeAddr() as any)
78
+ const nameField = ValueOf(person).FieldByName('FullName')
79
+ const nameAddress = nameField.UnsafeAddr()
80
+ expect(isOwnedPointerHandle(nameAddress)).toBe(true)
81
+ const namePtr = NewAt(nameField.Type(), nameAddress as any)
60
82
  namePtr.Elem().SetString('Grace')
61
83
  expect(person.Name).toBe('Grace')
62
84
  })