goscript 0.0.82 → 0.0.84

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 (85) hide show
  1. package/dist/gs/builtin/builtin.js +4 -7
  2. package/dist/gs/builtin/builtin.js.map +1 -1
  3. package/dist/gs/builtin/hostio.d.ts +72 -0
  4. package/dist/gs/builtin/hostio.js +181 -0
  5. package/dist/gs/builtin/hostio.js.map +1 -0
  6. package/dist/gs/builtin/print.d.ts +8 -0
  7. package/dist/gs/builtin/print.js +111 -0
  8. package/dist/gs/builtin/print.js.map +1 -0
  9. package/dist/gs/fmt/fmt.js +2 -22
  10. package/dist/gs/fmt/fmt.js.map +1 -1
  11. package/dist/gs/os/dir.gs.js +41 -27
  12. package/dist/gs/os/dir.gs.js.map +1 -1
  13. package/dist/gs/os/exec.gs.js +1 -2
  14. package/dist/gs/os/exec.gs.js.map +1 -1
  15. package/dist/gs/os/exec_posix.gs.js +1 -1
  16. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  17. package/dist/gs/os/file_constants_js.gs.js +71 -7
  18. package/dist/gs/os/file_constants_js.gs.js.map +1 -1
  19. package/dist/gs/os/file_js.gs.js +168 -24
  20. package/dist/gs/os/file_js.gs.js.map +1 -1
  21. package/dist/gs/os/file_posix_js.gs.js +75 -11
  22. package/dist/gs/os/file_posix_js.gs.js.map +1 -1
  23. package/dist/gs/os/file_unix_js.gs.d.ts +3 -3
  24. package/dist/gs/os/file_unix_js.gs.js +218 -21
  25. package/dist/gs/os/file_unix_js.gs.js.map +1 -1
  26. package/dist/gs/os/getwd_js.gs.js +19 -6
  27. package/dist/gs/os/getwd_js.gs.js.map +1 -1
  28. package/dist/gs/os/path.gs.js +3 -3
  29. package/dist/gs/os/path.gs.js.map +1 -1
  30. package/dist/gs/os/pidfd_js.gs.js +0 -3
  31. package/dist/gs/os/pidfd_js.gs.js.map +1 -1
  32. package/dist/gs/os/proc.gs.js +6 -3
  33. package/dist/gs/os/proc.gs.js.map +1 -1
  34. package/dist/gs/os/proc_js.gs.js +10 -5
  35. package/dist/gs/os/proc_js.gs.js.map +1 -1
  36. package/dist/gs/os/rawconn_js.gs.d.ts +6 -3
  37. package/dist/gs/os/rawconn_js.gs.js +16 -10
  38. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  39. package/dist/gs/os/removeall_js.gs.js +2 -4
  40. package/dist/gs/os/removeall_js.gs.js.map +1 -1
  41. package/dist/gs/os/root_js.gs.d.ts +4 -1
  42. package/dist/gs/os/root_js.gs.js +90 -40
  43. package/dist/gs/os/root_js.gs.js.map +1 -1
  44. package/dist/gs/os/root_noopenat.gs.js +13 -16
  45. package/dist/gs/os/root_noopenat.gs.js.map +1 -1
  46. package/dist/gs/os/stat_js.gs.js +40 -4
  47. package/dist/gs/os/stat_js.gs.js.map +1 -1
  48. package/dist/gs/os/stat_unix_js.gs.d.ts +1 -1
  49. package/dist/gs/os/stat_unix_js.gs.js +5 -10
  50. package/dist/gs/os/stat_unix_js.gs.js.map +1 -1
  51. package/dist/gs/os/tempfile.gs.d.ts +1 -1
  52. package/dist/gs/os/tempfile.gs.js +24 -7
  53. package/dist/gs/os/tempfile.gs.js.map +1 -1
  54. package/dist/gs/os/types_js.gs.d.ts +30 -2
  55. package/dist/gs/os/types_js.gs.js +426 -23
  56. package/dist/gs/os/types_js.gs.js.map +1 -1
  57. package/gs/builtin/builtin.ts +4 -6
  58. package/gs/builtin/hostio.test.ts +69 -0
  59. package/gs/builtin/hostio.ts +298 -0
  60. package/gs/builtin/print.test.ts +48 -0
  61. package/gs/builtin/print.ts +154 -0
  62. package/gs/fmt/fmt.test.ts +41 -30
  63. package/gs/fmt/fmt.ts +2 -22
  64. package/gs/os/dir.gs.ts +40 -28
  65. package/gs/os/exec.gs.ts +2 -4
  66. package/gs/os/exec_posix.gs.ts +1 -2
  67. package/gs/os/file_constants_js.gs.ts +70 -8
  68. package/gs/os/file_js.gs.ts +156 -26
  69. package/gs/os/file_posix_js.gs.ts +69 -13
  70. package/gs/os/file_unix_js.gs.ts +212 -24
  71. package/gs/os/file_unix_js.test.ts +184 -0
  72. package/gs/os/getwd_js.gs.ts +18 -8
  73. package/gs/os/path.gs.ts +3 -4
  74. package/gs/os/pidfd_js.gs.ts +3 -8
  75. package/gs/os/proc.gs.ts +6 -4
  76. package/gs/os/proc_js.gs.ts +11 -8
  77. package/gs/os/rawconn_js.gs.ts +22 -14
  78. package/gs/os/removeall_js.gs.ts +3 -6
  79. package/gs/os/root_js.gs.ts +94 -42
  80. package/gs/os/root_noopenat.gs.ts +13 -20
  81. package/gs/os/stat_js.gs.ts +37 -6
  82. package/gs/os/stat_unix_js.gs.ts +6 -13
  83. package/gs/os/tempfile.gs.ts +27 -9
  84. package/gs/os/types_js.gs.ts +449 -26
  85. package/package.json +1 -1
