goscript 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +267 -255
- package/cmd/goscript/cmd-test.go +193 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +2 -0
- package/compiler/compliance_test.go +0 -8
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +67 -0
- package/compiler/gotest/request.go +145 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +588 -0
- package/compiler/gotest/runner_test.go +627 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +71 -19
- package/compiler/lowering.go +5065 -569
- package/compiler/override-facts.go +307 -0
- package/compiler/override-registry.go +50 -189
- package/compiler/override-registry_test.go +47 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +37 -2
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +105 -0
- package/compiler/package-test-graph.go +117 -0
- package/compiler/package-test-graph_test.go +144 -0
- package/compiler/runtime-contract.go +189 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +9 -6
- package/compiler/semantic-model.go +538 -38
- package/compiler/semantic-model_test.go +55 -0
- package/compiler/service.go +1 -1
- package/compiler/skeleton_test.go +679 -49
- package/compiler/tsworkspace/owner.go +334 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/typescript-emitter.go +459 -82
- package/compiler/wasm/compile.go +1 -1
- package/compiler/wasm/compile_test.go +61 -11
- package/compiler/wasm_api.go +172 -7
- package/dist/gs/builtin/builtin.d.ts +20 -2
- package/dist/gs/builtin/builtin.js +194 -6
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +8 -0
- package/dist/gs/builtin/channel.js +12 -0
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +22 -2
- package/dist/gs/builtin/slice.js +216 -44
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +5 -2
- package/dist/gs/builtin/type.js +83 -24
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +5 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +48 -44
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/context/context.d.ts +5 -4
- package/dist/gs/context/context.js +10 -10
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- package/dist/gs/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +1 -0
- package/dist/gs/encoding/json/index.js +18 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +81 -0
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +35 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +211 -1
- 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 +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +13 -0
- package/dist/gs/go/scanner/index.js +35 -0
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.d.ts +156 -0
- package/dist/gs/go/token/index.js +500 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +64 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +3 -3
- package/dist/gs/maps/iter.js +3 -3
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +2 -2
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +66 -34
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +50 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +11 -0
- package/dist/gs/net/http/httptest/index.js +21 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +27 -0
- package/dist/gs/net/http/index.js +61 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +3 -1
- package/dist/gs/path/filepath/path.js +133 -4
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +1 -1
- package/dist/gs/reflect/index.js +1 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +3 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +7 -4
- package/dist/gs/reflect/type.js +148 -7
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +2 -0
- package/dist/gs/runtime/debug/index.js +8 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/slices/slices.d.ts +24 -5
- package/dist/gs/slices/slices.js +214 -5
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +3 -3
- package/dist/gs/sort/slice.gs.js +6 -6
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +3 -2
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +2 -0
- package/dist/gs/sync/sync.js +27 -0
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +2 -0
- package/dist/gs/syscall/errors.js +8 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +43 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +375 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +22 -0
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +77 -0
- package/dist/gs/testing/testing.js +301 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +205 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +71 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.sum +9 -0
- package/gs/builtin/builtin.ts +239 -8
- package/gs/builtin/channel.ts +22 -0
- package/gs/builtin/runtime-contract.test.ts +126 -0
- package/gs/builtin/slice.ts +259 -50
- package/gs/builtin/type.ts +109 -34
- package/gs/builtin/varRef.ts +38 -1
- package/gs/bytes/buffer.gs.ts +48 -44
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/context/context.test.ts +41 -0
- package/gs/context/context.ts +22 -26
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +15 -1
- package/gs/encoding/json/index.ts +24 -0
- package/gs/errors/errors.test.ts +82 -0
- package/gs/errors/errors.ts +104 -0
- package/gs/fmt/fmt.ts +56 -16
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +73 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +297 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +22 -0
- package/gs/go/scanner/index.ts +47 -0
- package/gs/go/token/index.test.ts +47 -1
- package/gs/go/token/index.ts +570 -4
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +77 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +9 -9
- package/gs/io/io.ts +174 -31
- package/gs/io/meta.json +10 -2
- package/gs/maps/iter.ts +12 -6
- package/gs/maps/maps.ts +8 -6
- package/gs/math/bits/index.ts +103 -47
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +54 -0
- package/gs/net/http/httptest/index.ts +25 -0
- package/gs/net/http/index.test.ts +20 -0
- package/gs/net/http/index.ts +81 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/types_js.gs.ts +2 -2
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +178 -3
- package/gs/path/filepath/path.test.ts +25 -0
- package/gs/path/filepath/path.ts +159 -5
- package/gs/path/path.ts +20 -5
- package/gs/reflect/index.ts +1 -0
- package/gs/reflect/map.test.ts +19 -0
- package/gs/reflect/map.ts +4 -0
- package/gs/reflect/type.ts +197 -17
- package/gs/runtime/debug/index.test.ts +24 -0
- package/gs/runtime/debug/index.ts +8 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/slices/slices.test.ts +94 -0
- package/gs/slices/slices.ts +245 -5
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +16 -7
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.ts +4 -3
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +13 -1
- package/gs/sync/sync.ts +27 -0
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +10 -0
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +458 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +85 -0
- package/gs/syscall/types.ts +56 -0
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +90 -0
- package/gs/testing/testing.ts +382 -0
- package/gs/time/time.test.ts +106 -0
- package/gs/time/time.ts +278 -57
- package/gs/unicode/unicode.test.ts +25 -0
- package/gs/unicode/unicode.ts +119 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +91 -0
- package/package.json +2 -1
package/gs/math/const.gs.ts
CHANGED
|
@@ -47,10 +47,10 @@ export let SmallestNonzeroFloat64: number = Number.MIN_VALUE
|
|
|
47
47
|
let intSize: number = (32 << ((~(0 as number) >> 63)))
|
|
48
48
|
|
|
49
49
|
// MaxInt32 or MaxInt64 depending on intSize.
|
|
50
|
-
export let MaxInt:
|
|
50
|
+
export let MaxInt: number = 9223372036854775807
|
|
51
51
|
|
|
52
52
|
// MinInt32 or MinInt64 depending on intSize.
|
|
53
|
-
export let MinInt:
|
|
53
|
+
export let MinInt: number = -9223372036854775808
|
|
54
54
|
|
|
55
55
|
// 127
|
|
56
56
|
export let MaxInt8: number = 127
|
|
@@ -71,10 +71,10 @@ export let MaxInt32: number = 2147483647
|
|
|
71
71
|
export let MinInt32: number = -2147483648
|
|
72
72
|
|
|
73
73
|
// 9223372036854775807
|
|
74
|
-
export let MaxInt64:
|
|
74
|
+
export let MaxInt64: number = 9223372036854775807
|
|
75
75
|
|
|
76
76
|
// -9223372036854775808
|
|
77
|
-
export let MinInt64:
|
|
77
|
+
export let MinInt64: number = -9223372036854775808
|
|
78
78
|
|
|
79
79
|
// MaxUint32 or MaxUint64 depending on intSize.
|
|
80
80
|
export let MaxUint: bigint = 0xFFFFFFFFFFFFFFFFn
|
|
@@ -89,5 +89,4 @@ export let MaxUint16: number = 65535
|
|
|
89
89
|
export let MaxUint32: number = 4294967295
|
|
90
90
|
|
|
91
91
|
// 18446744073709551615
|
|
92
|
-
export let MaxUint64: bigint = 0xFFFFFFFFFFFFFFFFn
|
|
93
|
-
|
|
92
|
+
export let MaxUint64: number | bigint = 0xFFFFFFFFFFFFFFFFn
|
package/gs/mime/index.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function FormatMediaType(t: string, param: Map<string, string> | Record<string, string> | null): string {
|
|
2
|
+
if (!isToken(t)) {
|
|
3
|
+
return ''
|
|
4
|
+
}
|
|
5
|
+
let out = t
|
|
6
|
+
const entries = param instanceof Map ? Array.from(param.entries()) : Object.entries(param ?? {})
|
|
7
|
+
entries.sort(([a], [b]) => a.localeCompare(b))
|
|
8
|
+
for (const [key, value] of entries) {
|
|
9
|
+
if (!isToken(key)) {
|
|
10
|
+
return ''
|
|
11
|
+
}
|
|
12
|
+
out += formatParam(key, String(value))
|
|
13
|
+
}
|
|
14
|
+
return out
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function formatParam(key: string, value: string): string {
|
|
18
|
+
if (isToken(value)) {
|
|
19
|
+
return `; ${key}=${value}`
|
|
20
|
+
}
|
|
21
|
+
return `; ${key}*=utf-8''${percentEncode(value)}`
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isToken(value: string): boolean {
|
|
25
|
+
return /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(value)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function percentEncode(value: string): string {
|
|
29
|
+
let out = ''
|
|
30
|
+
for (const byte of new TextEncoder().encode(value)) {
|
|
31
|
+
if (
|
|
32
|
+
(byte >= 0x30 && byte <= 0x39) ||
|
|
33
|
+
(byte >= 0x41 && byte <= 0x5a) ||
|
|
34
|
+
(byte >= 0x61 && byte <= 0x7a) ||
|
|
35
|
+
byte === 0x21 ||
|
|
36
|
+
byte === 0x23 ||
|
|
37
|
+
byte === 0x24 ||
|
|
38
|
+
byte === 0x26 ||
|
|
39
|
+
byte === 0x2b ||
|
|
40
|
+
byte === 0x2d ||
|
|
41
|
+
byte === 0x2e ||
|
|
42
|
+
byte === 0x5e ||
|
|
43
|
+
byte === 0x5f ||
|
|
44
|
+
byte === 0x60 ||
|
|
45
|
+
byte === 0x7c ||
|
|
46
|
+
byte === 0x7e
|
|
47
|
+
) {
|
|
48
|
+
out += String.fromCharCode(byte)
|
|
49
|
+
continue
|
|
50
|
+
}
|
|
51
|
+
out += `%${byte.toString(16).toUpperCase().padStart(2, '0')}`
|
|
52
|
+
}
|
|
53
|
+
return out
|
|
54
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import * as http from '@goscript/net/http/index.js'
|
|
3
|
+
|
|
4
|
+
export class ResponseRecorder implements http.ResponseWriter {
|
|
5
|
+
public Code = 200
|
|
6
|
+
public Body: $.Slice<number> = null
|
|
7
|
+
private headerMap = new http.Header()
|
|
8
|
+
|
|
9
|
+
public Header(): http.Header {
|
|
10
|
+
return this.headerMap
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public Write(p: $.Slice<number>): [number, $.GoError] {
|
|
14
|
+
this.Body = $.append(this.Body, p)
|
|
15
|
+
return [$.len(p), null]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public WriteHeader(statusCode: number): void {
|
|
19
|
+
this.Code = statusCode
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function NewRecorder(): ResponseRecorder {
|
|
24
|
+
return new ResponseRecorder()
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { Get, Response, StatusOK, StatusText } from './index.js'
|
|
4
|
+
|
|
5
|
+
describe('net/http override', () => {
|
|
6
|
+
it('exports response status helpers', () => {
|
|
7
|
+
const resp = new Response({ StatusCode: StatusOK })
|
|
8
|
+
|
|
9
|
+
expect(resp.StatusCode).toBe(200)
|
|
10
|
+
expect(StatusText(resp.StatusCode)).toBe('OK')
|
|
11
|
+
expect(StatusText(599)).toBe('')
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it('returns an explicit unsupported error for Get', () => {
|
|
15
|
+
const [resp, err] = Get('https://example.invalid')
|
|
16
|
+
|
|
17
|
+
expect(resp).toBeNull()
|
|
18
|
+
expect(err?.Error()).toBe('net/http: Get is not implemented in GoScript')
|
|
19
|
+
})
|
|
20
|
+
})
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import * as errors from '@goscript/errors/index.js'
|
|
3
|
+
import * as io from '@goscript/io/index.js'
|
|
4
|
+
|
|
5
|
+
export const StatusOK = 200
|
|
6
|
+
|
|
7
|
+
export function StatusText(code: number): string {
|
|
8
|
+
switch (code) {
|
|
9
|
+
case StatusOK:
|
|
10
|
+
return 'OK'
|
|
11
|
+
default:
|
|
12
|
+
return ''
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class Header extends Map<string, $.Slice<string>> {
|
|
17
|
+
public Add(key: string, value: string): void {
|
|
18
|
+
const values = Array.from(this.get(key) ?? [])
|
|
19
|
+
values.push(value)
|
|
20
|
+
this.set(key, $.arrayToSlice(values))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public Del(key: string): void {
|
|
24
|
+
this.delete(key)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public Get(key: string): string {
|
|
28
|
+
const values = this.get(key)
|
|
29
|
+
return values == null || values.length === 0 ? '' : String(values[0])
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public Set(key: string, value: string): void {
|
|
33
|
+
this.set(key, $.arrayToSlice([value]))
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function Header_Add(h: Header, key: string, value: string): void {
|
|
38
|
+
h.Add(key, value)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function Header_Del(h: Header, key: string): void {
|
|
42
|
+
h.Del(key)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function Header_Get(h: Header, key: string): string {
|
|
46
|
+
return h.Get(key)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function Header_Set(h: Header, key: string, value: string): void {
|
|
50
|
+
h.Set(key, value)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface ResponseWriter {
|
|
54
|
+
Header(): Header
|
|
55
|
+
Write(p: $.Slice<number>): [number, $.GoError]
|
|
56
|
+
WriteHeader(statusCode: number): void
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class Response {
|
|
60
|
+
public StatusCode: number
|
|
61
|
+
public Body: io.ReadCloser | null
|
|
62
|
+
public Header: Header
|
|
63
|
+
|
|
64
|
+
constructor(init?: Partial<Response>) {
|
|
65
|
+
this.StatusCode = init?.StatusCode ?? 0
|
|
66
|
+
this.Body = init?.Body ?? null
|
|
67
|
+
this.Header = init?.Header ?? new Header()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public clone(): Response {
|
|
71
|
+
return new Response({
|
|
72
|
+
Body: this.Body,
|
|
73
|
+
Header: this.Header,
|
|
74
|
+
StatusCode: this.StatusCode,
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function Get(_url: string): [Response | null, $.GoError] {
|
|
80
|
+
return [null, errors.New('net/http: Get is not implemented in GoScript')]
|
|
81
|
+
}
|
package/gs/os/dir_unix.gs.ts
CHANGED
|
@@ -130,7 +130,7 @@ export function readIntBE(b: $.Bytes, size: uintptr): number {
|
|
|
130
130
|
case 4:
|
|
131
131
|
return (byteorder.BEUint32(b) as number)
|
|
132
132
|
case 8:
|
|
133
|
-
return (byteorder.BEUint64(b)
|
|
133
|
+
return Number(byteorder.BEUint64(b))
|
|
134
134
|
default:
|
|
135
135
|
$.panic("syscall: readInt with unsupported size")
|
|
136
136
|
return 0 // This line will never be reached due to panic, but satisfies TypeScript
|
|
@@ -146,10 +146,9 @@ export function readIntLE(b: $.Bytes, size: uintptr): number {
|
|
|
146
146
|
case 4:
|
|
147
147
|
return (byteorder.LEUint32(b) as number)
|
|
148
148
|
case 8:
|
|
149
|
-
return (byteorder.LEUint64(b)
|
|
149
|
+
return Number(byteorder.LEUint64(b))
|
|
150
150
|
default:
|
|
151
151
|
$.panic("syscall: readInt with unsupported size")
|
|
152
152
|
return 0 // This line will never be reached due to panic, but satisfies TypeScript
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
|
package/gs/os/types_js.gs.ts
CHANGED
|
@@ -312,7 +312,7 @@ export class File {
|
|
|
312
312
|
if (this.closed) {
|
|
313
313
|
return [0, ErrClosed]
|
|
314
314
|
}
|
|
315
|
-
return io.Copy(this, r)
|
|
315
|
+
return io.Copy(this, r) as any
|
|
316
316
|
}
|
|
317
317
|
|
|
318
318
|
public Write(b: $.Bytes): [number, $.GoError] {
|
|
@@ -349,7 +349,7 @@ export class File {
|
|
|
349
349
|
if (this.closed) {
|
|
350
350
|
return [0, ErrClosed]
|
|
351
351
|
}
|
|
352
|
-
return io.Copy(w, this)
|
|
352
|
+
return io.Copy(w, this) as any
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
public Seek(offset: number, whence: number): [number, $.GoError] {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync } from 'node:fs'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { join } from 'node:path'
|
|
2
5
|
import { Match, Glob, ErrBadPattern } from './match.js'
|
|
3
6
|
|
|
4
7
|
describe('path/filepath - Pattern matching functions', () => {
|
|
@@ -216,20 +219,36 @@ describe('path/filepath - Pattern matching functions', () => {
|
|
|
216
219
|
})
|
|
217
220
|
|
|
218
221
|
describe('Glob', () => {
|
|
219
|
-
it('should
|
|
220
|
-
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
it('should read host filesystem matches', () => {
|
|
223
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-glob-'))
|
|
224
|
+
const oldwd = process.cwd()
|
|
225
|
+
try {
|
|
226
|
+
mkdirSync(join(root, 'a', 'b', 'c.d', 'e.f'), { recursive: true })
|
|
227
|
+
process.chdir(root)
|
|
228
|
+
|
|
229
|
+
const [files1, err1] = Glob('./*/*/*.d')
|
|
230
|
+
expect(err1).toBeNull()
|
|
231
|
+
expect(files1).toEqual(['a/b/c.d'])
|
|
224
232
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
233
|
+
const [files2, err2] = Glob('a/b/c.d/e.*')
|
|
234
|
+
expect(err2).toBeNull()
|
|
235
|
+
expect(files2).toEqual(['a/b/c.d/e.f'])
|
|
236
|
+
} finally {
|
|
237
|
+
process.chdir(oldwd)
|
|
238
|
+
rmSync(root, { force: true, recursive: true })
|
|
239
|
+
}
|
|
240
|
+
})
|
|
228
241
|
|
|
229
|
-
|
|
230
|
-
const [
|
|
231
|
-
expect(
|
|
232
|
-
expect(
|
|
242
|
+
it('should validate bad patterns', () => {
|
|
243
|
+
const [files1, err1] = Glob('[unclosed')
|
|
244
|
+
expect(err1).toBe(ErrBadPattern)
|
|
245
|
+
expect(files1).toEqual([])
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it('should return empty results for unmatched valid patterns', () => {
|
|
249
|
+
const [files1, err1] = Glob('missing-*.txt')
|
|
250
|
+
expect(err1).toBeNull()
|
|
251
|
+
expect(files1).toEqual([])
|
|
233
252
|
})
|
|
234
253
|
})
|
|
235
254
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import { getHostRuntime, type NodeFSModule } from '@goscript/builtin/hostio.js'
|
|
2
3
|
|
|
3
4
|
export const ErrBadPattern = $.newError('syntax error in pattern')
|
|
4
5
|
|
|
@@ -238,12 +239,186 @@ function matchCharClass(
|
|
|
238
239
|
// The only possible returned error is ErrBadPattern, when pattern is malformed.
|
|
239
240
|
export function Glob(pattern: string): [string[], $.GoError] {
|
|
240
241
|
try {
|
|
241
|
-
// Validate the pattern using the same logic as Match
|
|
242
242
|
validatePattern(pattern)
|
|
243
|
-
|
|
244
|
-
return [[], null]
|
|
243
|
+
return [globHost(pattern), null]
|
|
245
244
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
246
245
|
} catch (err) {
|
|
247
246
|
return [[], ErrBadPattern]
|
|
248
247
|
}
|
|
249
248
|
}
|
|
249
|
+
|
|
250
|
+
function hasMeta(path: string): boolean {
|
|
251
|
+
return /[*?[\\]/.test(path)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function splitPattern(pattern: string): { absolute: boolean; segments: string[] } {
|
|
255
|
+
const absolute = pattern.startsWith('/')
|
|
256
|
+
const segments = pattern.split('/').filter((segment, index) => {
|
|
257
|
+
if (index === 0 && segment === '') {
|
|
258
|
+
return false
|
|
259
|
+
}
|
|
260
|
+
return segment !== '' && segment !== '.'
|
|
261
|
+
})
|
|
262
|
+
return { absolute, segments }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function cleanMatch(path: string): string {
|
|
266
|
+
const absolute = path.startsWith('/')
|
|
267
|
+
const parts: string[] = []
|
|
268
|
+
for (const part of path.split('/')) {
|
|
269
|
+
if (part === '' || part === '.') {
|
|
270
|
+
continue
|
|
271
|
+
}
|
|
272
|
+
if (part === '..') {
|
|
273
|
+
if (parts.length > 0 && parts[parts.length - 1] !== '..') {
|
|
274
|
+
parts.pop()
|
|
275
|
+
} else if (!absolute) {
|
|
276
|
+
parts.push(part)
|
|
277
|
+
}
|
|
278
|
+
continue
|
|
279
|
+
}
|
|
280
|
+
parts.push(part)
|
|
281
|
+
}
|
|
282
|
+
const out = parts.join('/')
|
|
283
|
+
if (absolute) {
|
|
284
|
+
return '/' + out
|
|
285
|
+
}
|
|
286
|
+
return out === '' ? '.' : out
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function joinPath(dir: string, name: string): string {
|
|
290
|
+
if (dir === '' || dir === '.') {
|
|
291
|
+
return name
|
|
292
|
+
}
|
|
293
|
+
if (dir === '/') {
|
|
294
|
+
return '/' + name
|
|
295
|
+
}
|
|
296
|
+
return dir.replace(/\/+$/, '') + '/' + name
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
type HostDirEntry = { name: string; isDir: boolean }
|
|
300
|
+
|
|
301
|
+
function readDir(path: string): HostDirEntry[] | null {
|
|
302
|
+
const runtime = getHostRuntime()
|
|
303
|
+
const denoObj = runtime.deno
|
|
304
|
+
if (denoObj?.readDirSync) {
|
|
305
|
+
try {
|
|
306
|
+
const entries: HostDirEntry[] = []
|
|
307
|
+
for (const entry of denoObj.readDirSync(path)) {
|
|
308
|
+
entries.push({ name: entry.name, isDir: !!entry.isDirectory })
|
|
309
|
+
}
|
|
310
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
311
|
+
return entries
|
|
312
|
+
} catch {
|
|
313
|
+
return null
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const nodeFS = runtime.nodeFS
|
|
318
|
+
if (nodeFS?.readdirSync) {
|
|
319
|
+
try {
|
|
320
|
+
const entries = nodeFS
|
|
321
|
+
.readdirSync(path, { withFileTypes: true })
|
|
322
|
+
.map((entry: any) => ({
|
|
323
|
+
name: String(entry.name),
|
|
324
|
+
isDir:
|
|
325
|
+
typeof entry.isDirectory === 'function' ?
|
|
326
|
+
entry.isDirectory()
|
|
327
|
+
: false,
|
|
328
|
+
}))
|
|
329
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
330
|
+
return entries
|
|
331
|
+
} catch {
|
|
332
|
+
return null
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return null
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function exists(path: string): boolean {
|
|
340
|
+
const runtime = getHostRuntime()
|
|
341
|
+
if (runtime.deno?.statSync) {
|
|
342
|
+
try {
|
|
343
|
+
runtime.deno.statSync(path)
|
|
344
|
+
return true
|
|
345
|
+
} catch {
|
|
346
|
+
return false
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const nodeFS = runtime.nodeFS
|
|
351
|
+
if (nodeFS?.statSync) {
|
|
352
|
+
try {
|
|
353
|
+
nodeFS.statSync(path)
|
|
354
|
+
return true
|
|
355
|
+
} catch {
|
|
356
|
+
return false
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return false
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function isDir(path: string, nodeFS?: NodeFSModule | null): boolean {
|
|
364
|
+
const runtime = getHostRuntime()
|
|
365
|
+
if (runtime.deno?.statSync) {
|
|
366
|
+
try {
|
|
367
|
+
return !!runtime.deno.statSync(path).isDirectory
|
|
368
|
+
} catch {
|
|
369
|
+
return false
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const fs = nodeFS ?? runtime.nodeFS
|
|
374
|
+
if (fs?.statSync) {
|
|
375
|
+
try {
|
|
376
|
+
const stat = fs.statSync(path)
|
|
377
|
+
return typeof stat.isDirectory === 'function' ? stat.isDirectory() : false
|
|
378
|
+
} catch {
|
|
379
|
+
return false
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return false
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function globHost(pattern: string): string[] {
|
|
387
|
+
const { absolute, segments } = splitPattern(pattern)
|
|
388
|
+
if (!hasMeta(pattern)) {
|
|
389
|
+
return exists(pattern) ? [cleanMatch(pattern)] : []
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
let prefixes = [absolute ? '/' : '.']
|
|
393
|
+
for (const [index, segment] of segments.entries()) {
|
|
394
|
+
const next: string[] = []
|
|
395
|
+
const last = index === segments.length - 1
|
|
396
|
+
const segmentHasMeta = hasMeta(segment)
|
|
397
|
+
for (const prefix of prefixes) {
|
|
398
|
+
if (!segmentHasMeta) {
|
|
399
|
+
const candidate = joinPath(prefix, segment)
|
|
400
|
+
if (last || isDir(candidate)) {
|
|
401
|
+
next.push(candidate)
|
|
402
|
+
}
|
|
403
|
+
continue
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const entries = readDir(prefix)
|
|
407
|
+
if (entries === null) {
|
|
408
|
+
continue
|
|
409
|
+
}
|
|
410
|
+
for (const entry of entries) {
|
|
411
|
+
const [matched, err] = Match(segment, entry.name)
|
|
412
|
+
if (err !== null || !matched) {
|
|
413
|
+
continue
|
|
414
|
+
}
|
|
415
|
+
if (last || entry.isDir) {
|
|
416
|
+
next.push(joinPath(prefix, entry.name))
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
prefixes = next
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return prefixes.map(cleanMatch).sort()
|
|
424
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { join } from 'node:path'
|
|
2
5
|
import {
|
|
3
6
|
Base,
|
|
4
7
|
Dir,
|
|
@@ -16,6 +19,7 @@ import {
|
|
|
16
19
|
Abs,
|
|
17
20
|
Rel,
|
|
18
21
|
EvalSymlinks,
|
|
22
|
+
Walk,
|
|
19
23
|
Separator,
|
|
20
24
|
ListSeparator,
|
|
21
25
|
} from './path.js'
|
|
@@ -201,6 +205,27 @@ describe('path/filepath - Path manipulation functions', () => {
|
|
|
201
205
|
})
|
|
202
206
|
})
|
|
203
207
|
|
|
208
|
+
describe('Walk', () => {
|
|
209
|
+
it('should visit host filesystem paths in lexical order', () => {
|
|
210
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
|
|
211
|
+
try {
|
|
212
|
+
mkdirSync(join(root, 'a', 'b'), { recursive: true })
|
|
213
|
+
writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
|
|
214
|
+
|
|
215
|
+
const visited: string[] = []
|
|
216
|
+
const err = Walk(root, (path) => {
|
|
217
|
+
visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
|
|
218
|
+
return null
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
expect(err).toBeNull()
|
|
222
|
+
expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
|
|
223
|
+
} finally {
|
|
224
|
+
rmSync(root, { force: true, recursive: true })
|
|
225
|
+
}
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
|
|
204
229
|
describe('Constants', () => {
|
|
205
230
|
it('should have correct separator constants', () => {
|
|
206
231
|
expect(Separator).toBe(47)
|