goscript 0.0.36 → 0.0.37
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.
- package/compiler/expr-call.go +26 -0
- package/compiler/spec.go +1 -1
- package/compiler/stmt.go +26 -8
- package/dist/gs/internal/byteorder/index.d.ts +8 -0
- package/dist/gs/internal/byteorder/index.js +34 -0
- package/dist/gs/internal/byteorder/index.js.map +1 -0
- package/dist/gs/internal/testlog/index.d.ts +1 -0
- package/dist/gs/internal/testlog/index.js +5 -0
- package/dist/gs/internal/testlog/index.js.map +1 -0
- package/dist/gs/os/dir.gs.d.ts +6 -0
- package/dist/gs/os/dir.gs.js +35 -0
- package/dist/gs/os/dir.gs.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.d.ts +7 -0
- package/dist/gs/os/dir_unix.gs.js +113 -0
- package/dist/gs/os/dir_unix.gs.js.map +1 -0
- package/dist/gs/os/dirent_js.gs.d.ts +5 -0
- package/dist/gs/os/dirent_js.gs.js +20 -0
- package/dist/gs/os/dirent_js.gs.js.map +1 -0
- package/dist/gs/os/env.gs.d.ts +12 -0
- package/dist/gs/os/env.gs.js +157 -0
- package/dist/gs/os/env.gs.js.map +1 -0
- package/dist/gs/os/error.gs.d.ts +40 -0
- package/dist/gs/os/error.gs.js +158 -0
- package/dist/gs/os/error.gs.js.map +1 -0
- package/dist/gs/os/error_errno.gs.d.ts +1 -0
- package/dist/gs/os/error_errno.gs.js +5 -0
- package/dist/gs/os/error_errno.gs.js.map +1 -0
- package/dist/gs/os/exec.gs.d.ts +60 -0
- package/dist/gs/os/exec.gs.js +136 -0
- package/dist/gs/os/exec.gs.js.map +1 -0
- package/dist/gs/os/exec_nohandle.gs.d.ts +1 -0
- package/dist/gs/os/exec_nohandle.gs.js +2 -0
- package/dist/gs/os/exec_nohandle.gs.js.map +1 -0
- package/dist/gs/os/exec_posix.gs.d.ts +25 -0
- package/dist/gs/os/exec_posix.gs.js +67 -0
- package/dist/gs/os/exec_posix.gs.js.map +1 -0
- package/dist/gs/os/exec_unix.gs.d.ts +4 -0
- package/dist/gs/os/exec_unix.gs.js +46 -0
- package/dist/gs/os/exec_unix.gs.js.map +1 -0
- package/dist/gs/os/executable.gs.d.ts +2 -0
- package/dist/gs/os/executable.gs.js +16 -0
- package/dist/gs/os/executable.gs.js.map +1 -0
- package/dist/gs/os/executable_js.gs.d.ts +2 -0
- package/dist/gs/os/executable_js.gs.js +5 -0
- package/dist/gs/os/executable_js.gs.js.map +1 -0
- package/dist/gs/os/executable_wasm.gs.d.ts +2 -0
- package/dist/gs/os/executable_wasm.gs.js +6 -0
- package/dist/gs/os/executable_wasm.gs.js.map +1 -0
- package/dist/gs/os/file_constants_js.gs.d.ts +41 -0
- package/dist/gs/os/file_constants_js.gs.js +78 -0
- package/dist/gs/os/file_constants_js.gs.js.map +1 -0
- package/dist/gs/os/file_js.gs.d.ts +22 -0
- package/dist/gs/os/file_js.gs.js +73 -0
- package/dist/gs/os/file_js.gs.js.map +1 -0
- package/dist/gs/os/file_open_unix.gs.d.ts +6 -0
- package/dist/gs/os/file_open_unix.gs.js +10 -0
- package/dist/gs/os/file_open_unix.gs.js.map +1 -0
- package/dist/gs/os/file_posix_js.gs.d.ts +8 -0
- package/dist/gs/os/file_posix_js.gs.js +32 -0
- package/dist/gs/os/file_posix_js.gs.js.map +1 -0
- package/dist/gs/os/file_unix_js.gs.d.ts +27 -0
- package/dist/gs/os/file_unix_js.gs.js +64 -0
- package/dist/gs/os/file_unix_js.gs.js.map +1 -0
- package/dist/gs/os/getwd_js.gs.d.ts +6 -0
- package/dist/gs/os/getwd_js.gs.js +21 -0
- package/dist/gs/os/getwd_js.gs.js.map +1 -0
- package/dist/gs/os/index.d.ts +19 -0
- package/dist/gs/os/index.js +20 -0
- package/dist/gs/os/index.js.map +1 -0
- package/dist/gs/os/path.gs.d.ts +4 -0
- package/dist/gs/os/path.gs.js +32 -0
- package/dist/gs/os/path.gs.js.map +1 -0
- package/dist/gs/os/path_unix.gs.d.ts +4 -0
- package/dist/gs/os/path_unix.gs.js +40 -0
- package/dist/gs/os/path_unix.gs.js.map +1 -0
- package/dist/gs/os/pidfd_js.gs.d.ts +6 -0
- package/dist/gs/os/pidfd_js.gs.js +14 -0
- package/dist/gs/os/pidfd_js.gs.js.map +1 -0
- package/dist/gs/os/pipe_wasm.gs.d.ts +2 -0
- package/dist/gs/os/pipe_wasm.gs.js +14 -0
- package/dist/gs/os/pipe_wasm.gs.js.map +1 -0
- package/dist/gs/os/proc.gs.d.ts +11 -0
- package/dist/gs/os/proc.gs.js +68 -0
- package/dist/gs/os/proc.gs.js.map +1 -0
- package/dist/gs/os/proc_js.gs.d.ts +3 -0
- package/dist/gs/os/proc_js.gs.js +12 -0
- package/dist/gs/os/proc_js.gs.js.map +1 -0
- package/dist/gs/os/rawconn_js.gs.d.ts +10 -0
- package/dist/gs/os/rawconn_js.gs.js +26 -0
- package/dist/gs/os/rawconn_js.gs.js.map +1 -0
- package/dist/gs/os/removeall_js.gs.d.ts +2 -0
- package/dist/gs/os/removeall_js.gs.js +7 -0
- package/dist/gs/os/removeall_js.gs.js.map +1 -0
- package/dist/gs/os/root_js.gs.d.ts +23 -0
- package/dist/gs/os/root_js.gs.js +80 -0
- package/dist/gs/os/root_js.gs.js.map +1 -0
- package/dist/gs/os/root_nonwindows.gs.d.ts +2 -0
- package/dist/gs/os/root_nonwindows.gs.js +4 -0
- package/dist/gs/os/root_nonwindows.gs.js.map +1 -0
- package/dist/gs/os/root_noopenat.gs.d.ts +11 -0
- package/dist/gs/os/root_noopenat.gs.js +31 -0
- package/dist/gs/os/root_noopenat.gs.js.map +1 -0
- package/dist/gs/os/stat.gs.d.ts +24 -0
- package/dist/gs/os/stat.gs.js +20 -0
- package/dist/gs/os/stat.gs.js.map +1 -0
- package/dist/gs/os/stat_js.gs.d.ts +6 -0
- package/dist/gs/os/stat_js.gs.js +23 -0
- package/dist/gs/os/stat_js.gs.js.map +1 -0
- package/dist/gs/os/stat_unix_js.gs.d.ts +8 -0
- package/dist/gs/os/stat_unix_js.gs.js +16 -0
- package/dist/gs/os/stat_unix_js.gs.js.map +1 -0
- package/dist/gs/os/sticky_bsd.gs.d.ts +1 -0
- package/dist/gs/os/sticky_bsd.gs.js +3 -0
- package/dist/gs/os/sticky_bsd.gs.js.map +1 -0
- package/dist/gs/os/sys.gs.d.ts +2 -0
- package/dist/gs/os/sys.gs.js +10 -0
- package/dist/gs/os/sys.gs.js.map +1 -0
- package/dist/gs/os/sys_bsd.gs.d.ts +2 -0
- package/dist/gs/os/sys_bsd.gs.js +15 -0
- package/dist/gs/os/sys_bsd.gs.js.map +1 -0
- package/dist/gs/os/sys_js.gs.d.ts +2 -0
- package/dist/gs/os/sys_js.gs.js +6 -0
- package/dist/gs/os/sys_js.gs.js.map +1 -0
- package/dist/gs/os/tempfile.gs.d.ts +5 -0
- package/dist/gs/os/tempfile.gs.js +30 -0
- package/dist/gs/os/tempfile.gs.js.map +1 -0
- package/dist/gs/os/types.gs.d.ts +59 -0
- package/dist/gs/os/types.gs.js +123 -0
- package/dist/gs/os/types.gs.js.map +1 -0
- package/dist/gs/os/types_js.gs.d.ts +74 -0
- package/dist/gs/os/types_js.gs.js +147 -0
- package/dist/gs/os/types_js.gs.js.map +1 -0
- package/dist/gs/os/types_unix.gs.d.ts +40 -0
- package/dist/gs/os/types_unix.gs.js +87 -0
- package/dist/gs/os/types_unix.gs.js.map +1 -0
- package/dist/gs/os/wait_unimp.gs.d.ts +1 -0
- package/dist/gs/os/wait_unimp.gs.js +2 -0
- package/dist/gs/os/wait_unimp.gs.js.map +1 -0
- package/dist/gs/os/zero_copy_posix.gs.d.ts +4 -0
- package/dist/gs/os/zero_copy_posix.gs.js +27 -0
- package/dist/gs/os/zero_copy_posix.gs.js.map +1 -0
- package/dist/gs/os/zero_copy_stub.gs.d.ts +1 -0
- package/dist/gs/os/zero_copy_stub.gs.js +2 -0
- package/dist/gs/os/zero_copy_stub.gs.js.map +1 -0
- package/dist/gs/syscall/index.d.ts +80 -0
- package/dist/gs/syscall/index.js +163 -0
- package/dist/gs/syscall/index.js.map +1 -0
- package/gs/internal/byteorder/index.ts +40 -0
- package/gs/internal/testlog/index.ts +7 -0
- package/gs/os/dir.gs.ts +42 -0
- package/gs/os/dir_unix.gs.ts +155 -0
- package/gs/os/dirent_js.gs.ts +27 -0
- package/gs/os/env.gs.ts +179 -0
- package/gs/os/error.gs.ts +205 -0
- package/gs/os/error_errno.gs.ts +12 -0
- package/gs/os/exec.gs.ts +198 -0
- package/gs/os/exec_nohandle.gs.ts +2 -0
- package/gs/os/exec_posix.gs.ts +95 -0
- package/gs/os/exec_unix.gs.ts +64 -0
- package/gs/os/executable.gs.ts +18 -0
- package/gs/os/executable_js.gs.ts +6 -0
- package/gs/os/executable_wasm.gs.ts +10 -0
- package/gs/os/file_constants_js.gs.ts +98 -0
- package/gs/os/file_js.gs.ts +99 -0
- package/gs/os/file_open_unix.gs.ts +15 -0
- package/gs/os/file_posix_js.gs.ts +40 -0
- package/gs/os/file_unix_js.gs.ts +94 -0
- package/gs/os/getwd_js.gs.ts +28 -0
- package/gs/os/index.ts +19 -0
- package/gs/os/path.gs.ts +35 -0
- package/gs/os/path_unix.gs.ts +49 -0
- package/gs/os/pidfd_js.gs.ts +25 -0
- package/gs/os/pipe_wasm.gs.ts +17 -0
- package/gs/os/proc.gs.ts +84 -0
- package/gs/os/proc_js.gs.ts +15 -0
- package/gs/os/rawconn_js.gs.ts +30 -0
- package/gs/os/removeall_js.gs.ts +9 -0
- package/gs/os/root_js.gs.ts +111 -0
- package/gs/os/root_nonwindows.gs.ts +6 -0
- package/gs/os/root_noopenat.gs.ts +45 -0
- package/gs/os/stat.gs.ts +38 -0
- package/gs/os/stat_js.gs.ts +30 -0
- package/gs/os/stat_unix_js.gs.ts +27 -0
- package/gs/os/sticky_bsd.gs.ts +4 -0
- package/gs/os/sys.gs.ts +12 -0
- package/gs/os/sys_bsd.gs.ts +17 -0
- package/gs/os/sys_js.gs.ts +9 -0
- package/gs/os/tempfile.gs.ts +34 -0
- package/gs/os/types.gs.ts +170 -0
- package/gs/os/types_js.gs.ts +205 -0
- package/gs/os/types_unix.gs.ts +118 -0
- package/gs/os/wait_unimp.gs.ts +2 -0
- package/gs/os/zero_copy_posix.gs.ts +35 -0
- package/gs/os/zero_copy_stub.gs.ts +4 -0
- package/gs/syscall/index.ts +204 -0
- package/package.json +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
import { ErrUnimplemented } from "./error.gs.js";
|
|
3
|
+
|
|
4
|
+
import * as fs from "@goscript/io/fs/index.js"
|
|
5
|
+
import * as io from "@goscript/io/index.js"
|
|
6
|
+
import * as time from "@goscript/time/index.js"
|
|
7
|
+
import * as syscall from "@goscript/syscall/index.js"
|
|
8
|
+
|
|
9
|
+
// Re-export essential types
|
|
10
|
+
export type Time = time.Time;
|
|
11
|
+
export type FileInfo = fs.FileInfo;
|
|
12
|
+
export type FileMode = fs.FileMode;
|
|
13
|
+
export type DirEntry = fs.DirEntry;
|
|
14
|
+
|
|
15
|
+
// Export runtime values for ES module compatibility
|
|
16
|
+
export const Time = null as any;
|
|
17
|
+
export const FileInfo = null as any;
|
|
18
|
+
export const FileMode = null as any;
|
|
19
|
+
export const DirEntry = null as any;
|
|
20
|
+
|
|
21
|
+
// Getpagesize returns the underlying system's memory page size.
|
|
22
|
+
export function Getpagesize(): number {
|
|
23
|
+
// Return a standard page size for JavaScript environment
|
|
24
|
+
// Most systems use 4096 bytes as the default page size
|
|
25
|
+
return 4096
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Stub implementation of File for JavaScript environment
|
|
29
|
+
export class File {
|
|
30
|
+
public get file(): file | null {
|
|
31
|
+
return null
|
|
32
|
+
}
|
|
33
|
+
public set file(value: file | null) {
|
|
34
|
+
// No-op
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public _fields: {
|
|
38
|
+
file: $.VarRef<file | null>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
constructor(init?: Partial<{file?: file | null}>) {
|
|
42
|
+
this._fields = {
|
|
43
|
+
file: $.varRef(null)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public clone(): File {
|
|
48
|
+
return new File()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// All File methods return ErrUnimplemented in JavaScript environment
|
|
52
|
+
public Readdir(n: number): [$.Slice<fs.FileInfo>, $.GoError] {
|
|
53
|
+
return [null, ErrUnimplemented]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public Readdirnames(n: number): [$.Slice<string>, $.GoError] {
|
|
57
|
+
return [null, ErrUnimplemented]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public ReadDir(n: number): [$.Slice<fs.DirEntry>, $.GoError] {
|
|
61
|
+
return [null, ErrUnimplemented]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public readdir(n: number, mode: readdirMode): [$.Slice<string>, $.Slice<fs.DirEntry>, $.Slice<fs.FileInfo>, $.GoError] {
|
|
65
|
+
return [null, null, null, ErrUnimplemented]
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public Name(): string {
|
|
69
|
+
return ""
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public Read(b: $.Bytes): [number, $.GoError] {
|
|
73
|
+
return [0, ErrUnimplemented]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public ReadAt(b: $.Bytes, off: number): [number, $.GoError] {
|
|
77
|
+
return [0, ErrUnimplemented]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public ReadFrom(r: io.Reader): [number, $.GoError] {
|
|
81
|
+
return [0, ErrUnimplemented]
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public Write(b: $.Bytes): [number, $.GoError] {
|
|
85
|
+
return [0, ErrUnimplemented]
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public WriteAt(b: $.Bytes, off: number): [number, $.GoError] {
|
|
89
|
+
return [0, ErrUnimplemented]
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public WriteTo(w: io.Writer): [number, $.GoError] {
|
|
93
|
+
return [0, ErrUnimplemented]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public Seek(offset: number, whence: number): [number, $.GoError] {
|
|
97
|
+
return [0, ErrUnimplemented]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public WriteString(s: string): [number, $.GoError] {
|
|
101
|
+
return [0, ErrUnimplemented]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public Chmod(mode: number): $.GoError {
|
|
105
|
+
return ErrUnimplemented
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public SetDeadline(t: time.Time): $.GoError {
|
|
109
|
+
return ErrUnimplemented
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public SetReadDeadline(t: time.Time): $.GoError {
|
|
113
|
+
return ErrUnimplemented
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public SetWriteDeadline(t: time.Time): $.GoError {
|
|
117
|
+
return ErrUnimplemented
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public SyscallConn(): [any, $.GoError] {
|
|
121
|
+
return [null, ErrUnimplemented]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public Close(): $.GoError {
|
|
125
|
+
return ErrUnimplemented
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public Chown(uid: number, gid: number): $.GoError {
|
|
129
|
+
return ErrUnimplemented
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public Truncate(size: number): $.GoError {
|
|
133
|
+
return ErrUnimplemented
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public Sync(): $.GoError {
|
|
137
|
+
return ErrUnimplemented
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public Chdir(): $.GoError {
|
|
141
|
+
return ErrUnimplemented
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public Fd(): syscall.uintptr {
|
|
145
|
+
return 0
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public Stat(): [fs.FileInfo, $.GoError] {
|
|
149
|
+
return [null, ErrUnimplemented]
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Internal methods
|
|
153
|
+
public checkValid(op: string): $.GoError {
|
|
154
|
+
return ErrUnimplemented
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public wrapErr(op: string, err: $.GoError): $.GoError {
|
|
158
|
+
return err
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Register this type with the runtime type system
|
|
162
|
+
static __typeInfo = $.registerStructType(
|
|
163
|
+
'File',
|
|
164
|
+
new File(),
|
|
165
|
+
[
|
|
166
|
+
{ name: "Readdir", args: [{ name: "n", type: { kind: $.TypeKind.Basic, name: "number" } }], returns: [{ type: { kind: $.TypeKind.Slice, elemType: "FileInfo" } }, { type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] },
|
|
167
|
+
{ name: "Read", args: [{ name: "b", type: { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "number" } } }], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }, { type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] },
|
|
168
|
+
{ name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
|
|
169
|
+
],
|
|
170
|
+
File,
|
|
171
|
+
{ "file": { kind: $.TypeKind.Pointer, elemType: "file" } }
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Stub file type for internal use
|
|
176
|
+
class file {
|
|
177
|
+
constructor() {}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Stub readdirMode type
|
|
181
|
+
type readdirMode = number
|
|
182
|
+
|
|
183
|
+
// File mode constants
|
|
184
|
+
export let ModeDir: fs.FileMode = fs.ModeDir
|
|
185
|
+
export let ModeAppend: fs.FileMode = fs.ModeAppend
|
|
186
|
+
export let ModeExclusive: fs.FileMode = fs.ModeExclusive
|
|
187
|
+
export let ModeTemporary: fs.FileMode = fs.ModeTemporary
|
|
188
|
+
export let ModeSymlink: fs.FileMode = fs.ModeSymlink
|
|
189
|
+
export let ModeDevice: fs.FileMode = fs.ModeDevice
|
|
190
|
+
export let ModeNamedPipe: fs.FileMode = fs.ModeNamedPipe
|
|
191
|
+
export let ModeSocket: fs.FileMode = fs.ModeSocket
|
|
192
|
+
export let ModeSetuid: fs.FileMode = fs.ModeSetuid
|
|
193
|
+
export let ModeSetgid: fs.FileMode = fs.ModeSetgid
|
|
194
|
+
export let ModeCharDevice: fs.FileMode = fs.ModeCharDevice
|
|
195
|
+
export let ModeSticky: fs.FileMode = fs.ModeSticky
|
|
196
|
+
export let ModeIrregular: fs.FileMode = fs.ModeIrregular
|
|
197
|
+
|
|
198
|
+
export let ModeType: fs.FileMode = fs.ModeType
|
|
199
|
+
export let ModePerm: fs.FileMode = fs.ModePerm
|
|
200
|
+
|
|
201
|
+
// SameFile reports whether fi1 and fi2 describe the same file.
|
|
202
|
+
export function SameFile(fi1: fs.FileInfo, fi2: fs.FileInfo): boolean {
|
|
203
|
+
// In JavaScript environment, always return false as we can't compare files
|
|
204
|
+
return false
|
|
205
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
|
|
3
|
+
import * as fs from "@goscript/io/fs/index.js"
|
|
4
|
+
|
|
5
|
+
import * as syscall from "@goscript/syscall/index.js"
|
|
6
|
+
|
|
7
|
+
import * as time from "@goscript/time/index.js"
|
|
8
|
+
|
|
9
|
+
class fileStat {
|
|
10
|
+
public get name(): string {
|
|
11
|
+
return this._fields.name.value
|
|
12
|
+
}
|
|
13
|
+
public set name(value: string) {
|
|
14
|
+
this._fields.name.value = value
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public get size(): number {
|
|
18
|
+
return this._fields.size.value
|
|
19
|
+
}
|
|
20
|
+
public set size(value: number) {
|
|
21
|
+
this._fields.size.value = value
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public get mode(): fs.FileMode {
|
|
25
|
+
return this._fields.mode.value
|
|
26
|
+
}
|
|
27
|
+
public set mode(value: fs.FileMode) {
|
|
28
|
+
this._fields.mode.value = value
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public get modTime(): time.Time {
|
|
32
|
+
return this._fields.modTime.value
|
|
33
|
+
}
|
|
34
|
+
public set modTime(value: time.Time) {
|
|
35
|
+
this._fields.modTime.value = value
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public get sys(): syscall.Stat_t {
|
|
39
|
+
return this._fields.sys.value
|
|
40
|
+
}
|
|
41
|
+
public set sys(value: syscall.Stat_t) {
|
|
42
|
+
this._fields.sys.value = value
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public _fields: {
|
|
46
|
+
name: $.VarRef<string>;
|
|
47
|
+
size: $.VarRef<number>;
|
|
48
|
+
mode: $.VarRef<fs.FileMode>;
|
|
49
|
+
modTime: $.VarRef<time.Time>;
|
|
50
|
+
sys: $.VarRef<syscall.Stat_t>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
constructor(init?: Partial<{modTime?: time.Time, mode?: fs.FileMode, name?: string, size?: number, sys?: syscall.Stat_t}>) {
|
|
54
|
+
this._fields = {
|
|
55
|
+
name: $.varRef(init?.name ?? ""),
|
|
56
|
+
size: $.varRef(init?.size ?? 0),
|
|
57
|
+
mode: $.varRef(init?.mode ?? 0),
|
|
58
|
+
modTime: $.varRef(init?.modTime?.clone() ?? time.Now()),
|
|
59
|
+
sys: $.varRef(init?.sys?.clone() ?? new syscall.Stat_t())
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public clone(): fileStat {
|
|
64
|
+
const cloned = new fileStat()
|
|
65
|
+
cloned._fields = {
|
|
66
|
+
name: $.varRef(this._fields.name.value),
|
|
67
|
+
size: $.varRef(this._fields.size.value),
|
|
68
|
+
mode: $.varRef(this._fields.mode.value),
|
|
69
|
+
modTime: $.varRef(this._fields.modTime.value?.clone() ?? null),
|
|
70
|
+
sys: $.varRef(this._fields.sys.value?.clone() ?? null)
|
|
71
|
+
}
|
|
72
|
+
return cloned
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public Name(): string {
|
|
76
|
+
const fs = this
|
|
77
|
+
return fs!.name
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public IsDir(): boolean {
|
|
81
|
+
const fileStat = this
|
|
82
|
+
return (fileStat!.Mode() & fs.ModeDir) !== 0
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public Size(): number {
|
|
86
|
+
const fs = this
|
|
87
|
+
return fs!.size
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public Mode(): fs.FileMode {
|
|
91
|
+
const fileStat = this
|
|
92
|
+
return fileStat!.mode
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public ModTime(): time.Time {
|
|
96
|
+
const fs = this
|
|
97
|
+
return fs!.modTime
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public Sys(): null | any {
|
|
101
|
+
const fs = this
|
|
102
|
+
return fs!.sys
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Register this type with the runtime type system
|
|
106
|
+
static __typeInfo = $.registerStructType(
|
|
107
|
+
'fileStat',
|
|
108
|
+
new fileStat(),
|
|
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
|
+
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"}
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function sameFile(fs1: fileStat | null, fs2: fileStat | null): boolean {
|
|
116
|
+
return fs1!.sys.Dev == fs2!.sys.Dev && fs1!.sys.Ino == fs2!.sys.Ino
|
|
117
|
+
}
|
|
118
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
import { NewSyscallError } from "./error.gs.js";
|
|
3
|
+
|
|
4
|
+
import * as io from "@goscript/io/index.js"
|
|
5
|
+
|
|
6
|
+
import * as syscall from "@goscript/syscall/index.js"
|
|
7
|
+
|
|
8
|
+
// wrapSyscallError takes an error and a syscall name. If the error is
|
|
9
|
+
// a syscall.Errno, it wraps it in an os.SyscallError using the syscall name.
|
|
10
|
+
export function wrapSyscallError(name: string, err: $.GoError): $.GoError {
|
|
11
|
+
{
|
|
12
|
+
let { ok: ok } = $.typeAssert<syscall.Errno>(err, 'syscall.Errno')
|
|
13
|
+
if (ok) {
|
|
14
|
+
err = NewSyscallError(name, err)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return err
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// tryLimitedReader tries to assert the io.Reader to io.LimitedReader, it returns the io.LimitedReader,
|
|
21
|
+
// the underlying io.Reader and the remaining amount of bytes if the assertion succeeds,
|
|
22
|
+
// otherwise it just returns the original io.Reader and the theoretical unlimited remaining amount of bytes.
|
|
23
|
+
export function tryLimitedReader(r: io.Reader): [io.LimitedReader | null, io.Reader, number] {
|
|
24
|
+
// by default, copy until EOF
|
|
25
|
+
let remain: number = Number.MAX_SAFE_INTEGER - 1
|
|
26
|
+
|
|
27
|
+
let { value: lr, ok: ok } = $.typeAssert<io.LimitedReader | null>(r, {kind: $.TypeKind.Pointer, elemType: 'io.LimitedReader'})
|
|
28
|
+
if (!ok) {
|
|
29
|
+
return [null, r, remain]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
remain = lr!.N
|
|
33
|
+
return [lr, lr!.R, remain]
|
|
34
|
+
}
|
|
35
|
+
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
|
|
3
|
+
// Essential type aliases
|
|
4
|
+
export type uintptr = number
|
|
5
|
+
|
|
6
|
+
// Errno type for syscall errors
|
|
7
|
+
export interface Errno {
|
|
8
|
+
Error(): string
|
|
9
|
+
Is(target: $.GoError): boolean
|
|
10
|
+
Errno(): number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Essential syscall constants
|
|
14
|
+
export const O_RDONLY = 0
|
|
15
|
+
export const O_WRONLY = 1
|
|
16
|
+
export const O_RDWR = 2
|
|
17
|
+
export const O_APPEND = 8
|
|
18
|
+
export const O_CREATE = 64
|
|
19
|
+
export const O_EXCL = 128
|
|
20
|
+
export const O_SYNC = 256
|
|
21
|
+
export const O_TRUNC = 512
|
|
22
|
+
|
|
23
|
+
export const Stdin = 0
|
|
24
|
+
export const Stdout = 1
|
|
25
|
+
export const Stderr = 2
|
|
26
|
+
|
|
27
|
+
export const SIGINT = 2
|
|
28
|
+
export const SIGTERM = 15
|
|
29
|
+
|
|
30
|
+
// File mode constants
|
|
31
|
+
export const S_IFMT = 0o170000
|
|
32
|
+
export const S_IFREG = 0o100000
|
|
33
|
+
export const S_IFDIR = 0o040000
|
|
34
|
+
export const S_IFLNK = 0o120000
|
|
35
|
+
export const S_IFBLK = 0o060000
|
|
36
|
+
export const S_IFCHR = 0o020000
|
|
37
|
+
export const S_IFIFO = 0o010000
|
|
38
|
+
export const S_IFSOCK = 0o140000
|
|
39
|
+
export const S_ISUID = 0o004000
|
|
40
|
+
export const S_ISGID = 0o002000
|
|
41
|
+
export const S_ISVTX = 0o001000
|
|
42
|
+
|
|
43
|
+
// Environment variable functions using Node.js/browser APIs
|
|
44
|
+
export function Getenv(key: string): [string, boolean] {
|
|
45
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
46
|
+
const value = process.env[key]
|
|
47
|
+
return value !== undefined ? [value, true] : ["", false]
|
|
48
|
+
}
|
|
49
|
+
return ["", false]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function Setenv(key: string, value: string): $.GoError {
|
|
53
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
54
|
+
process.env[key] = value
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
return { Error: () => "setenv not supported" }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function Unsetenv(key: string): $.GoError {
|
|
61
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
62
|
+
delete process.env[key]
|
|
63
|
+
return null
|
|
64
|
+
}
|
|
65
|
+
return { Error: () => "unsetenv not supported" }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function Clearenv(): void {
|
|
69
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
70
|
+
for (const key in process.env) {
|
|
71
|
+
delete process.env[key]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function Environ(): $.Slice<string> {
|
|
77
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
78
|
+
const env: string[] = []
|
|
79
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
80
|
+
if (value !== undefined) {
|
|
81
|
+
env.push(`${key}=${value}`)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return $.arrayToSlice(env)
|
|
85
|
+
}
|
|
86
|
+
return $.arrayToSlice([])
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Dirent structure with Reclen field
|
|
90
|
+
export class Dirent {
|
|
91
|
+
public Name: $.Bytes = new Uint8Array(0)
|
|
92
|
+
public Reclen: number = 0
|
|
93
|
+
constructor(init?: any) {
|
|
94
|
+
if (init?.Name) this.Name = init.Name
|
|
95
|
+
if (init?.Reclen) this.Reclen = init.Reclen
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Stat_t structure stub
|
|
100
|
+
export class Stat_t {
|
|
101
|
+
public Dev: number = 0
|
|
102
|
+
public Ino: number = 0
|
|
103
|
+
public Mode: number = 0
|
|
104
|
+
public Nlink: number = 0
|
|
105
|
+
public Uid: number = 0
|
|
106
|
+
public Gid: number = 0
|
|
107
|
+
public Rdev: number = 0
|
|
108
|
+
public Size: number = 0
|
|
109
|
+
public Blksize: number = 0
|
|
110
|
+
public Blocks: number = 0
|
|
111
|
+
public Atime: number = 0
|
|
112
|
+
public Mtime: number = 0
|
|
113
|
+
public Ctime: number = 0
|
|
114
|
+
public AtimeNsec: number = 0
|
|
115
|
+
public MtimeNsec: number = 0
|
|
116
|
+
public CtimeNsec: number = 0
|
|
117
|
+
|
|
118
|
+
constructor(init?: any) {
|
|
119
|
+
if (init) {
|
|
120
|
+
Object.assign(this, init)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public clone(): Stat_t {
|
|
125
|
+
return new Stat_t(this)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// RawConn interface - stub implementation for JavaScript environment
|
|
130
|
+
export interface RawConn {
|
|
131
|
+
Control(f: (fd: uintptr) => void): $.GoError
|
|
132
|
+
Read(f: (fd: uintptr) => boolean): $.GoError
|
|
133
|
+
Write(f: (fd: uintptr) => boolean): $.GoError
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Stub implementation of RawConn that always returns ErrUnimplemented
|
|
137
|
+
export class StubRawConn implements RawConn {
|
|
138
|
+
Control(f: (fd: uintptr) => void): $.GoError {
|
|
139
|
+
return { Error: () => "operation not implemented in JavaScript environment" }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
Read(f: (fd: uintptr) => boolean): $.GoError {
|
|
143
|
+
return { Error: () => "operation not implemented in JavaScript environment" }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Write(f: (fd: uintptr) => boolean): $.GoError {
|
|
147
|
+
return { Error: () => "operation not implemented in JavaScript environment" }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Additional error constants - implement as Errno type
|
|
152
|
+
export const ENOSYS: Errno = {
|
|
153
|
+
Error: () => "function not implemented",
|
|
154
|
+
Is: (target: $.GoError) => target === ENOSYS,
|
|
155
|
+
Errno: () => 38
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export const EISDIR: Errno = {
|
|
159
|
+
Error: () => "is a directory",
|
|
160
|
+
Is: (target: $.GoError) => target === EISDIR,
|
|
161
|
+
Errno: () => 21
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export const ENOTDIR: Errno = {
|
|
165
|
+
Error: () => "not a directory",
|
|
166
|
+
Is: (target: $.GoError) => target === ENOTDIR,
|
|
167
|
+
Errno: () => 20
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export const ERANGE: Errno = {
|
|
171
|
+
Error: () => "result too large",
|
|
172
|
+
Is: (target: $.GoError) => target === ERANGE,
|
|
173
|
+
Errno: () => 34
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export const ENOMEM: Errno = {
|
|
177
|
+
Error: () => "out of memory",
|
|
178
|
+
Is: (target: $.GoError) => target === ENOMEM,
|
|
179
|
+
Errno: () => 12
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export const ESRCH: Errno = {
|
|
183
|
+
Error: () => "no such process",
|
|
184
|
+
Is: (target: $.GoError) => target === ESRCH,
|
|
185
|
+
Errno: () => 3
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Additional missing syscall functions
|
|
189
|
+
export function Open(path: string, flag: number, perm: number): [number, $.GoError] {
|
|
190
|
+
return [-1, ENOSYS]
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function Sysctl(name: string): [string, $.GoError] {
|
|
194
|
+
return ["", ENOSYS]
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
// Getpagesize returns the underlying system's memory page size.
|
|
200
|
+
export function Getpagesize(): number {
|
|
201
|
+
// Return a standard page size for JavaScript environment
|
|
202
|
+
// Most systems use 4096 bytes as the default page size
|
|
203
|
+
return 4096
|
|
204
|
+
}
|