@@ -1,10 +1,203 @@
1
1
  import * as $ from "@goscript/builtin/index.js";
2
- import { ErrUnimplemented } from "./error.gs.js";
2
+ import { ErrClosed, ErrInvalid, ErrUnimplemented } from "./error.gs.js";
3
3
 
4
4
  import * as fs from "@goscript/io/fs/index.js"
5
5
  import * as io from "@goscript/io/index.js"
6
6
  import * as time from "@goscript/time/index.js"
7
7
  import * as syscall from "@goscript/syscall/index.js"
8
+ import {
9
+ DenoFileLike,
10
+ DenoStream,
11
+ HostUnsupportedError,
12
+ hostRuntime,
13
+ NodeFSModule,
14
+ resetHostRuntimeForTests,
15
+ } from "@goscript/builtin/hostio.js"
16
+ import { newRawConn } from "./rawconn_js.gs.js"
17
+
18
+ export type HostStatLike = {
19
+ isDirectory(): boolean
20
+ isSymbolicLink?(): boolean
21
+ mode?: number
22
+ mtime?: Date | null
23
+ mtimeMs?: number
24
+ size?: number
25
+ }
26
+
27
+ export function newHostError(err: unknown): $.GoError {
28
+ const message =
29
+ err instanceof Error ? err.message
30
+ : typeof err === "string" ? err
31
+ : String(err)
32
+ return { Error: () => message }
33
+ }
34
+
35
+ export function getNodeFS(): NodeFSModule | null {
36
+ return hostRuntime.nodeFS
37
+ }
38
+
39
+ export function getDeno(): any | null {
40
+ return hostRuntime.deno
41
+ }
42
+
43
+ export function getPlatform(): string {
44
+ return hostRuntime.platform
45
+ }
46
+
47
+ export function getEnv(name: string): string {
48
+ return hostRuntime.getEnv(name)
49
+ }
50
+
51
+ export function getDenoStream(fd: number): DenoStream | null {
52
+ return hostRuntime.getStdioHandle(fd)
53
+ }
54
+
55
+ function readFD(fd: number, b: Uint8Array): [number, $.GoError] {
56
+ if (b.length === 0) {
57
+ return [0, null]
58
+ }
59
+
60
+ try {
61
+ const n = hostRuntime.readFD(fd, b)
62
+ if (n === null || n === 0) {
63
+ return [0, io.EOF]
64
+ }
65
+ return [n, null]
66
+ } catch (err) {
67
+ if (err instanceof HostUnsupportedError) {
68
+ return [0, ErrUnimplemented]
69
+ }
70
+ return [0, newHostError(err)]
71
+ }
72
+ }
73
+
74
+ function writeFD(fd: number, b: Uint8Array): [number, $.GoError] {
75
+ if (b.length === 0) {
76
+ return [0, null]
77
+ }
78
+
79
+ try {
80
+ return [hostRuntime.writeFD(fd, b), null]
81
+ } catch (err) {
82
+ if (err instanceof HostUnsupportedError) {
83
+ return [0, ErrUnimplemented]
84
+ }
85
+ return [0, newHostError(err)]
86
+ }
87
+ }
88
+
89
+ function readHandle(handle: DenoFileLike, b: Uint8Array): [number, $.GoError] {
90
+ if (typeof handle.readSync !== "function") {
91
+ return [0, ErrUnimplemented]
92
+ }
93
+ try {
94
+ const n = handle.readSync(b)
95
+ if (n === null || n === 0) {
96
+ return [0, io.EOF]
97
+ }
98
+ return [n, null]
99
+ } catch (err) {
100
+ return [0, newHostError(err)]
101
+ }
102
+ }
103
+
104
+ function writeHandle(handle: DenoFileLike, b: Uint8Array): [number, $.GoError] {
105
+ if (typeof handle.writeSync !== "function") {
106
+ return [0, ErrUnimplemented]
107
+ }
108
+ try {
109
+ let offset = 0
110
+ while (offset < b.length) {
111
+ const n = handle.writeSync(b.subarray(offset))
112
+ if (!Number.isFinite(n) || n < 0) {
113
+ throw new Error(`invalid write result: ${n}`)
114
+ }
115
+ if (n === 0) {
116
+ throw new Error("short write")
117
+ }
118
+ offset += n
119
+ }
120
+ return [b.length, null]
121
+ } catch (err) {
122
+ return [0, newHostError(err)]
123
+ }
124
+ }
125
+
126
+ class hostFileInfo {
127
+ public name: string
128
+ public modTime: time.Time
129
+ public mode: fs.FileMode
130
+ public size: number
131
+ public sys: HostStatLike | null
132
+
133
+ constructor(init?: Partial<{modTime?: time.Time, mode?: fs.FileMode, name?: string, size?: number, sys?: HostStatLike | null}>) {
134
+ this.name = init?.name ?? ""
135
+ this.modTime = init?.modTime ?? time.Unix(0, 0)
136
+ this.mode = init?.mode ?? 0
137
+ this.size = init?.size ?? 0
138
+ this.sys = init?.sys ?? null
139
+ }
140
+
141
+ public IsDir(): boolean {
142
+ return fs.FileMode_IsDir(this.mode)
143
+ }
144
+
145
+ public ModTime(): time.Time {
146
+ return this.modTime
147
+ }
148
+
149
+ public Mode(): fs.FileMode {
150
+ return this.mode
151
+ }
152
+
153
+ public Name(): string {
154
+ return this.name
155
+ }
156
+
157
+ public Size(): number {
158
+ return this.size
159
+ }
160
+
161
+ public Sys(): HostStatLike | null {
162
+ return this.sys
163
+ }
164
+ }
165
+
166
+ export function createFileInfo(name: string, stat: HostStatLike): fs.FileInfo {
167
+ const normalizedName = name.replace(/\\/g, "/").split("/").filter((part) => part !== "").slice(-1)[0] ?? name
168
+ let mode = (stat.mode ?? 0) & fs.ModePerm
169
+ if (stat.isDirectory()) {
170
+ mode |= fs.ModeDir
171
+ }
172
+ if (stat.isSymbolicLink?.()) {
173
+ mode |= fs.ModeSymlink
174
+ }
175
+
176
+ let mtimeMs = 0
177
+ if (typeof stat.mtimeMs === "number") {
178
+ mtimeMs = stat.mtimeMs
179
+ } else if (stat.mtime instanceof Date) {
180
+ mtimeMs = stat.mtime.getTime()
181
+ }
182
+
183
+ return new hostFileInfo({
184
+ modTime: time.UnixMilli(mtimeMs),
185
+ mode,
186
+ name: normalizedName,
187
+ size: stat.size ?? 0,
188
+ sys: stat,
189
+ })
190
+ }
191
+
192
+ export function createHostFile(name: string, fd: number = -1, handle: DenoFileLike | null = null): File {
193
+ return new File({
194
+ fd,
195
+ file: new file({ handle: handle ?? hostRuntime.getStdioHandle(fd), path: name }),
196
+ name,
197
+ })
198
+ }
199
+
200
+ export { resetHostRuntimeForTests }
8
201
 
