goscript 0.1.4 → 0.2.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.
- package/README.md +5 -2
- package/cmd/go_js_wasm_exec/main.go +201 -0
- package/cmd/go_js_wasm_exec/main_test.go +83 -0
- package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript-wasm/main.go +38 -6
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/diagnostic.go +104 -12
- package/compiler/diagnostic_test.go +106 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +354 -44
- package/compiler/gotest/runner_test.go +293 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/index.test.ts +23 -0
- package/compiler/lowered-program.go +33 -24
- package/compiler/lowering.go +746 -194
- package/compiler/lowering_bench_test.go +42 -27
- package/compiler/lowering_internal_test.go +18 -0
- package/compiler/override-facts.go +15 -0
- package/compiler/override-parity-verifier.go +450 -0
- package/compiler/override-parity.go +122 -0
- package/compiler/override-registry_test.go +559 -0
- package/compiler/protobuf-ts-binding.go +567 -0
- package/compiler/protobuf-ts-binding_test.go +402 -0
- package/compiler/runtime-contract.go +4 -0
- package/compiler/runtime-contract_test.go +2 -0
- package/compiler/semantic-model-types.go +9 -4
- package/compiler/semantic-model.go +282 -70
- package/compiler/semantic-model_test.go +82 -1
- package/compiler/service.go +21 -1
- package/compiler/skeleton_test.go +118 -10
- package/compiler/typescript-emitter.go +128 -13
- package/compiler/wasm/compile_test.go +37 -4
- package/compiler/{wasm_api.go → wasm-api.go} +57 -7
- package/dist/gs/builtin/hostio.js +5 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +13 -2
- package/dist/gs/builtin/slice.js +187 -6
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +13 -5
- package/dist/gs/builtin/type.js +153 -60
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +11 -0
- package/dist/gs/builtin/varRef.js +57 -2
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +10 -3
- package/dist/gs/compress/zlib/index.js +50 -16
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/encoding/json/index.d.ts +114 -0
- package/dist/gs/encoding/json/index.js +544 -36
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +54 -30
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +2 -0
- package/dist/gs/go/scanner/index.js +29 -5
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.js +22 -6
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/index.d.ts +6 -0
- package/dist/gs/hash/index.js +20 -0
- package/dist/gs/hash/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.js +2 -2
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/goarch/index.d.ts +43 -3
- package/dist/gs/internal/goarch/index.js +42 -10
- package/dist/gs/internal/goarch/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js +26 -14
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js +4 -2
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +8 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.d.ts +2 -0
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +5 -0
- package/dist/gs/math/bits/index.js +16 -4
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.d.ts +16 -0
- package/dist/gs/mime/index.js +315 -6
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +12 -0
- package/dist/gs/net/http/httptest/index.js +85 -6
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +300 -5
- package/dist/gs/net/http/index.js +1598 -58
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +1 -1
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.d.ts +1 -0
- package/dist/gs/os/exec.gs.js +4 -8
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/index.d.ts +1 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/proc.gs.d.ts +4 -0
- package/dist/gs/os/proc.gs.js +12 -6
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +1 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/path.js +11 -7
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +5 -4
- package/dist/gs/reflect/index.js +4 -3
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +15 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +25 -6
- package/dist/gs/reflect/type.js +1475 -228
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +14 -6
- package/dist/gs/reflect/types.js +35 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +1 -0
- package/dist/gs/reflect/value.js +83 -41
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +4 -140
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +8 -2
- package/dist/gs/runtime/pprof/index.js +50 -30
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +5 -4
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js +5 -19
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/complex.gs.d.ts +3 -0
- package/dist/gs/strconv/complex.gs.js +148 -0
- package/dist/gs/strconv/complex.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +1 -0
- package/dist/gs/strconv/index.js +1 -0
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/builder.js +1 -1
- package/dist/gs/strings/reader.js +9 -5
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js +15 -7
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.d.ts +5 -0
- package/dist/gs/strings/strings.js +57 -5
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
- package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js +9 -9
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js +2 -2
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/testing/testing.js +55 -13
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.d.ts +24 -1
- package/dist/gs/time/time.js +43 -3
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unique/index.js +7 -1
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +3 -3
- package/go.sum +16 -0
- package/gs/builtin/hostio.test.ts +16 -0
- package/gs/builtin/hostio.ts +7 -0
- package/gs/builtin/runtime-contract.test.ts +246 -21
- package/gs/builtin/slice.ts +269 -24
- package/gs/builtin/type.ts +226 -59
- package/gs/builtin/varRef.ts +85 -2
- package/gs/bytes/buffer.gs.ts +1 -1
- package/gs/bytes/reader.gs.ts +1 -1
- package/gs/compress/zlib/index.test.ts +62 -1
- package/gs/compress/zlib/index.ts +53 -16
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/encoding/json/index.test.ts +360 -6
- package/gs/encoding/json/index.ts +679 -38
- package/gs/encoding/json/parity.json +81 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
- package/gs/github.com/pkg/errors/errors.ts +54 -30
- package/gs/go/scanner/index.test.ts +39 -56
- package/gs/go/scanner/index.ts +33 -5
- package/gs/go/scanner/parity.json +27 -0
- package/gs/go/token/index.ts +22 -6
- package/gs/hash/index.test.ts +20 -33
- package/gs/hash/index.ts +28 -0
- package/gs/hash/parity.json +21 -0
- package/gs/internal/byteorder/index.test.ts +2 -2
- package/gs/internal/byteorder/index.ts +2 -2
- package/gs/internal/goarch/index.test.ts +32 -0
- package/gs/internal/goarch/index.ts +45 -13
- package/gs/internal/goarch/parity.json +144 -0
- package/gs/io/fs/fs.ts +26 -14
- package/gs/io/fs/readdir.ts +4 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.ts +1 -0
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +23 -4
- package/gs/math/bits/parity.json +156 -0
- package/gs/mime/index.test.ts +90 -0
- package/gs/mime/index.ts +369 -6
- package/gs/mime/parity.json +36 -0
- package/gs/net/http/httptest/index.test.ts +98 -2
- package/gs/net/http/httptest/index.ts +101 -6
- package/gs/net/http/httptest/parity.json +15 -0
- package/gs/net/http/index.test.ts +781 -12
- package/gs/net/http/index.ts +1860 -139
- package/gs/net/http/meta.json +16 -1
- package/gs/net/http/parity.json +193 -0
- package/gs/os/dir_unix.gs.ts +1 -1
- package/gs/os/error.gs.ts +1 -1
- package/gs/os/exec.gs.ts +4 -8
- package/gs/os/exec_posix.gs.ts +1 -1
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/parity.json +9 -0
- package/gs/os/proc.gs.ts +18 -5
- package/gs/os/proc.test.ts +26 -0
- package/gs/os/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +1 -1
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/field.test.ts +37 -15
- package/gs/reflect/function-types.test.ts +518 -22
- package/gs/reflect/index.ts +8 -6
- package/gs/reflect/map.ts +20 -0
- package/gs/reflect/meta.json +6 -4
- package/gs/reflect/parity.json +234 -0
- package/gs/reflect/sliceat.test.ts +156 -0
- package/gs/reflect/structof.test.ts +401 -0
- package/gs/reflect/type.ts +1961 -317
- package/gs/reflect/typefor.test.ts +530 -10
- package/gs/reflect/types.ts +43 -18
- package/gs/reflect/value.ts +105 -45
- package/gs/reflect/visiblefields.ts +5 -168
- package/gs/runtime/parity.json +24 -0
- package/gs/runtime/pprof/index.test.ts +29 -7
- package/gs/runtime/pprof/index.ts +56 -30
- package/gs/runtime/pprof/parity.json +27 -0
- package/gs/runtime/runtime.test.ts +3 -1
- package/gs/runtime/runtime.ts +4 -3
- package/gs/runtime/trace/index.test.ts +5 -3
- package/gs/runtime/trace/index.ts +8 -20
- package/gs/runtime/trace/parity.json +36 -0
- package/gs/strconv/atoi.gs.ts +1 -1
- package/gs/strconv/complex.gs.ts +174 -0
- package/gs/strconv/complex.test.ts +65 -0
- package/gs/strconv/index.ts +1 -0
- package/gs/strconv/parity.json +120 -0
- package/gs/strings/builder.ts +1 -1
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.ts +9 -5
- package/gs/strings/replace.ts +15 -7
- package/gs/strings/strings.test.ts +22 -2
- package/gs/strings/strings.ts +64 -6
- package/gs/sync/atomic/doc_64.gs.ts +6 -7
- package/gs/sync/atomic/doc_64.test.ts +43 -0
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/syscall/env.ts +29 -14
- package/gs/testing/testing.test.ts +67 -0
- package/gs/testing/testing.ts +87 -19
- package/gs/time/parity.json +225 -0
- package/gs/time/time.test.ts +20 -2
- package/gs/time/time.ts +49 -7
- package/gs/unique/index.ts +7 -1
- package/package.json +4 -2
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
package/gs/testing/testing.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import * as nodeFS from 'node:fs'
|
|
2
|
-
import { tmpdir } from 'node:os'
|
|
3
|
-
import { join } from 'node:path'
|
|
4
|
-
|
|
5
1
|
import * as context from '@goscript/context/index.js'
|
|
6
2
|
|
|
7
3
|
export type TestFunc = (t: T) => void | Promise<void>
|
|
@@ -24,6 +20,18 @@ export type RunResult = {
|
|
|
24
20
|
skipped: number
|
|
25
21
|
}
|
|
26
22
|
|
|
23
|
+
interface HostProcess {
|
|
24
|
+
env?: Record<string, string | undefined>
|
|
25
|
+
cwd?: () => string
|
|
26
|
+
chdir?: (dir: string) => void
|
|
27
|
+
getBuiltinModule?: (name: string) => unknown
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface HostGlobal {
|
|
31
|
+
process?: HostProcess
|
|
32
|
+
require?: (name: string) => unknown
|
|
33
|
+
}
|
|
34
|
+
|
|
27
35
|
class TestControl extends Error {
|
|
28
36
|
public readonly kind: 'fatal' | 'skip'
|
|
29
37
|
|
|
@@ -127,6 +135,9 @@ export class T {
|
|
|
127
135
|
try {
|
|
128
136
|
await fn(child)
|
|
129
137
|
} catch (err) {
|
|
138
|
+
if (isProcessExitError(err)) {
|
|
139
|
+
throw err
|
|
140
|
+
}
|
|
130
141
|
if (err instanceof TestControl && err.kind === 'skip') {
|
|
131
142
|
// A skipped subtest is still a successful Run result.
|
|
132
143
|
} else {
|
|
@@ -139,6 +150,9 @@ export class T {
|
|
|
139
150
|
try {
|
|
140
151
|
await child.runCleanups()
|
|
141
152
|
} catch (err) {
|
|
153
|
+
if (isProcessExitError(err)) {
|
|
154
|
+
throw err
|
|
155
|
+
}
|
|
142
156
|
child.Fail()
|
|
143
157
|
if (!(err instanceof TestControl)) {
|
|
144
158
|
child.Log(formatValue(err))
|
|
@@ -153,9 +167,21 @@ export class T {
|
|
|
153
167
|
}
|
|
154
168
|
|
|
155
169
|
public TempDir(): string {
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
170
|
+
const fs = requireHostModule<{
|
|
171
|
+
mkdtempSync(prefix: string): string
|
|
172
|
+
rmSync(path: string, opts: { force: boolean; recursive: boolean }): void
|
|
173
|
+
}>('node:fs', 'testing.TempDir')
|
|
174
|
+
const os = requireHostModule<{ tmpdir(): string }>(
|
|
175
|
+
'node:os',
|
|
176
|
+
'testing.TempDir',
|
|
177
|
+
)
|
|
178
|
+
const pathMod = requireHostModule<{ join(...parts: string[]): string }>(
|
|
179
|
+
'node:path',
|
|
180
|
+
'testing.TempDir',
|
|
181
|
+
)
|
|
182
|
+
const path = fs.mkdtempSync(
|
|
183
|
+
pathMod.join(
|
|
184
|
+
os.tmpdir(),
|
|
159
185
|
'goscript-test-' +
|
|
160
186
|
this.testName.replace(/[^A-Za-z0-9_.-]/g, '_') +
|
|
161
187
|
'-' +
|
|
@@ -164,7 +190,7 @@ export class T {
|
|
|
164
190
|
)
|
|
165
191
|
this.tempDirs.push(path)
|
|
166
192
|
this.Cleanup(() => {
|
|
167
|
-
|
|
193
|
+
fs.rmSync(path, { force: true, recursive: true })
|
|
168
194
|
})
|
|
169
195
|
return path
|
|
170
196
|
}
|
|
@@ -172,12 +198,9 @@ export class T {
|
|
|
172
198
|
public Parallel(): void {}
|
|
173
199
|
|
|
174
200
|
public Setenv(key: string, value: string): void {
|
|
175
|
-
const
|
|
176
|
-
| { env?: Record<string, string | undefined> }
|
|
177
|
-
| undefined
|
|
178
|
-
const env = proc?.env
|
|
201
|
+
const env = (globalThis as HostGlobal).process?.env
|
|
179
202
|
if (env === undefined) {
|
|
180
|
-
|
|
203
|
+
throw new Error('testing.Setenv is not supported without a host process')
|
|
181
204
|
}
|
|
182
205
|
const oldValue = env[key]
|
|
183
206
|
env[key] = value
|
|
@@ -191,11 +214,9 @@ export class T {
|
|
|
191
214
|
}
|
|
192
215
|
|
|
193
216
|
public Chdir(dir: string): void {
|
|
194
|
-
const proc = (globalThis as
|
|
195
|
-
| { cwd?: () => string; chdir?: (dir: string) => void }
|
|
196
|
-
| undefined
|
|
217
|
+
const proc = (globalThis as HostGlobal).process
|
|
197
218
|
if (proc?.cwd === undefined || proc.chdir === undefined) {
|
|
198
|
-
|
|
219
|
+
throw new Error('testing.Chdir is not supported without a host process')
|
|
199
220
|
}
|
|
200
221
|
const oldDir = proc.cwd()
|
|
201
222
|
proc.chdir(dir)
|
|
@@ -249,6 +270,9 @@ export class B extends T {
|
|
|
249
270
|
try {
|
|
250
271
|
await fn(child)
|
|
251
272
|
} catch (err) {
|
|
273
|
+
if (isProcessExitError(err)) {
|
|
274
|
+
throw err
|
|
275
|
+
}
|
|
252
276
|
child.Error(err)
|
|
253
277
|
}
|
|
254
278
|
if (child.Failed()) {
|
|
@@ -328,6 +352,9 @@ export async function runTests(
|
|
|
328
352
|
try {
|
|
329
353
|
await test.fn(t)
|
|
330
354
|
} catch (err) {
|
|
355
|
+
if (isProcessExitError(err)) {
|
|
356
|
+
throw err
|
|
357
|
+
}
|
|
331
358
|
if (err instanceof TestControl && err.kind === 'skip') {
|
|
332
359
|
skipped++
|
|
333
360
|
} else {
|
|
@@ -336,9 +363,8 @@ export async function runTests(
|
|
|
336
363
|
t.Log(formatValue(err))
|
|
337
364
|
}
|
|
338
365
|
}
|
|
339
|
-
} finally {
|
|
340
|
-
await t.runCleanups()
|
|
341
366
|
}
|
|
367
|
+
await t.runCleanups()
|
|
342
368
|
const elapsed = ((Date.now() - start) / 1000).toFixed(2)
|
|
343
369
|
if (t.Skipped()) {
|
|
344
370
|
if (options.verbose) {
|
|
@@ -383,6 +409,48 @@ function formatMessage(format: string, args: unknown[]): string {
|
|
|
383
409
|
})
|
|
384
410
|
}
|
|
385
411
|
|
|
412
|
+
function requireHostModule<T>(name: string, api: string): T {
|
|
413
|
+
const fromProcess = (globalThis as HostGlobal).process?.getBuiltinModule?.(
|
|
414
|
+
name,
|
|
415
|
+
)
|
|
416
|
+
if (fromProcess !== undefined && fromProcess !== null) {
|
|
417
|
+
return fromProcess as T
|
|
418
|
+
}
|
|
419
|
+
const req = hostRequire()
|
|
420
|
+
if (req !== undefined) {
|
|
421
|
+
return req(name) as T
|
|
422
|
+
}
|
|
423
|
+
throw new Error(
|
|
424
|
+
api + ' is not supported without Node-compatible host modules',
|
|
425
|
+
)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function hostRequire(): ((name: string) => unknown) | undefined {
|
|
429
|
+
const globalRequire = (globalThis as HostGlobal).require
|
|
430
|
+
if (typeof globalRequire === 'function') {
|
|
431
|
+
return globalRequire
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
const req = eval(
|
|
435
|
+
'typeof require === "function" ? require : undefined',
|
|
436
|
+
) as unknown
|
|
437
|
+
if (typeof req === 'function') {
|
|
438
|
+
return req as (name: string) => unknown
|
|
439
|
+
}
|
|
440
|
+
} catch {
|
|
441
|
+
return undefined
|
|
442
|
+
}
|
|
443
|
+
return undefined
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function isProcessExitError(err: unknown): boolean {
|
|
447
|
+
if (err === null || typeof err !== 'object') {
|
|
448
|
+
return false
|
|
449
|
+
}
|
|
450
|
+
const code = (err as { __goscriptExitCode?: unknown }).__goscriptExitCode
|
|
451
|
+
return typeof code === 'number'
|
|
452
|
+
}
|
|
453
|
+
|
|
386
454
|
function formatValue(value: unknown): string {
|
|
387
455
|
if (value instanceof Error) {
|
|
388
456
|
return value.message
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"strict": true,
|
|
4
|
+
"symbols": {
|
|
5
|
+
"After": {
|
|
6
|
+
"status": "real"
|
|
7
|
+
},
|
|
8
|
+
"AfterFunc": {
|
|
9
|
+
"status": "real"
|
|
10
|
+
},
|
|
11
|
+
"ANSIC": {
|
|
12
|
+
"status": "real"
|
|
13
|
+
},
|
|
14
|
+
"April": {
|
|
15
|
+
"status": "real"
|
|
16
|
+
},
|
|
17
|
+
"August": {
|
|
18
|
+
"status": "real"
|
|
19
|
+
},
|
|
20
|
+
"Date": {
|
|
21
|
+
"status": "real"
|
|
22
|
+
},
|
|
23
|
+
"DateOnly": {
|
|
24
|
+
"status": "real"
|
|
25
|
+
},
|
|
26
|
+
"DateTime": {
|
|
27
|
+
"status": "real"
|
|
28
|
+
},
|
|
29
|
+
"December": {
|
|
30
|
+
"status": "real"
|
|
31
|
+
},
|
|
32
|
+
"Duration": {
|
|
33
|
+
"status": "real"
|
|
34
|
+
},
|
|
35
|
+
"February": {
|
|
36
|
+
"status": "real"
|
|
37
|
+
},
|
|
38
|
+
"FixedZone": {
|
|
39
|
+
"status": "real"
|
|
40
|
+
},
|
|
41
|
+
"Friday": {
|
|
42
|
+
"status": "real"
|
|
43
|
+
},
|
|
44
|
+
"Hour": {
|
|
45
|
+
"status": "real"
|
|
46
|
+
},
|
|
47
|
+
"January": {
|
|
48
|
+
"status": "real"
|
|
49
|
+
},
|
|
50
|
+
"July": {
|
|
51
|
+
"status": "real"
|
|
52
|
+
},
|
|
53
|
+
"June": {
|
|
54
|
+
"status": "real"
|
|
55
|
+
},
|
|
56
|
+
"Kitchen": {
|
|
57
|
+
"status": "real"
|
|
58
|
+
},
|
|
59
|
+
"Layout": {
|
|
60
|
+
"status": "real"
|
|
61
|
+
},
|
|
62
|
+
"LoadLocation": {
|
|
63
|
+
"status": "real"
|
|
64
|
+
},
|
|
65
|
+
"LoadLocationFromTZData": {
|
|
66
|
+
"status": "real"
|
|
67
|
+
},
|
|
68
|
+
"Local": {
|
|
69
|
+
"status": "real"
|
|
70
|
+
},
|
|
71
|
+
"Location": {
|
|
72
|
+
"status": "real"
|
|
73
|
+
},
|
|
74
|
+
"March": {
|
|
75
|
+
"status": "real"
|
|
76
|
+
},
|
|
77
|
+
"May": {
|
|
78
|
+
"status": "real"
|
|
79
|
+
},
|
|
80
|
+
"Microsecond": {
|
|
81
|
+
"status": "real"
|
|
82
|
+
},
|
|
83
|
+
"Millisecond": {
|
|
84
|
+
"status": "real"
|
|
85
|
+
},
|
|
86
|
+
"Minute": {
|
|
87
|
+
"status": "real"
|
|
88
|
+
},
|
|
89
|
+
"Monday": {
|
|
90
|
+
"status": "real"
|
|
91
|
+
},
|
|
92
|
+
"Month": {
|
|
93
|
+
"status": "real"
|
|
94
|
+
},
|
|
95
|
+
"Nanosecond": {
|
|
96
|
+
"status": "real"
|
|
97
|
+
},
|
|
98
|
+
"NewTicker": {
|
|
99
|
+
"status": "real"
|
|
100
|
+
},
|
|
101
|
+
"NewTimer": {
|
|
102
|
+
"status": "real"
|
|
103
|
+
},
|
|
104
|
+
"November": {
|
|
105
|
+
"status": "real"
|
|
106
|
+
},
|
|
107
|
+
"Now": {
|
|
108
|
+
"status": "real"
|
|
109
|
+
},
|
|
110
|
+
"October": {
|
|
111
|
+
"status": "real"
|
|
112
|
+
},
|
|
113
|
+
"Parse": {
|
|
114
|
+
"status": "real"
|
|
115
|
+
},
|
|
116
|
+
"ParseDuration": {
|
|
117
|
+
"status": "real"
|
|
118
|
+
},
|
|
119
|
+
"ParseError": {
|
|
120
|
+
"status": "real"
|
|
121
|
+
},
|
|
122
|
+
"ParseInLocation": {
|
|
123
|
+
"status": "real"
|
|
124
|
+
},
|
|
125
|
+
"RFC1123": {
|
|
126
|
+
"status": "real"
|
|
127
|
+
},
|
|
128
|
+
"RFC1123Z": {
|
|
129
|
+
"status": "real"
|
|
130
|
+
},
|
|
131
|
+
"RFC3339": {
|
|
132
|
+
"status": "real"
|
|
133
|
+
},
|
|
134
|
+
"RFC3339Nano": {
|
|
135
|
+
"status": "real"
|
|
136
|
+
},
|
|
137
|
+
"RFC822": {
|
|
138
|
+
"status": "real"
|
|
139
|
+
},
|
|
140
|
+
"RFC822Z": {
|
|
141
|
+
"status": "real"
|
|
142
|
+
},
|
|
143
|
+
"RFC850": {
|
|
144
|
+
"status": "real"
|
|
145
|
+
},
|
|
146
|
+
"RubyDate": {
|
|
147
|
+
"status": "real"
|
|
148
|
+
},
|
|
149
|
+
"Saturday": {
|
|
150
|
+
"status": "real"
|
|
151
|
+
},
|
|
152
|
+
"Second": {
|
|
153
|
+
"status": "real"
|
|
154
|
+
},
|
|
155
|
+
"September": {
|
|
156
|
+
"status": "real"
|
|
157
|
+
},
|
|
158
|
+
"Since": {
|
|
159
|
+
"status": "real"
|
|
160
|
+
},
|
|
161
|
+
"Sleep": {
|
|
162
|
+
"status": "real"
|
|
163
|
+
},
|
|
164
|
+
"Stamp": {
|
|
165
|
+
"status": "real"
|
|
166
|
+
},
|
|
167
|
+
"StampMicro": {
|
|
168
|
+
"status": "real"
|
|
169
|
+
},
|
|
170
|
+
"StampMilli": {
|
|
171
|
+
"status": "real"
|
|
172
|
+
},
|
|
173
|
+
"StampNano": {
|
|
174
|
+
"status": "real"
|
|
175
|
+
},
|
|
176
|
+
"Sunday": {
|
|
177
|
+
"status": "real"
|
|
178
|
+
},
|
|
179
|
+
"Thursday": {
|
|
180
|
+
"status": "real"
|
|
181
|
+
},
|
|
182
|
+
"Tick": {
|
|
183
|
+
"status": "real"
|
|
184
|
+
},
|
|
185
|
+
"Ticker": {
|
|
186
|
+
"status": "real"
|
|
187
|
+
},
|
|
188
|
+
"Time": {
|
|
189
|
+
"status": "real"
|
|
190
|
+
},
|
|
191
|
+
"TimeOnly": {
|
|
192
|
+
"status": "real"
|
|
193
|
+
},
|
|
194
|
+
"Timer": {
|
|
195
|
+
"status": "real"
|
|
196
|
+
},
|
|
197
|
+
"Tuesday": {
|
|
198
|
+
"status": "real"
|
|
199
|
+
},
|
|
200
|
+
"Unix": {
|
|
201
|
+
"status": "real"
|
|
202
|
+
},
|
|
203
|
+
"UnixDate": {
|
|
204
|
+
"status": "real"
|
|
205
|
+
},
|
|
206
|
+
"UnixMicro": {
|
|
207
|
+
"status": "real"
|
|
208
|
+
},
|
|
209
|
+
"UnixMilli": {
|
|
210
|
+
"status": "real"
|
|
211
|
+
},
|
|
212
|
+
"Until": {
|
|
213
|
+
"status": "real"
|
|
214
|
+
},
|
|
215
|
+
"UTC": {
|
|
216
|
+
"status": "real"
|
|
217
|
+
},
|
|
218
|
+
"Wednesday": {
|
|
219
|
+
"status": "real"
|
|
220
|
+
},
|
|
221
|
+
"Weekday": {
|
|
222
|
+
"status": "real"
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
package/gs/time/time.test.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { describe, expect, it } from 'vitest'
|
|
|
3
3
|
import * as $ from '@goscript/builtin/index.js'
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
+
ANSIC,
|
|
6
7
|
Duration_Abs,
|
|
7
8
|
Duration_Hours,
|
|
8
9
|
Duration_Microseconds,
|
|
@@ -14,14 +15,22 @@ import {
|
|
|
14
15
|
Duration_String,
|
|
15
16
|
Duration_Truncate,
|
|
16
17
|
FixedZone,
|
|
18
|
+
Friday,
|
|
17
19
|
January,
|
|
20
|
+
Kitchen,
|
|
21
|
+
Local,
|
|
18
22
|
Microsecond,
|
|
19
23
|
Millisecond,
|
|
20
24
|
Minute,
|
|
25
|
+
Month_String,
|
|
21
26
|
NewTicker,
|
|
22
27
|
NewTimer,
|
|
28
|
+
RFC1123,
|
|
23
29
|
RFC3339Nano,
|
|
30
|
+
Saturday,
|
|
24
31
|
Second,
|
|
32
|
+
StampMicro,
|
|
33
|
+
Sunday,
|
|
25
34
|
Date,
|
|
26
35
|
May,
|
|
27
36
|
RFC3339,
|
|
@@ -67,12 +76,21 @@ describe('time.Duration methods', () => {
|
|
|
67
76
|
})
|
|
68
77
|
|
|
69
78
|
describe('time constants and timers', () => {
|
|
70
|
-
it('exports
|
|
79
|
+
it('exports layout and location constants', () => {
|
|
80
|
+
expect(ANSIC).toBe('Mon Jan _2 15:04:05 2006')
|
|
81
|
+
expect(RFC1123).toBe('Mon, 02 Jan 2006 15:04:05 MST')
|
|
71
82
|
expect(RFC3339Nano).toBe('2006-01-02T15:04:05.999999999Z07:00')
|
|
83
|
+
expect(Kitchen).toBe('3:04PM')
|
|
84
|
+
expect(StampMicro).toBe('Jan _2 15:04:05.000000')
|
|
85
|
+
expect(Local.String()).toBe('Local')
|
|
72
86
|
})
|
|
73
87
|
|
|
74
|
-
it('exports month constants directly', () => {
|
|
88
|
+
it('exports month and weekday constants directly', () => {
|
|
75
89
|
expect(January).toBe(1)
|
|
90
|
+
expect(Month_String(May)).toBe('May')
|
|
91
|
+
expect(Sunday).toBe(0)
|
|
92
|
+
expect(Friday).toBe(5)
|
|
93
|
+
expect(Saturday).toBe(6)
|
|
76
94
|
})
|
|
77
95
|
|
|
78
96
|
it('delivers NewTimer values on C', async () => {
|
package/gs/time/time.ts
CHANGED
|
@@ -877,6 +877,25 @@ export function WeekdayString(w: Weekday): string {
|
|
|
877
877
|
return names[w] || 'Unknown'
|
|
878
878
|
}
|
|
879
879
|
|
|
880
|
+
export function Month_String(m: Month): string {
|
|
881
|
+
const names = [
|
|
882
|
+
'',
|
|
883
|
+
'January',
|
|
884
|
+
'February',
|
|
885
|
+
'March',
|
|
886
|
+
'April',
|
|
887
|
+
'May',
|
|
888
|
+
'June',
|
|
889
|
+
'July',
|
|
890
|
+
'August',
|
|
891
|
+
'September',
|
|
892
|
+
'October',
|
|
893
|
+
'November',
|
|
894
|
+
'December',
|
|
895
|
+
]
|
|
896
|
+
return names[m] || `%!Month(${m})`
|
|
897
|
+
}
|
|
898
|
+
|
|
880
899
|
// Weekday_String returns the string representation of a Weekday (wrapper function naming)
|
|
881
900
|
export function Weekday_String(w: Weekday): string {
|
|
882
901
|
return WeekdayString(w)
|
|
@@ -909,7 +928,7 @@ export class ParseError extends Error {
|
|
|
909
928
|
|
|
910
929
|
// Timer represents a single event timer
|
|
911
930
|
export class Timer {
|
|
912
|
-
private _timeout:
|
|
931
|
+
private _timeout: ReturnType<typeof setTimeout>
|
|
913
932
|
private _duration: Duration
|
|
914
933
|
private _callback?: () => void
|
|
915
934
|
private _channel = makeChannel(1, new Time(), 'both')
|
|
@@ -939,7 +958,7 @@ export class Timer {
|
|
|
939
958
|
return true
|
|
940
959
|
}
|
|
941
960
|
|
|
942
|
-
private start(d: Duration):
|
|
961
|
+
private start(d: Duration): ReturnType<typeof setTimeout> {
|
|
943
962
|
const ms = timeoutMilliseconds(d)
|
|
944
963
|
if (this._callback) {
|
|
945
964
|
return setTimeout(this._callback, ms)
|
|
@@ -952,7 +971,7 @@ export class Timer {
|
|
|
952
971
|
|
|
953
972
|
// Ticker holds a channel that delivers ticks at intervals
|
|
954
973
|
export class Ticker {
|
|
955
|
-
private _interval:
|
|
974
|
+
private _interval: ReturnType<typeof setInterval>
|
|
956
975
|
private _duration: Duration
|
|
957
976
|
private _stopped: boolean = false
|
|
958
977
|
private _channel = makeChannel(1, new Time(), 'both')
|
|
@@ -988,7 +1007,7 @@ export class Ticker {
|
|
|
988
1007
|
}
|
|
989
1008
|
}
|
|
990
1009
|
|
|
991
|
-
private start(d: Duration):
|
|
1010
|
+
private start(d: Duration): ReturnType<typeof setInterval> {
|
|
992
1011
|
const ms = timeoutMilliseconds(d)
|
|
993
1012
|
return setInterval(() => {
|
|
994
1013
|
this._channel.send(Now()).catch(() => {})
|
|
@@ -1058,6 +1077,7 @@ export function Date(
|
|
|
1058
1077
|
|
|
1059
1078
|
// Common locations
|
|
1060
1079
|
export const UTC = new Location('UTC', 0)
|
|
1080
|
+
export const Local = new Location('Local')
|
|
1061
1081
|
|
|
1062
1082
|
// FixedZone returns a Location that always uses the given zone name and offset (seconds east of UTC)
|
|
1063
1083
|
export function FixedZone(name: string, offset: number): Location {
|
|
@@ -1104,12 +1124,35 @@ export const October = Month.October
|
|
|
1104
1124
|
export const November = Month.November
|
|
1105
1125
|
export const December = Month.December
|
|
1106
1126
|
|
|
1127
|
+
// Export weekday constants
|
|
1128
|
+
export const Sunday = Weekday.Sunday
|
|
1129
|
+
export const Monday = Weekday.Monday
|
|
1130
|
+
export const Tuesday = Weekday.Tuesday
|
|
1131
|
+
export const Wednesday = Weekday.Wednesday
|
|
1132
|
+
export const Thursday = Weekday.Thursday
|
|
1133
|
+
export const Friday = Weekday.Friday
|
|
1134
|
+
export const Saturday = Weekday.Saturday
|
|
1135
|
+
|
|
1107
1136
|
// Time layout constants (matching Go's time package)
|
|
1108
|
-
export const DateTime = '2006-01-02 15:04:05'
|
|
1109
1137
|
export const Layout = "01/02 03:04:05PM '06 -0700"
|
|
1138
|
+
export const ANSIC = 'Mon Jan _2 15:04:05 2006'
|
|
1139
|
+
export const UnixDate = 'Mon Jan _2 15:04:05 MST 2006'
|
|
1140
|
+
export const RubyDate = 'Mon Jan 02 15:04:05 -0700 2006'
|
|
1141
|
+
export const RFC822 = '02 Jan 06 15:04 MST'
|
|
1142
|
+
export const RFC822Z = '02 Jan 06 15:04 -0700'
|
|
1143
|
+
export const RFC850 = 'Monday, 02-Jan-06 15:04:05 MST'
|
|
1144
|
+
export const RFC1123 = 'Mon, 02 Jan 2006 15:04:05 MST'
|
|
1145
|
+
export const RFC1123Z = 'Mon, 02 Jan 2006 15:04:05 -0700'
|
|
1110
1146
|
export const RFC3339 = '2006-01-02T15:04:05Z07:00'
|
|
1111
1147
|
export const RFC3339Nano = '2006-01-02T15:04:05.999999999Z07:00'
|
|
1112
1148
|
export const Kitchen = '3:04PM'
|
|
1149
|
+
export const Stamp = 'Jan _2 15:04:05'
|
|
1150
|
+
export const StampMilli = 'Jan _2 15:04:05.000'
|
|
1151
|
+
export const StampMicro = 'Jan _2 15:04:05.000000'
|
|
1152
|
+
export const StampNano = 'Jan _2 15:04:05.000000000'
|
|
1153
|
+
export const DateTime = '2006-01-02 15:04:05'
|
|
1154
|
+
export const DateOnly = '2006-01-02'
|
|
1155
|
+
export const TimeOnly = '15:04:05'
|
|
1113
1156
|
|
|
1114
1157
|
// Unix returns the local Time corresponding to the given Unix time,
|
|
1115
1158
|
// sec seconds and nsec nanoseconds since January 1, 1970 UTC
|
|
@@ -1298,8 +1341,7 @@ export function LoadLocation(name: string): Location {
|
|
|
1298
1341
|
case 'UTC':
|
|
1299
1342
|
return UTC
|
|
1300
1343
|
case 'Local':
|
|
1301
|
-
|
|
1302
|
-
return new Location('Local')
|
|
1344
|
+
return Local
|
|
1303
1345
|
default:
|
|
1304
1346
|
throw new Error(`time: unknown time zone ${name}`)
|
|
1305
1347
|
}
|
package/gs/unique/index.ts
CHANGED
|
@@ -26,7 +26,13 @@ export class Handle<T = any> {
|
|
|
26
26
|
new Handle(),
|
|
27
27
|
[{ name: 'Value', args: [], returns: [] }],
|
|
28
28
|
Handle,
|
|
29
|
-
|
|
29
|
+
[
|
|
30
|
+
{
|
|
31
|
+
name: 'value',
|
|
32
|
+
key: 'value',
|
|
33
|
+
type: { kind: $.TypeKind.Interface, methods: [] },
|
|
34
|
+
},
|
|
35
|
+
],
|
|
30
36
|
)
|
|
31
37
|
}
|
|
32
38
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "goscript",
|
|
3
3
|
"description": "Go to TypeScript transpiler",
|
|
4
|
-
"version": "0.1
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Aperture Robotics LLC.",
|
|
7
7
|
"email": "support@aperture.us",
|
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
"example": "cd ./example/simple && bash run.bash",
|
|
49
49
|
"test": "bun run test:go && bun run test:js",
|
|
50
50
|
"test:go": "go test ./...",
|
|
51
|
+
"test:go:browser": "go run ./cmd/goscript test --browser --timeout 1m --dir compiler/gotest/testdata/browserapi --run TestBrowserAPI .",
|
|
52
|
+
"test:go:browser:shim": "mkdir -p .tmp/bin && go build -o .tmp/bin/go_js_wasm_exec ./cmd/go_js_wasm_exec && sh -c 'exec_path=\"$PWD/.tmp/bin/go_js_wasm_exec\"; cd compiler/gotest/testdata/browserapi && GOOS=js GOARCH=wasm go test -exec \"$exec_path\" -run TestBrowserAPI -count=1'",
|
|
51
53
|
"test:js": "bun run typecheck && vitest run",
|
|
52
54
|
"test:browser": "bun run scripts/generate-browser-tests.ts && vitest run --config vitest.browser.config.ts",
|
|
53
55
|
"test:browser:ui": "bun run scripts/generate-browser-tests.ts && vitest --config vitest.browser.config.ts --ui",
|
|
@@ -106,7 +108,7 @@
|
|
|
106
108
|
"husky": "^9.1.7",
|
|
107
109
|
"lint-staged": "^17.0.0",
|
|
108
110
|
"prettier": "^3.8.1",
|
|
109
|
-
"starpc": "0.49.
|
|
111
|
+
"starpc": "0.49.16",
|
|
110
112
|
"typescript": "^6.0.0",
|
|
111
113
|
"typescript-eslint": "^8.58.0",
|
|
112
114
|
"vitest": "^4.1.2"
|