goscript 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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} +35 -8
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript/cmd_compile_test.go +105 -6
- package/compiler/build-flags.go +9 -10
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +353 -27
- package/compiler/gotest/runner_test.go +400 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/lowered-program.go +24 -17
- package/compiler/lowering.go +988 -263
- package/compiler/lowering_bench_test.go +364 -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/package-graph.go +61 -4
- package/compiler/package-graph_test.go +30 -0
- package/compiler/protobuf-ts-binding.go +514 -0
- package/compiler/protobuf-ts-binding_test.go +172 -0
- package/compiler/semantic-model-types.go +17 -4
- package/compiler/semantic-model.go +709 -72
- package/compiler/semantic-model_test.go +219 -0
- package/compiler/service.go +20 -1
- package/compiler/skeleton_test.go +1008 -20
- package/compiler/typescript-emitter.go +147 -15
- package/dist/gs/builtin/builtin.d.ts +2 -2
- package/dist/gs/builtin/builtin.js +20 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +2 -1
- package/dist/gs/builtin/slice.js +34 -4
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +14 -6
- package/dist/gs/builtin/type.js +224 -64
- 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 +13 -6
- package/dist/gs/compress/zlib/index.js +131 -35
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/crypto/sha1/index.js +2 -5
- package/dist/gs/crypto/sha1/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.js +2 -5
- package/dist/gs/crypto/sha256/index.js.map +1 -1
- package/dist/gs/crypto/sha512/index.js +2 -5
- package/dist/gs/crypto/sha512/index.js.map +1 -1
- package/dist/gs/embed/index.d.ts +6 -0
- package/dist/gs/embed/index.js +210 -5
- package/dist/gs/embed/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/fmt/fmt.d.ts +3 -3
- package/dist/gs/fmt/fmt.js +29 -16
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
- 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/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 +8 -4
- 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 +12 -6
- package/dist/gs/io/io.js +87 -42
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +31 -5
- package/dist/gs/math/bits/index.js +29 -28
- 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 +303 -6
- package/dist/gs/net/http/index.js +1615 -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.d.ts +6 -2
- package/dist/gs/os/types_js.gs.js +170 -9
- 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 +26 -6
- package/dist/gs/reflect/type.js +1498 -279
- 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.d.ts +1 -1
- package/dist/gs/strings/reader.js +11 -7
- 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/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/sync/sync.d.ts +2 -1
- package/dist/gs/sync/sync.js +37 -16
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/syscall/js/index.js +9 -0
- package/dist/gs/syscall/js/index.js.map +1 -1
- package/dist/gs/testing/testing.js +59 -15
- 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/builtin.ts +25 -2
- package/gs/builtin/runtime-contract.test.ts +260 -18
- package/gs/builtin/slice.ts +51 -4
- package/gs/builtin/type.ts +310 -63
- 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 +159 -1
- package/gs/compress/zlib/index.ts +164 -37
- package/gs/compress/zlib/meta.json +4 -1
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/crypto/sha1/index.test.ts +19 -2
- package/gs/crypto/sha1/index.ts +3 -6
- package/gs/crypto/sha256/index.test.ts +14 -2
- package/gs/crypto/sha256/index.ts +3 -6
- package/gs/crypto/sha512/index.test.ts +17 -2
- package/gs/crypto/sha512/index.ts +3 -6
- package/gs/embed/index.test.ts +87 -0
- package/gs/embed/index.ts +229 -5
- 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/fmt/fmt.test.ts +41 -3
- package/gs/fmt/fmt.ts +40 -17
- package/gs/fmt/meta.json +6 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
- package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
- package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
- package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
- 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/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.test.ts +38 -0
- package/gs/io/fs/readdir.ts +8 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.test.ts +77 -6
- package/gs/io/io.ts +115 -52
- package/gs/io/meta.json +7 -1
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +75 -32
- 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 +797 -12
- package/gs/net/http/index.ts +1874 -136
- 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/file_unix_js.test.ts +52 -0
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/meta.json +4 -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/readdir.test.ts +56 -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 +170 -9
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/deepequal.test.ts +10 -1
- 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 +1980 -365
- package/gs/reflect/typefor.test.ts +540 -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/meta.json +5 -2
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.test.ts +2 -2
- package/gs/strings/reader.ts +11 -7
- 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/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/sync/meta.json +1 -0
- package/gs/sync/sync.test.ts +41 -1
- package/gs/sync/sync.ts +41 -16
- package/gs/syscall/env.ts +29 -14
- package/gs/syscall/js/index.test.ts +18 -0
- package/gs/syscall/js/index.ts +12 -0
- package/gs/testing/testing.test.ts +99 -3
- package/gs/testing/testing.ts +95 -24
- 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 -814
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
- /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"strict": true,
|
|
4
|
+
"symbols": {
|
|
5
|
+
"Compact": {
|
|
6
|
+
"status": "real"
|
|
7
|
+
},
|
|
8
|
+
"Decoder": {
|
|
9
|
+
"status": "real"
|
|
10
|
+
},
|
|
11
|
+
"Delim": {
|
|
12
|
+
"status": "real"
|
|
13
|
+
},
|
|
14
|
+
"Encoder": {
|
|
15
|
+
"status": "real"
|
|
16
|
+
},
|
|
17
|
+
"HTMLEscape": {
|
|
18
|
+
"status": "real"
|
|
19
|
+
},
|
|
20
|
+
"Indent": {
|
|
21
|
+
"status": "real"
|
|
22
|
+
},
|
|
23
|
+
"InvalidUnmarshalError": {
|
|
24
|
+
"status": "real"
|
|
25
|
+
},
|
|
26
|
+
"InvalidUTF8Error": {
|
|
27
|
+
"status": "real"
|
|
28
|
+
},
|
|
29
|
+
"Marshal": {
|
|
30
|
+
"status": "real"
|
|
31
|
+
},
|
|
32
|
+
"Marshaler": {
|
|
33
|
+
"status": "real"
|
|
34
|
+
},
|
|
35
|
+
"MarshalerError": {
|
|
36
|
+
"status": "real"
|
|
37
|
+
},
|
|
38
|
+
"MarshalIndent": {
|
|
39
|
+
"status": "real"
|
|
40
|
+
},
|
|
41
|
+
"NewDecoder": {
|
|
42
|
+
"status": "real"
|
|
43
|
+
},
|
|
44
|
+
"NewEncoder": {
|
|
45
|
+
"status": "real"
|
|
46
|
+
},
|
|
47
|
+
"Number": {
|
|
48
|
+
"status": "real"
|
|
49
|
+
},
|
|
50
|
+
"RawMessage": {
|
|
51
|
+
"status": "real"
|
|
52
|
+
},
|
|
53
|
+
"SyntaxError": {
|
|
54
|
+
"status": "real"
|
|
55
|
+
},
|
|
56
|
+
"Token": {
|
|
57
|
+
"status": "real"
|
|
58
|
+
},
|
|
59
|
+
"Unmarshal": {
|
|
60
|
+
"status": "real"
|
|
61
|
+
},
|
|
62
|
+
"Unmarshaler": {
|
|
63
|
+
"status": "real"
|
|
64
|
+
},
|
|
65
|
+
"UnmarshalFieldError": {
|
|
66
|
+
"status": "real"
|
|
67
|
+
},
|
|
68
|
+
"UnmarshalTypeError": {
|
|
69
|
+
"status": "real"
|
|
70
|
+
},
|
|
71
|
+
"UnsupportedTypeError": {
|
|
72
|
+
"status": "real"
|
|
73
|
+
},
|
|
74
|
+
"UnsupportedValueError": {
|
|
75
|
+
"status": "real"
|
|
76
|
+
},
|
|
77
|
+
"Valid": {
|
|
78
|
+
"status": "real"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
package/gs/fmt/fmt.test.ts
CHANGED
|
@@ -58,6 +58,15 @@ describe('fmt basic value formatting', () => {
|
|
|
58
58
|
expect(fmt.Sprintf('Type: %T', 3.14)).toBe('Type: float64')
|
|
59
59
|
expect(fmt.Sprintf('Type: %T', 'hello')).toBe('Type: string')
|
|
60
60
|
expect(fmt.Sprintf('Type: %T', true)).toBe('Type: bool')
|
|
61
|
+
expect(
|
|
62
|
+
fmt.Sprintf(
|
|
63
|
+
'Type: %T',
|
|
64
|
+
$.namedValueInterfaceValue(123, 'int', {}, {
|
|
65
|
+
kind: $.TypeKind.Basic,
|
|
66
|
+
name: 'int',
|
|
67
|
+
}),
|
|
68
|
+
),
|
|
69
|
+
).toBe('Type: int')
|
|
61
70
|
})
|
|
62
71
|
|
|
63
72
|
it('%d truncation behavior including negatives', () => {
|
|
@@ -115,6 +124,20 @@ describe('fmt basic value formatting', () => {
|
|
|
115
124
|
// We prefer GoString() first
|
|
116
125
|
expect(fmt.Sprintf('%v', goStringer)).toBe('<go stringer>')
|
|
117
126
|
})
|
|
127
|
+
|
|
128
|
+
it('%w formats errors by Error method', () => {
|
|
129
|
+
const err = $.newError('root')
|
|
130
|
+
expect(fmt.Errorf('wrap: %w', err)?.Error()).toBe('wrap: root')
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
it('%s formats stringers by String method', () => {
|
|
134
|
+
const stringer = {
|
|
135
|
+
String() {
|
|
136
|
+
return 'string-value'
|
|
137
|
+
},
|
|
138
|
+
}
|
|
139
|
+
expect(fmt.Sprintf('value=%s', stringer)).toBe('value=string-value')
|
|
140
|
+
})
|
|
118
141
|
})
|
|
119
142
|
|
|
120
143
|
describe('fmt spacing rules', () => {
|
|
@@ -146,7 +169,7 @@ describe('fmt spacing rules', () => {
|
|
|
146
169
|
expect(output).toBe('hi there 1 2\n')
|
|
147
170
|
})
|
|
148
171
|
|
|
149
|
-
it('Fprint/Fprintln behave like Print/Println with writers', () => {
|
|
172
|
+
it('Fprint/Fprintln behave like Print/Println with writers', async () => {
|
|
150
173
|
const chunks: Uint8Array[] = []
|
|
151
174
|
const writer = {
|
|
152
175
|
Write(b: Uint8Array): [number, any] {
|
|
@@ -155,14 +178,29 @@ describe('fmt spacing rules', () => {
|
|
|
155
178
|
},
|
|
156
179
|
}
|
|
157
180
|
|
|
158
|
-
let [n, err] = fmt.Fprint(writer, 1, 2, 'x', 3)
|
|
181
|
+
let [n, err] = await fmt.Fprint(writer, 1, 2, 'x', 3)
|
|
159
182
|
expect(err).toBeNull()
|
|
160
183
|
expect(n).toBe(5) // "1 2x3".length
|
|
161
184
|
expect(new TextDecoder().decode(chunks[0])).toBe('1 2x3')
|
|
162
|
-
;[, err] = fmt.Fprintln(writer, 'hi', 'there', 1, 2)
|
|
185
|
+
;[, err] = await fmt.Fprintln(writer, 'hi', 'there', 1, 2)
|
|
163
186
|
expect(err).toBeNull()
|
|
164
187
|
expect(new TextDecoder().decode(chunks[1])).toBe('hi there 1 2\n')
|
|
165
188
|
})
|
|
189
|
+
|
|
190
|
+
it('Fprintf awaits async writers', async () => {
|
|
191
|
+
const chunks: Uint8Array[] = []
|
|
192
|
+
const writer = {
|
|
193
|
+
async Write(b: Uint8Array): Promise<[number, any]> {
|
|
194
|
+
chunks.push(b)
|
|
195
|
+
return [b.length, null]
|
|
196
|
+
},
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const [n, err] = await fmt.Fprintf(writer, 'n=%d s=%s', 7, 'ok')
|
|
200
|
+
expect(err).toBeNull()
|
|
201
|
+
expect(n).toBe(8)
|
|
202
|
+
expect(new TextDecoder().decode(chunks[0])).toBe('n=7 s=ok')
|
|
203
|
+
})
|
|
166
204
|
})
|
|
167
205
|
|
|
168
206
|
describe('fmt parseFormat basic cases', () => {
|
package/gs/fmt/fmt.ts
CHANGED
|
@@ -34,15 +34,20 @@ function formatValue(value: any, verb: string): string {
|
|
|
34
34
|
switch (verb) {
|
|
35
35
|
case 'v': // default format
|
|
36
36
|
return defaultFormat(value)
|
|
37
|
+
case 'w': // wrapped error
|
|
38
|
+
return defaultFormat(value)
|
|
37
39
|
case 'd': // decimal integer
|
|
38
40
|
return String(Math.trunc(Number(value)))
|
|
39
41
|
case 'f': // decimal point, no exponent
|
|
40
42
|
return Number(value).toString()
|
|
41
43
|
case 's': // string
|
|
42
|
-
|
|
44
|
+
if (typeof value === 'string') return value
|
|
45
|
+
if (value instanceof Uint8Array) return $.bytesToString(value)
|
|
46
|
+
return defaultFormat(value)
|
|
43
47
|
case 't': // boolean
|
|
44
48
|
return value ? 'true' : 'false'
|
|
45
49
|
case 'T': // type (approximate Go names for primitives we need)
|
|
50
|
+
if (hasGoTypeName(value)) return value.__goType
|
|
46
51
|
if (typeof value === 'number') {
|
|
47
52
|
return Number.isInteger(value) ? 'int' : 'float64'
|
|
48
53
|
}
|
|
@@ -85,6 +90,14 @@ function formatValue(value: any, verb: string): string {
|
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
|
|
93
|
+
function hasGoTypeName(value: unknown): value is { __goType: string } {
|
|
94
|
+
return (
|
|
95
|
+
value !== null &&
|
|
96
|
+
typeof value === 'object' &&
|
|
97
|
+
typeof (value as { __goType?: unknown }).__goType === 'string'
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
88
101
|
function defaultFormat(value: any): string {
|
|
89
102
|
if (value === null || value === undefined) return '<nil>'
|
|
90
103
|
if (typeof value === 'boolean') return value ? 'true' : 'false'
|
|
@@ -120,6 +133,9 @@ function defaultFormat(value: any): string {
|
|
|
120
133
|
// Ignore error by continuing to next case.
|
|
121
134
|
}
|
|
122
135
|
}
|
|
136
|
+
if ('__goValue' in value) {
|
|
137
|
+
return defaultFormat((value as { __goValue: unknown }).__goValue)
|
|
138
|
+
}
|
|
123
139
|
// Basic Map/Set rendering
|
|
124
140
|
if (value instanceof Map) {
|
|
125
141
|
const parts: string[] = []
|
|
@@ -357,8 +373,21 @@ export function Sprintln(...a: any[]): string {
|
|
|
357
373
|
return a.map(defaultFormat).join(' ') + '\n'
|
|
358
374
|
}
|
|
359
375
|
|
|
376
|
+
async function writeToWriter(
|
|
377
|
+
w: any,
|
|
378
|
+
out: string,
|
|
379
|
+
): Promise<[number, $.GoError | null]> {
|
|
380
|
+
if (w && w.Write) {
|
|
381
|
+
return await w.Write(new TextEncoder().encode(out))
|
|
382
|
+
}
|
|
383
|
+
return [0, $.newError('Writer does not implement Write method')]
|
|
384
|
+
}
|
|
385
|
+
|
|
360
386
|
// Fprint functions (write to Writer) - simplified implementation
|
|
361
|
-
export function Fprint(
|
|
387
|
+
export async function Fprint(
|
|
388
|
+
w: any,
|
|
389
|
+
...a: any[]
|
|
390
|
+
): Promise<[number, $.GoError | null]> {
|
|
362
391
|
// Same spacing as Print
|
|
363
392
|
let out = ''
|
|
364
393
|
for (let i = 0; i < a.length; i++) {
|
|
@@ -369,32 +398,26 @@ export function Fprint(w: any, ...a: any[]): [number, $.GoError | null] {
|
|
|
369
398
|
}
|
|
370
399
|
out += defaultFormat(a[i])
|
|
371
400
|
}
|
|
372
|
-
|
|
373
|
-
return w.Write(new TextEncoder().encode(out))
|
|
374
|
-
}
|
|
375
|
-
return [0, $.newError('Writer does not implement Write method')]
|
|
401
|
+
return await writeToWriter(w, out)
|
|
376
402
|
}
|
|
377
403
|
|
|
378
|
-
export function Fprintf(
|
|
404
|
+
export async function Fprintf(
|
|
379
405
|
w: any,
|
|
380
406
|
format: string,
|
|
381
407
|
...a: any[]
|
|
382
|
-
): [number, $.GoError | null] {
|
|
408
|
+
): Promise<[number, $.GoError | null]> {
|
|
383
409
|
const result = parseFormat(format, a)
|
|
384
|
-
|
|
385
|
-
return w.Write(new TextEncoder().encode(result))
|
|
386
|
-
}
|
|
387
|
-
return [0, $.newError('Writer does not implement Write method')]
|
|
410
|
+
return await writeToWriter(w, result)
|
|
388
411
|
}
|
|
389
412
|
|
|
390
|
-
export function Fprintln(
|
|
413
|
+
export async function Fprintln(
|
|
414
|
+
w: any,
|
|
415
|
+
...a: any[]
|
|
416
|
+
): Promise<[number, $.GoError | null]> {
|
|
391
417
|
// Same behavior as Println
|
|
392
418
|
const body = a.map(defaultFormat).join(' ')
|
|
393
419
|
const result = body + '\n'
|
|
394
|
-
|
|
395
|
-
return w.Write(new TextEncoder().encode(result))
|
|
396
|
-
}
|
|
397
|
-
return [0, $.newError('Writer does not implement Write method')]
|
|
420
|
+
return await writeToWriter(w, result)
|
|
398
421
|
}
|
|
399
422
|
|
|
400
423
|
// Append functions (append to byte slice)
|
package/gs/fmt/meta.json
CHANGED
|
@@ -3,7 +3,17 @@ import { describe, expect, it } from 'vitest'
|
|
|
3
3
|
import * as $ from '../../../builtin/index.js'
|
|
4
4
|
import {
|
|
5
5
|
AppendVarint,
|
|
6
|
+
CloneBytes,
|
|
7
|
+
CloneBytesMap,
|
|
8
|
+
CloneBytesSlice,
|
|
9
|
+
CloneMap,
|
|
6
10
|
type CloneMessage,
|
|
11
|
+
ClonePtr,
|
|
12
|
+
CloneSlice,
|
|
13
|
+
type CloneVT,
|
|
14
|
+
CloneVTMap,
|
|
15
|
+
CloneVTSlice,
|
|
16
|
+
CloneVTValue,
|
|
7
17
|
CompareEqualVT,
|
|
8
18
|
ConsumeVarint,
|
|
9
19
|
DecodeFixed32,
|
|
@@ -16,8 +26,55 @@ import {
|
|
|
16
26
|
ErrIntOverflow,
|
|
17
27
|
ErrInvalidLength,
|
|
18
28
|
ErrUnexpectedEndOfGroup,
|
|
29
|
+
EqualBytes,
|
|
30
|
+
EqualBytesMap,
|
|
31
|
+
EqualBytesPresent,
|
|
32
|
+
EqualBytesSlice,
|
|
33
|
+
EqualMap,
|
|
34
|
+
EqualPtr,
|
|
35
|
+
EqualSlice,
|
|
36
|
+
EqualVTImplicit,
|
|
37
|
+
EqualVTMapImplicit,
|
|
38
|
+
EqualVTSliceImplicit,
|
|
39
|
+
type EqualVT,
|
|
19
40
|
IsEqualVTSlice,
|
|
41
|
+
SizeBoolNonZero,
|
|
42
|
+
SizeBoolPacked,
|
|
43
|
+
SizeBoolPtr,
|
|
44
|
+
SizeBoolSlice,
|
|
45
|
+
SizeBoolValue,
|
|
46
|
+
SizeBytesNonEmpty,
|
|
47
|
+
SizeBytesPresent,
|
|
48
|
+
SizeBytesSlice,
|
|
49
|
+
SizeBytesValue,
|
|
50
|
+
SizeFixed32NonZero,
|
|
51
|
+
SizeFixed32Packed,
|
|
52
|
+
SizeFixed32Ptr,
|
|
53
|
+
SizeFixed32Slice,
|
|
54
|
+
SizeFixed32Value,
|
|
55
|
+
SizeFixed64NonZero,
|
|
56
|
+
SizeFixed64Packed,
|
|
57
|
+
SizeFixed64Ptr,
|
|
58
|
+
SizeFixed64Slice,
|
|
59
|
+
SizeFixed64Value,
|
|
60
|
+
SizeGroup,
|
|
61
|
+
SizeMessage,
|
|
20
62
|
SizeOfVarint,
|
|
63
|
+
SizeOfZigzag,
|
|
64
|
+
SizeStringNonEmpty,
|
|
65
|
+
SizeStringPtr,
|
|
66
|
+
SizeStringSlice,
|
|
67
|
+
SizeStringValue,
|
|
68
|
+
SizeVarintNonZero,
|
|
69
|
+
SizeVarintPacked,
|
|
70
|
+
SizeVarintPtr,
|
|
71
|
+
SizeVarintSlice,
|
|
72
|
+
SizeVarintValue,
|
|
73
|
+
SizeZigzagNonZero,
|
|
74
|
+
SizeZigzagPacked,
|
|
75
|
+
SizeZigzagPtr,
|
|
76
|
+
SizeZigzagSlice,
|
|
77
|
+
SizeZigzagValue,
|
|
21
78
|
Skip,
|
|
22
79
|
} from './index.js'
|
|
23
80
|
|
|
@@ -29,6 +86,42 @@ class TestValue {
|
|
|
29
86
|
}
|
|
30
87
|
}
|
|
31
88
|
|
|
89
|
+
class TestCloneValue
|
|
90
|
+
implements CloneVT<TestCloneValue>, EqualVT<TestCloneValue>
|
|
91
|
+
{
|
|
92
|
+
constructor(private readonly cloneValue: string) {}
|
|
93
|
+
|
|
94
|
+
SizeVT(): number {
|
|
95
|
+
return 0
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
MarshalToSizedBufferVT(): [number, $.GoError] {
|
|
99
|
+
return [0, null]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
MarshalVT(): [$.Slice<number>, $.GoError] {
|
|
103
|
+
return [null, null]
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
UnmarshalVT(): $.GoError {
|
|
107
|
+
return null
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Reset(): void {}
|
|
111
|
+
|
|
112
|
+
CloneMessageVT(): CloneMessage | null {
|
|
113
|
+
return this.CloneVT()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
CloneVT(): TestCloneValue {
|
|
117
|
+
return new TestCloneValue(this.cloneValue)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
EqualVT(other: TestCloneValue): boolean {
|
|
121
|
+
return this.cloneValue === other.cloneValue
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
32
125
|
class TestCloneMessage implements CloneMessage {
|
|
33
126
|
SizeVT(): number {
|
|
34
127
|
return 0
|
|
@@ -78,6 +171,68 @@ describe('protobuf-go-lite EqualVT helpers', () => {
|
|
|
78
171
|
})
|
|
79
172
|
})
|
|
80
173
|
|
|
174
|
+
describe('protobuf-go-lite static helper overrides', () => {
|
|
175
|
+
it('clones pointer, slice, map, bytes, and VT values', () => {
|
|
176
|
+
const ptr = $.varRef(7)
|
|
177
|
+
const clonedPtr = ClonePtr(ptr)
|
|
178
|
+
expect(clonedPtr).not.toBe(ptr)
|
|
179
|
+
expect(clonedPtr?.value).toBe(7)
|
|
180
|
+
|
|
181
|
+
const bytes = new Uint8Array([1, 2])
|
|
182
|
+
const clonedBytes = CloneBytes(bytes)
|
|
183
|
+
expect(clonedBytes).not.toBe(bytes)
|
|
184
|
+
expect(Array.from(clonedBytes ?? [])).toEqual([1, 2])
|
|
185
|
+
|
|
186
|
+
expect(CloneSlice([1, 2])).toEqual([1, 2])
|
|
187
|
+
expect(CloneMap(new Map([['a', 1]]))?.get('a')).toBe(1)
|
|
188
|
+
|
|
189
|
+
const bytesSlice = CloneBytesSlice([new Uint8Array([3])])
|
|
190
|
+
expect(bytesSlice?.[0]).not.toBe(bytes)
|
|
191
|
+
expect(Array.from(bytesSlice?.[0] ?? [])).toEqual([3])
|
|
192
|
+
|
|
193
|
+
const bytesMap = CloneBytesMap(new Map([['a', new Uint8Array([4])]]))
|
|
194
|
+
expect(Array.from(bytesMap?.get('a') ?? [])).toEqual([4])
|
|
195
|
+
|
|
196
|
+
const msg = new TestCloneValue('x')
|
|
197
|
+
expect(CloneVTValue(msg)).not.toBe(msg)
|
|
198
|
+
expect(CloneVTSlice([msg])?.[0]).not.toBe(msg)
|
|
199
|
+
expect(CloneVTMap(new Map([['a', msg]]))?.get('a')).not.toBe(msg)
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
it('compares pointer, slice, map, bytes, and implicit VT values', () => {
|
|
203
|
+
expect(EqualPtr($.varRef(1), $.varRef(1))).toBe(true)
|
|
204
|
+
expect(EqualPtr($.varRef(1), $.varRef(2))).toBe(false)
|
|
205
|
+
expect(EqualBytes(new Uint8Array([1]), [1])).toBe(true)
|
|
206
|
+
expect(EqualBytesPresent(null, new Uint8Array())).toBe(false)
|
|
207
|
+
expect(EqualSlice([1, 2], [1, 2])).toBe(true)
|
|
208
|
+
expect(EqualMap(new Map([['a', 1]]), new Map([['a', 1]]))).toBe(true)
|
|
209
|
+
expect(EqualBytesSlice([new Uint8Array([1])], [[1]])).toBe(true)
|
|
210
|
+
expect(
|
|
211
|
+
EqualBytesMap(
|
|
212
|
+
new Map([['a', new Uint8Array([1])]]),
|
|
213
|
+
new Map([['a', [1]]]),
|
|
214
|
+
),
|
|
215
|
+
).toBe(true)
|
|
216
|
+
|
|
217
|
+
const empty = () => new TestCloneValue('')
|
|
218
|
+
expect(EqualVTImplicit(null, new TestCloneValue(''), empty)).toBe(true)
|
|
219
|
+
expect(
|
|
220
|
+
EqualVTSliceImplicit(
|
|
221
|
+
[null, new TestCloneValue('x')],
|
|
222
|
+
[new TestCloneValue(''), new TestCloneValue('x')],
|
|
223
|
+
empty,
|
|
224
|
+
),
|
|
225
|
+
).toBe(true)
|
|
226
|
+
expect(
|
|
227
|
+
EqualVTMapImplicit(
|
|
228
|
+
new Map([['a', null]]),
|
|
229
|
+
new Map([['a', new TestCloneValue('')]]),
|
|
230
|
+
empty,
|
|
231
|
+
),
|
|
232
|
+
).toBe(true)
|
|
233
|
+
})
|
|
234
|
+
})
|
|
235
|
+
|
|
81
236
|
describe('protobuf-go-lite runtime interfaces', () => {
|
|
82
237
|
it('registers CloneMessage metadata for Go type assertions', () => {
|
|
83
238
|
const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
|
|
@@ -105,9 +260,13 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
105
260
|
expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
|
|
106
261
|
expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
|
|
107
262
|
expect(SizeOfVarint(0xffffffffffffffffn)).toBe(10)
|
|
108
|
-
expect(
|
|
109
|
-
|
|
110
|
-
|
|
263
|
+
expect(SizeOfZigzag(-1)).toBe(1)
|
|
264
|
+
expect(SizeOfZigzag(1)).toBe(1)
|
|
265
|
+
expect(SizeOfZigzag(-64)).toBe(1)
|
|
266
|
+
expect(SizeOfZigzag(-65)).toBe(2)
|
|
267
|
+
expect(
|
|
268
|
+
Array.from(AppendVarint([], 0xffffffffffffffffn) as number[]),
|
|
269
|
+
).toEqual([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01])
|
|
111
270
|
expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
|
|
112
271
|
0xffffffffffffffffn,
|
|
113
272
|
10,
|
|
@@ -147,4 +306,53 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
147
306
|
const [, eof] = Skip(new Uint8Array([0x08, 0x80]))
|
|
148
307
|
expect(eof?.Error()).toBe('unexpected EOF')
|
|
149
308
|
})
|
|
309
|
+
|
|
310
|
+
it('reports helper-backed protobuf sizes', () => {
|
|
311
|
+
expect(SizeVarintValue(1, 300)).toBe(3)
|
|
312
|
+
expect(SizeVarintNonZero(1, 0)).toBe(0)
|
|
313
|
+
expect(SizeVarintNonZero(1, 300)).toBe(3)
|
|
314
|
+
expect(SizeVarintPtr(1, null)).toBe(0)
|
|
315
|
+
expect(SizeVarintPtr(1, $.varRef(300))).toBe(3)
|
|
316
|
+
expect(SizeVarintSlice(1, [1, 300])).toBe(5)
|
|
317
|
+
expect(SizeVarintPacked(1, [1, 300])).toBe(5)
|
|
318
|
+
|
|
319
|
+
expect(SizeZigzagValue(1, -65)).toBe(3)
|
|
320
|
+
expect(SizeZigzagNonZero(1, 0)).toBe(0)
|
|
321
|
+
expect(SizeZigzagPtr(1, $.varRef(-1))).toBe(2)
|
|
322
|
+
expect(SizeZigzagSlice(1, [-1, -65])).toBe(5)
|
|
323
|
+
expect(SizeZigzagPacked(1, [-1, -65])).toBe(5)
|
|
324
|
+
|
|
325
|
+
expect(SizeFixed32Value(1)).toBe(5)
|
|
326
|
+
expect(SizeFixed32NonZero(1, 0)).toBe(0)
|
|
327
|
+
expect(SizeFixed32Ptr(1, $.varRef(1))).toBe(5)
|
|
328
|
+
expect(SizeFixed32Slice(1, [1, 2])).toBe(10)
|
|
329
|
+
expect(SizeFixed32Packed(1, [1, 2])).toBe(10)
|
|
330
|
+
|
|
331
|
+
expect(SizeFixed64Value(1)).toBe(9)
|
|
332
|
+
expect(SizeFixed64NonZero(1, 0)).toBe(0)
|
|
333
|
+
expect(SizeFixed64Ptr(1, $.varRef(1))).toBe(9)
|
|
334
|
+
expect(SizeFixed64Slice(1, [1, 2])).toBe(18)
|
|
335
|
+
expect(SizeFixed64Packed(1, [1, 2])).toBe(18)
|
|
336
|
+
|
|
337
|
+
expect(SizeBoolValue(1)).toBe(2)
|
|
338
|
+
expect(SizeBoolNonZero(1, false)).toBe(0)
|
|
339
|
+
expect(SizeBoolPtr(1, $.varRef(false))).toBe(2)
|
|
340
|
+
expect(SizeBoolSlice(1, [true, false])).toBe(4)
|
|
341
|
+
expect(SizeBoolPacked(1, [true, false])).toBe(4)
|
|
342
|
+
|
|
343
|
+
expect(SizeStringValue(1, 'abc')).toBe(5)
|
|
344
|
+
expect(SizeStringNonEmpty(1, '')).toBe(0)
|
|
345
|
+
expect(SizeStringPtr(1, $.varRef('abc'))).toBe(5)
|
|
346
|
+
expect(SizeStringSlice(1, ['a', 'bc'])).toBe(7)
|
|
347
|
+
|
|
348
|
+
expect(SizeBytesValue(1, 3)).toBe(5)
|
|
349
|
+
expect(SizeBytesNonEmpty(1, new Uint8Array())).toBe(0)
|
|
350
|
+
expect(SizeBytesPresent(1, new Uint8Array())).toBe(2)
|
|
351
|
+
expect(
|
|
352
|
+
SizeBytesSlice(1, [new Uint8Array([1]), new Uint8Array([2, 3])]),
|
|
353
|
+
).toBe(7)
|
|
354
|
+
|
|
355
|
+
expect(SizeMessage(1, 3)).toBe(5)
|
|
356
|
+
expect(SizeGroup(1, 3)).toBe(5)
|
|
357
|
+
})
|
|
150
358
|
})
|