9
202
  // Re-export essential types
10
203
  export type Time = time.Time;
@@ -25,30 +218,41 @@ export function Getpagesize(): number {
25
218
  return 4096
26
219
  }
27
220
 
28
- // Stub implementation of File for JavaScript environment
221
+ // File adapts host file descriptors and file handles to Go's os.File surface.
29
222
  export class File {
30
223
  public get file(): file | null {
31
- return null
224
+ return this._fields.file.value
32
225
  }
33
226
  public set file(value: file | null) {
34
- // No-op
227
+ this._fields.file.value = value
35
228
  }
36
229
 
230
+ public name: string
231
+ public closed: boolean
232
+ public fd: number
233
+
37
234
  public _fields: {
38
235
  file: $.VarRef<file | null>;
39
236
  }
40
237
 
41
- constructor(init?: Partial<{file?: file | null}>) {
238
+ constructor(init?: Partial<{closed?: boolean, fd?: number, file?: file | null, name?: string}>) {
239
+ this.name = init?.name ?? ""
240
+ this.closed = init?.closed ?? false
241
+ this.fd = init?.fd ?? -1
42
242
  this._fields = {
43
- file: $.varRef(null)
243
+ file: $.varRef(init?.file ?? null)
44
244
  }
45
245
  }
46
246
 
47
247
  public clone(): File {
48
- return new File()
248
+ return new File({
249
+ closed: this.closed,
250
+ fd: this.fd,
251
+ file: this.file,
252
+ name: this.name,
253
+ })
49
254
  }
50
255
 
51
- // All File methods return ErrUnimplemented in JavaScript environment
52
256
  public Readdir(n: number): [$.Slice<fs.FileInfo>, $.GoError] {
53
257
  return [null, ErrUnimplemented]
54
258
  }
@@ -66,42 +270,129 @@ export class File {
66
270
  }
67
271
 
68
272
  public Name(): string {
69
- return ""
273
+ return this.name
70
274
  }
71
275
 
72
276
  public Read(b: $.Bytes): [number, $.GoError] {
73
- return [0, ErrUnimplemented]
277
+ if (this.closed) {
278
+ return [0, ErrClosed]
279
+ }
280
+ if (this.fd < 0) {
281
+ return [0, ErrInvalid]
282
+ }
283
+ if (b === null) {
284
+ return [0, null]
285
+ }
286
+ const buf = $.bytesToUint8Array(b)
287
+ const handle = this.file?.handle
288
+ const [n, err] =
289
+ handle && typeof handle.readSync === "function"
290
+ ? readHandle(handle, buf)
291
+ : readFD(this.fd, buf)
292
+ if (!(b instanceof Uint8Array) && n > 0) {
293
+ $.copy(b, buf.subarray(0, n))
294
+ }
295
+ return [n, err]
74
296
  }
75
297
 
76
298
  public ReadAt(b: $.Bytes, off: number): [number, $.GoError] {
77
- return [0, ErrUnimplemented]
299
+ const handle = this.file?.handle
300
+ if (!handle || typeof handle.seekSync !== "function" || b === null) {
301
+ return [0, ErrUnimplemented]
302
+ }
303
+ try {
304
+ handle.seekSync(off, io.SeekStart)
305
+ return this.Read(b)
306
+ } catch (err) {
307
+ return [0, newHostError(err)]
308
+ }
78
309
  }
79
310
 
80
311
  public ReadFrom(r: io.Reader): [number, $.GoError] {
81
- return [0, ErrUnimplemented]
312
+ if (this.closed) {
313
+ return [0, ErrClosed]
314
+ }
315
+ return io.Copy(this, r)
82
316
  }
83
317
 
84
318
  public Write(b: $.Bytes): [number, $.GoError] {
85
- return [0, ErrUnimplemented]
319
+ if (this.closed) {
320
+ return [0, ErrClosed]
321
+ }
322
+ if (this.fd < 0) {
323
+ return [0, ErrInvalid]
324
+ }
325
+ if (b === null) {
326
+ return [0, null]
327
+ }
328
+ const buf = $.bytesToUint8Array(b)
329
+ const handle = this.file?.handle
330
+ return handle && typeof handle.writeSync === "function"
331
+ ? writeHandle(handle, buf)
332
+ : writeFD(this.fd, buf)
86
333
  }
87
334
 
88
335
  public WriteAt(b: $.Bytes, off: number): [number, $.GoError] {
89
- return [0, ErrUnimplemented]
336
+ const handle = this.file?.handle
337
+ if (!handle || typeof handle.seekSync !== "function" || b === null) {
338
+ return [0, ErrUnimplemented]
339
+ }
340
+ try {
341
+ handle.seekSync(off, io.SeekStart)
342
+ return this.Write(b)
343
+ } catch (err) {
344
+ return [0, newHostError(err)]
345
+ }
90
346
  }
91
347
 
92
348
  public WriteTo(w: io.Writer): [number, $.GoError] {
93
- return [0, ErrUnimplemented]
349
+ if (this.closed) {
350
+ return [0, ErrClosed]
351
+ }
352
+ return io.Copy(w, this)
94
353
  }
95
354
 
96
355
  public Seek(offset: number, whence: number): [number, $.GoError] {
97
- return [0, ErrUnimplemented]
356
+ const handle = this.file?.handle
357
+ if (!handle || typeof handle.seekSync !== "function") {
358
+ return [0, ErrUnimplemented]
359
+ }
360
+ try {
361
+ return [handle.seekSync(offset, whence), null]
362
+ } catch (err) {
363
+ return [0, newHostError(err)]
364
+ }
98
365
  }
99
366
 
100
367
  public WriteString(s: string): [number, $.GoError] {
101
- return [0, ErrUnimplemented]
368
+ return this.Write($.stringToBytes(s))
102
369
  }
103
370
 
104
371
  public Chmod(mode: number): $.GoError {
372
+ if (this.closed) {
373
+ return ErrClosed
374
+ }
375
+ if (this.name === "") {
376
+ return ErrUnimplemented
377
+ }
378
+ const denoObj = getDeno()
379
+ if (denoObj?.chmodSync) {
380
+ try {
381
+ denoObj.chmodSync(this.name, mode)
382
+ return null
383
+ } catch (err) {
384
+ return newHostError(err)
385
+ }
386
+ }
387
+ const nodeFS = getNodeFS()
388
+ if (nodeFS?.chmodSync) {
389
+ try {
390
+ nodeFS.chmodSync(this.name, mode)
391
+ return null
392
+ } catch (err) {
393
+ return newHostError(err)
394
+ }
395
+ }
105
396
  return ErrUnimplemented
106
397
  }
107
398
 
@@ -118,40 +409,167 @@ export class File {
118
409
  }
119
410
 
120
411
  public SyscallConn(): [any, $.GoError] {
121
- return [null, ErrUnimplemented]
412
+ if (this.closed) {
413
+ return [null, ErrClosed]
414
+ }
415
+ if (this.fd < 0) {
416
+ return [null, ErrInvalid]
417
+ }
418
+ return [newRawConn(this), null]
122
419
  }
123
420
 
124
421
  public Close(): $.GoError {
125
- return ErrUnimplemented
422
+ if (this.closed) {
423
+ return ErrClosed
424
+ }
425
+ const handle = this.file?.handle
426
+ if (handle && typeof handle.close === "function") {
427
+ try {
428
+ handle.close()
429
+ } catch (err) {
430
+ return newHostError(err)
431
+ }
432
+ } else if (this.fd > 2) {
433
+ const nodeFS = getNodeFS()
434
+ if (nodeFS?.closeSync) {
435
+ try {
436
+ nodeFS.closeSync(this.fd)
437
+ } catch (err) {
438
+ return newHostError(err)
439
+ }
440
+ }
441
+ }
442
+ this.closed = true
443
+ return null
126
444
  }
127
445
 
128
446
  public Chown(uid: number, gid: number): $.GoError {
447
+ if (this.closed) {
448
+ return ErrClosed
449
+ }
450
+ if (this.name === "") {
451
+ return ErrUnimplemented
452
+ }
453
+ const denoObj = getDeno()
454
+ if (denoObj?.chownSync) {
455
+ try {
456
+ denoObj.chownSync(this.name, uid, gid)
457
+ return null
458
+ } catch (err) {
459
+ return newHostError(err)
460
+ }
461
+ }
462
+ const nodeFS = getNodeFS()
463
+ if (nodeFS?.chownSync) {
464
+ try {
465
+ nodeFS.chownSync(this.name, uid, gid)
466
+ return null
467
+ } catch (err) {
468
+ return newHostError(err)
469
+ }
470
+ }
129
471
  return ErrUnimplemented
130
472
  }
131
473
 
132
474
  public Truncate(size: number): $.GoError {
475
+ const handle = this.file?.handle
476
+ if (handle && typeof handle.truncateSync === "function") {
477
+ try {
478
+ handle.truncateSync(size)
479
+ return null
480
+ } catch (err) {
481
+ return newHostError(err)
482
+ }
483
+ }
484
+ const nodeFS = getNodeFS()
485
+ if (nodeFS?.ftruncateSync && this.fd >= 0) {
486
+ try {
487
+ nodeFS.ftruncateSync(this.fd, size)
488
+ return null
489
+ } catch (err) {
490
+ return newHostError(err)
491
+ }
492
+ }
133
493
  return ErrUnimplemented
134
494
  }
135
495
 
136
496
  public Sync(): $.GoError {
497
+ const handle = this.file?.handle
498
+ if (handle && typeof handle.syncSync === "function") {
499
+ try {
500
+ handle.syncSync()
501
+ return null
502
+ } catch (err) {
503
+ return newHostError(err)
504
+ }
505
+ }
506
+ const nodeFS = getNodeFS()
507
+ if (nodeFS?.fsyncSync && this.fd >= 0) {
508
+ try {
509
+ nodeFS.fsyncSync(this.fd)
510
+ return null
511
+ } catch (err) {
512
+ return newHostError(err)
513
+ }
514
+ }
137
515
  return ErrUnimplemented
138
516
  }
139
517
 
140
518
  public Chdir(): $.GoError {
519
+ const processObj = (globalThis as any).process
520
+ if (processObj?.chdir && this.name !== "") {
521
+ try {
522
+ processObj.chdir(this.name)
523
+ return null
524
+ } catch (err) {
525
+ return newHostError(err)
526
+ }
527
+ }
528
+ const denoObj = getDeno()
529
+ if (denoObj?.chdir && this.name !== "") {
530
+ try {
531
+ denoObj.chdir(this.name)
532
+ return null
533
+ } catch (err) {
534
+ return newHostError(err)
535
+ }
536
+ }
141
537
  return ErrUnimplemented
142
538
  }
143
539
 
144
540
  public Fd(): syscall.uintptr {
145
- return 0
541
+ return this.fd
146
542
  }
147
543
 
148
544
  public Stat(): [fs.FileInfo, $.GoError] {
545
+ const handle = this.file?.handle
546
+ if (handle && typeof handle.statSync === "function") {
547
+ try {
548
+ return [createFileInfo(this.name, handle.statSync()), null]
549
+ } catch (err) {
550
+ return [null, newHostError(err)]
551
+ }
552
+ }
553
+ const nodeFS = getNodeFS()
554
+ if (nodeFS?.fstatSync && this.fd >= 0) {
555
+ try {
556
+ return [createFileInfo(this.name, nodeFS.fstatSync(this.fd)), null]
557
+ } catch (err) {
558
+ return [null, newHostError(err)]
559
+ }
560
+ }
149
561
  return [null, ErrUnimplemented]
150
562
  }
151
563
 
152
564
  // Internal methods
153
565
  public checkValid(op: string): $.GoError {
154
- return ErrUnimplemented
566
+ if (this.closed) {
567
+ return ErrClosed
568
+ }
569
+ if (this.fd < 0) {
570
+ return ErrInvalid
571
+ }
572
+ return null
155
573
  }
156
574
 
157
575
  public wrapErr(op: string, err: $.GoError): $.GoError {
@@ -168,16 +586,21 @@ export class File {
168
586
  { name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
169
587
  ],
170
588
  File,
171
- { "file": { kind: $.TypeKind.Pointer, elemType: "file" } }
589
+ { "file": { kind: $.TypeKind.Pointer, elemType: "file" }, "name": { kind: $.TypeKind.Basic, name: "string" }, "closed": { kind: $.TypeKind.Basic, name: "boolean" }, "fd": { kind: $.TypeKind.Basic, name: "number" } }
172
590
  );
173
591
  }
174
592
 
175
- // Stub file type for internal use
176
593
  class file {
177
- constructor() {}
594
+ public handle: DenoFileLike | null
595
+ public path: string
596
+
597
+ constructor(init?: Partial<{handle?: DenoFileLike | null, path?: string}>) {
598
+ this.handle = init?.handle ?? null
599
+ this.path = init?.path ?? ""
600
+ }
178
601
  }
179
602
 
180
- // Stub readdirMode type
603
+ // readdirMode mirrors the Go runtime helper enum.
181
604
  type readdirMode = number
182
605
 
183
606
  // File mode constants
@@ -223,4 +646,4 @@ export function FileMode_String(receiver: fs.FileMode): string {
223
646
 
224
647
  export function FileMode_Type(receiver: fs.FileMode): fs.FileMode {
225
648
  return fs.FileMode_Type(receiver)
226
- }
649
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "goscript",
3
3
  "description": "Go to TypeScript transpiler",
4
- "version": "0.0.82",
4
+ "version": "0.0.84",
5
5
  "author": {
6
6
  "name": "Aperture Robotics LLC.",
7
7
  "email": "support@aperture.us",