goscript 0.1.1 → 0.1.3
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/cmd/goscript/cmd-test.go +104 -11
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript/cmd_compile.go +9 -0
- package/compiler/compile-request.go +31 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -2
- package/compiler/config.go +2 -0
- package/compiler/gotest/package-result.go +2 -0
- package/compiler/gotest/request.go +85 -20
- package/compiler/gotest/runner.go +733 -96
- package/compiler/gotest/runner_test.go +647 -3
- package/compiler/lowered-program.go +10 -2
- package/compiler/lowering.go +2676 -349
- package/compiler/override-facts.go +77 -27
- package/compiler/override-registry.go +5 -4
- package/compiler/override-registry_test.go +178 -0
- package/compiler/package-graph_test.go +62 -7
- package/compiler/package-test-graph-variant.go +40 -16
- package/compiler/package-test-graph.go +0 -5
- package/compiler/package-test-graph_test.go +61 -3
- package/compiler/runtime-contract.go +40 -0
- package/compiler/semantic-model-types.go +16 -0
- package/compiler/semantic-model.go +336 -91
- package/compiler/semantic-model_test.go +50 -1
- package/compiler/service.go +9 -3
- package/compiler/skeleton_test.go +2371 -296
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +8 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +149 -10
- package/dist/gs/builtin/builtin.d.ts +20 -1
- package/dist/gs/builtin/builtin.js +246 -26
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +24 -10
- package/dist/gs/builtin/channel.js +143 -34
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +43 -9
- package/dist/gs/builtin/slice.js +437 -234
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +2 -0
- package/dist/gs/builtin/type.js +55 -10
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +2 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +28 -28
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.gs.d.ts +7 -5
- package/dist/gs/bytes/bytes.gs.js +10 -4
- package/dist/gs/bytes/bytes.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +1 -1
- package/dist/gs/context/context.js +8 -3
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha1/index.d.ts +5 -0
- package/dist/gs/crypto/sha1/index.js +106 -0
- package/dist/gs/crypto/sha1/index.js.map +1 -0
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +15 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.js +29 -6
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +1 -1
- package/dist/gs/fmt/fmt.js +64 -3
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
- 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.js +56 -20
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/token/index.js +11 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/io/fs/readlink.js +2 -6
- package/dist/gs/io/fs/readlink.js.map +1 -1
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +8 -5
- package/dist/gs/io/io.js +20 -2
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/math/bits/index.js +14 -24
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.js +3 -1
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +20 -1
- package/dist/gs/net/http/httptest/index.js +85 -3
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +118 -6
- package/dist/gs/net/http/index.js +389 -14
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/zero_copy_posix.gs.js +1 -1
- package/dist/gs/os/zero_copy_posix.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +5 -3
- package/dist/gs/path/filepath/path.js +65 -10
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +3 -2
- package/dist/gs/reflect/index.js +2 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +26 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +24 -5
- package/dist/gs/reflect/type.js +390 -38
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +39 -0
- package/dist/gs/runtime/debug/index.js +58 -0
- package/dist/gs/runtime/debug/index.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +24 -9
- package/dist/gs/slices/slices.js +229 -24
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +55 -17
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/strings/builder.js +26 -17
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +6 -3
- package/dist/gs/sync/sync.js +39 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +116 -112
- package/dist/gs/syscall/errors.js +38 -1
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +2 -8
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.js +20 -12
- package/dist/gs/syscall/js/index.js.map +1 -1
- package/dist/gs/syscall/types.d.ts +4 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/testing.d.ts +4 -3
- package/dist/gs/testing/testing.js +21 -4
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.js +22 -0
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unique/index.js +7 -2
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +8 -8
- package/go.sum +14 -23
- package/gs/builtin/builtin.ts +364 -37
- package/gs/builtin/channel.ts +208 -38
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +290 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +566 -255
- package/gs/builtin/type.ts +63 -10
- package/gs/builtin/varRef.ts +2 -0
- package/gs/bytes/buffer.gs.ts +28 -28
- package/gs/bytes/bytes.gs.ts +19 -10
- package/gs/bytes/bytes.test.ts +17 -0
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +36 -2
- package/gs/context/context.ts +9 -4
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha1/index.test.ts +28 -0
- package/gs/crypto/sha1/index.ts +130 -0
- package/gs/crypto/sha1/meta.json +8 -0
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/encoding/json/index.test.ts +25 -3
- package/gs/encoding/json/index.ts +21 -3
- package/gs/errors/errors.test.ts +4 -1
- package/gs/errors/errors.ts +32 -8
- package/gs/fmt/fmt.test.ts +23 -1
- package/gs/fmt/fmt.ts +76 -10
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
- package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/token/index.ts +17 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/byteorder/index.test.ts +6 -6
- package/gs/io/fs/readlink.ts +40 -48
- package/gs/io/fs/walk.ts +10 -2
- package/gs/io/io.test.ts +64 -0
- package/gs/io/io.ts +34 -13
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +69 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +6 -6
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +15 -28
- package/gs/mime/index.ts +8 -2
- package/gs/net/http/httptest/index.test.ts +85 -0
- package/gs/net/http/httptest/index.ts +113 -3
- package/gs/net/http/index.test.ts +159 -1
- package/gs/net/http/index.ts +515 -15
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +94 -15
- package/gs/os/zero_copy_posix.gs.ts +1 -2
- package/gs/path/filepath/match.ts +4 -1
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +57 -2
- package/gs/path/filepath/path.ts +91 -12
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +4 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +24 -2
- package/gs/reflect/map.ts +35 -0
- package/gs/reflect/type.ts +543 -60
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +22 -1
- package/gs/runtime/debug/index.ts +88 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +86 -0
- package/gs/slices/slices.ts +284 -37
- package/gs/sort/slice.gs.ts +73 -23
- package/gs/sort/slice.test.ts +40 -0
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +29 -17
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/meta.json +1 -0
- package/gs/sync/sync.test.ts +57 -1
- package/gs/sync/sync.ts +45 -13
- package/gs/syscall/errors.ts +158 -115
- package/gs/syscall/fs.ts +8 -8
- package/gs/syscall/js/index.ts +49 -22
- package/gs/syscall/net.test.ts +26 -0
- package/gs/syscall/types.ts +7 -2
- package/gs/testing/testing.test.ts +56 -0
- package/gs/testing/testing.ts +27 -10
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +4 -0
- package/gs/time/time.ts +33 -2
- package/gs/unicode/unicode.test.ts +14 -3
- package/gs/unicode/unicode.ts +1 -5
- package/gs/unique/index.ts +9 -2
- package/package.json +3 -3
package/gs/fmt/fmt.ts
CHANGED
|
@@ -408,11 +408,7 @@ export function Append(b: $.Bytes, ...a: any[]): $.Bytes {
|
|
|
408
408
|
return newArray
|
|
409
409
|
}
|
|
410
410
|
|
|
411
|
-
export function Appendf(
|
|
412
|
-
b: $.Bytes,
|
|
413
|
-
format: string,
|
|
414
|
-
...a: any[]
|
|
415
|
-
): $.Bytes {
|
|
411
|
+
export function Appendf(b: $.Bytes, format: string, ...a: any[]): $.Bytes {
|
|
416
412
|
const result = parseFormat(format, a)
|
|
417
413
|
const encoded = new TextEncoder().encode(result)
|
|
418
414
|
const base = $.bytesToUint8Array(b)
|
|
@@ -492,12 +488,82 @@ export function Sscan(_str: string, ..._a: any[]): [number, $.GoError | null] {
|
|
|
492
488
|
}
|
|
493
489
|
|
|
494
490
|
export function Sscanf(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
...
|
|
491
|
+
str: string,
|
|
492
|
+
format: string,
|
|
493
|
+
...a: any[]
|
|
498
494
|
): [number, $.GoError | null] {
|
|
499
|
-
|
|
500
|
-
|
|
495
|
+
const parts = buildScanPattern(format)
|
|
496
|
+
if (parts == null) {
|
|
497
|
+
return [0, $.newError(`unsupported Sscanf format: ${format}`)]
|
|
498
|
+
}
|
|
499
|
+
const match = parts.pattern.exec(str)
|
|
500
|
+
if (match == null) {
|
|
501
|
+
return [0, $.newError('input does not match format')]
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
let assigned = 0
|
|
505
|
+
for (let i = 0; i < parts.verbs.length && i < a.length; i++) {
|
|
506
|
+
const raw = match[i + 1]
|
|
507
|
+
const value = parts.verbs[i] === 'd' ? Number.parseInt(raw, 10) : raw
|
|
508
|
+
if (!assignScanValue(a[i], value)) {
|
|
509
|
+
return [assigned, $.newError('scan destination is not assignable')]
|
|
510
|
+
}
|
|
511
|
+
assigned++
|
|
512
|
+
}
|
|
513
|
+
return [assigned, null]
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function buildScanPattern(
|
|
517
|
+
format: string,
|
|
518
|
+
): { pattern: RegExp; verbs: string[] } | null {
|
|
519
|
+
let source = '^'
|
|
520
|
+
const verbs: string[] = []
|
|
521
|
+
for (let i = 0; i < format.length; i++) {
|
|
522
|
+
const ch = format[i]
|
|
523
|
+
if (ch !== '%') {
|
|
524
|
+
source += /\s/.test(ch) ? '\\s+' : escapeRegExp(ch)
|
|
525
|
+
continue
|
|
526
|
+
}
|
|
527
|
+
const verb = format[++i]
|
|
528
|
+
if (verb === '%') {
|
|
529
|
+
source += '%'
|
|
530
|
+
continue
|
|
531
|
+
}
|
|
532
|
+
if (verb === 'd') {
|
|
533
|
+
source += '([+-]?\\d+)'
|
|
534
|
+
verbs.push(verb)
|
|
535
|
+
continue
|
|
536
|
+
}
|
|
537
|
+
if (verb === 's') {
|
|
538
|
+
source += '(\\S+)'
|
|
539
|
+
verbs.push(verb)
|
|
540
|
+
continue
|
|
541
|
+
}
|
|
542
|
+
return null
|
|
543
|
+
}
|
|
544
|
+
source += '$'
|
|
545
|
+
return { pattern: new RegExp(source), verbs }
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
function assignScanValue(target: any, value: string | number): boolean {
|
|
549
|
+
const ref =
|
|
550
|
+
$.isVarRef(target) ? target
|
|
551
|
+
: (
|
|
552
|
+
target != null &&
|
|
553
|
+
typeof target === 'object' &&
|
|
554
|
+
$.isVarRef(target.__goValue)
|
|
555
|
+
) ?
|
|
556
|
+
target.__goValue
|
|
557
|
+
: null
|
|
558
|
+
if (ref == null) {
|
|
559
|
+
return false
|
|
560
|
+
}
|
|
561
|
+
ref.value = value
|
|
562
|
+
return true
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
function escapeRegExp(ch: string): string {
|
|
566
|
+
return ch.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
|
|
501
567
|
}
|
|
502
568
|
|
|
503
569
|
export function Sscanln(
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
|
|
3
|
+
import * as $ from '../../../builtin/index.js'
|
|
3
4
|
import {
|
|
4
5
|
AppendVarint,
|
|
6
|
+
type CloneMessage,
|
|
5
7
|
CompareEqualVT,
|
|
8
|
+
ConsumeVarint,
|
|
6
9
|
DecodeFixed32,
|
|
7
10
|
DecodeFixed64,
|
|
8
11
|
DecodeVarint,
|
|
@@ -13,6 +16,7 @@ import {
|
|
|
13
16
|
ErrIntOverflow,
|
|
14
17
|
ErrInvalidLength,
|
|
15
18
|
ErrUnexpectedEndOfGroup,
|
|
19
|
+
IsEqualVTSlice,
|
|
16
20
|
SizeOfVarint,
|
|
17
21
|
Skip,
|
|
18
22
|
} from './index.js'
|
|
@@ -25,6 +29,30 @@ class TestValue {
|
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
|
|
32
|
+
class TestCloneMessage implements CloneMessage {
|
|
33
|
+
SizeVT(): number {
|
|
34
|
+
return 0
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
MarshalToSizedBufferVT(): [$.Slice<number>, $.GoError] {
|
|
38
|
+
return [null, null]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
MarshalVT(): [$.Slice<number>, $.GoError] {
|
|
42
|
+
return [null, null]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
UnmarshalVT(): $.GoError {
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Reset(): void {}
|
|
50
|
+
|
|
51
|
+
CloneMessageVT(): CloneMessage | null {
|
|
52
|
+
return new TestCloneMessage()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
28
56
|
describe('protobuf-go-lite EqualVT helpers', () => {
|
|
29
57
|
it('accepts compiler-emitted runtime type arguments', () => {
|
|
30
58
|
const equal = CompareEqualVT<TestValue>({
|
|
@@ -35,6 +63,31 @@ describe('protobuf-go-lite EqualVT helpers', () => {
|
|
|
35
63
|
expect(equal(new TestValue('a'), new TestValue('b'))).toBe(false)
|
|
36
64
|
expect(equal(null, null)).toBe(true)
|
|
37
65
|
})
|
|
66
|
+
|
|
67
|
+
it('accepts nullable generated message slices', () => {
|
|
68
|
+
const left: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
|
|
69
|
+
$.varRef(new TestValue('x')),
|
|
70
|
+
null,
|
|
71
|
+
]
|
|
72
|
+
const right: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
|
|
73
|
+
new TestValue('x'),
|
|
74
|
+
null,
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
expect(IsEqualVTSlice(left, right)).toBe(true)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
describe('protobuf-go-lite runtime interfaces', () => {
|
|
82
|
+
it('registers CloneMessage metadata for Go type assertions', () => {
|
|
83
|
+
const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
|
|
84
|
+
new TestCloneMessage(),
|
|
85
|
+
'protobuf_go_lite.CloneMessage',
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
expect(ok).toBe(true)
|
|
89
|
+
expect(value?.CloneMessageVT()).toBeInstanceOf(TestCloneMessage)
|
|
90
|
+
})
|
|
38
91
|
})
|
|
39
92
|
|
|
40
93
|
describe('protobuf-go-lite wire helpers', () => {
|
|
@@ -50,9 +103,14 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
50
103
|
expect(DecodeVarintInt32(buf, offset)).toEqual([300, 4, null])
|
|
51
104
|
expect(DecodeVarintInt64(buf, offset)).toEqual([300, 4, null])
|
|
52
105
|
expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
|
|
53
|
-
expect(Array.from(AppendVarint([], 300) as number[])).toEqual([
|
|
54
|
-
|
|
55
|
-
|
|
106
|
+
expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
|
|
107
|
+
expect(SizeOfVarint(0xffffffffffffffffn)).toBe(10)
|
|
108
|
+
expect(Array.from(AppendVarint([], 0xffffffffffffffffn) as number[])).toEqual([
|
|
109
|
+
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
|
|
110
|
+
])
|
|
111
|
+
expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
|
|
112
|
+
0xffffffffffffffffn,
|
|
113
|
+
10,
|
|
56
114
|
])
|
|
57
115
|
})
|
|
58
116
|
|
|
@@ -80,10 +138,7 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
80
138
|
5,
|
|
81
139
|
null,
|
|
82
140
|
])
|
|
83
|
-
expect(Skip(new Uint8Array([0x0c]))).toEqual([
|
|
84
|
-
0,
|
|
85
|
-
ErrUnexpectedEndOfGroup,
|
|
86
|
-
])
|
|
141
|
+
expect(Skip(new Uint8Array([0x0c]))).toEqual([0, ErrUnexpectedEndOfGroup])
|
|
87
142
|
})
|
|
88
143
|
|
|
89
144
|
it('reports protobuf wire errors as Go errors', () => {
|
|
@@ -16,15 +16,37 @@ export interface Message {
|
|
|
16
16
|
Reset(): void
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
$.registerInterfaceType('protobuf_go_lite.Message', null, [
|
|
20
|
+
{ name: 'SizeVT', args: [], returns: [] },
|
|
21
|
+
{ name: 'MarshalToSizedBufferVT', args: [], returns: [] },
|
|
22
|
+
{ name: 'MarshalVT', args: [], returns: [] },
|
|
23
|
+
{ name: 'UnmarshalVT', args: [], returns: [] },
|
|
24
|
+
{ name: 'Reset', args: [], returns: [] },
|
|
25
|
+
])
|
|
26
|
+
|
|
19
27
|
export interface JSONMessage {
|
|
20
28
|
MarshalJSON(): [$.Slice<number>, $.GoError]
|
|
21
29
|
UnmarshalJSON(data: $.Slice<number>): $.GoError
|
|
22
30
|
}
|
|
23
31
|
|
|
32
|
+
$.registerInterfaceType('protobuf_go_lite.JSONMessage', null, [
|
|
33
|
+
{ name: 'MarshalJSON', args: [], returns: [] },
|
|
34
|
+
{ name: 'UnmarshalJSON', args: [], returns: [] },
|
|
35
|
+
])
|
|
36
|
+
|
|
24
37
|
export interface CloneMessage extends Message {
|
|
25
38
|
CloneMessageVT(): CloneMessage | null
|
|
26
39
|
}
|
|
27
40
|
|
|
41
|
+
$.registerInterfaceType('protobuf_go_lite.CloneMessage', null, [
|
|
42
|
+
{ name: 'SizeVT', args: [], returns: [] },
|
|
43
|
+
{ name: 'MarshalToSizedBufferVT', args: [], returns: [] },
|
|
44
|
+
{ name: 'MarshalVT', args: [], returns: [] },
|
|
45
|
+
{ name: 'UnmarshalVT', args: [], returns: [] },
|
|
46
|
+
{ name: 'Reset', args: [], returns: [] },
|
|
47
|
+
{ name: 'CloneMessageVT', args: [], returns: [] },
|
|
48
|
+
])
|
|
49
|
+
|
|
28
50
|
export interface CloneVT<T> extends CloneMessage {
|
|
29
51
|
CloneVT(): T
|
|
30
52
|
}
|
|
@@ -37,37 +59,37 @@ export function CompareComparable<T>(): (t1: T, t2: T) => boolean {
|
|
|
37
59
|
return (t1, t2) => t1 === t2
|
|
38
60
|
}
|
|
39
61
|
|
|
40
|
-
export function IsEqualVT<T
|
|
41
|
-
t1: T | null,
|
|
42
|
-
t2: T | null,
|
|
62
|
+
export function IsEqualVT<T>(
|
|
63
|
+
t1: T | $.VarRef<T> | null,
|
|
64
|
+
t2: T | $.VarRef<T> | null,
|
|
43
65
|
): boolean
|
|
44
|
-
export function IsEqualVT<T
|
|
66
|
+
export function IsEqualVT<T>(
|
|
45
67
|
_typeArgs: unknown,
|
|
46
|
-
t1: T | null,
|
|
47
|
-
t2: T | null,
|
|
68
|
+
t1: T | $.VarRef<T> | null,
|
|
69
|
+
t2: T | $.VarRef<T> | null,
|
|
48
70
|
): boolean
|
|
49
|
-
export function IsEqualVT<T
|
|
71
|
+
export function IsEqualVT<T>(
|
|
50
72
|
arg0: unknown,
|
|
51
|
-
arg1: T | null,
|
|
52
|
-
arg2?: T | null,
|
|
73
|
+
arg1: T | $.VarRef<T> | null,
|
|
74
|
+
arg2?: T | $.VarRef<T> | null,
|
|
53
75
|
): boolean {
|
|
54
|
-
const t1 = arg2 === undefined ? (arg0 as T | null) : arg1
|
|
55
|
-
const t2 = arg2 === undefined ? arg1 : arg2
|
|
76
|
+
const t1 = $.pointerValueOrNil(arg2 === undefined ? (arg0 as T | $.VarRef<T> | null) : arg1)
|
|
77
|
+
const t2 = $.pointerValueOrNil(arg2 === undefined ? arg1 : arg2)
|
|
56
78
|
if (t1 == null || t2 == null) {
|
|
57
79
|
return t1 == t2
|
|
58
80
|
}
|
|
59
|
-
return t1.EqualVT(t2)
|
|
81
|
+
return (t1 as unknown as EqualVT<T>).EqualVT(t2)
|
|
60
82
|
}
|
|
61
83
|
|
|
62
|
-
export function CompareEqualVT<T
|
|
84
|
+
export function CompareEqualVT<T>(
|
|
63
85
|
_typeArgs?: unknown,
|
|
64
|
-
): (t1: T | null, t2: T | null) => boolean {
|
|
86
|
+
): (t1: T | $.VarRef<T> | null, t2: T | $.VarRef<T> | null) => boolean {
|
|
65
87
|
return (t1, t2) => IsEqualVT(t1, t2)
|
|
66
88
|
}
|
|
67
89
|
|
|
68
|
-
export function IsEqualVTSlice<T
|
|
69
|
-
s1: $.Slice<T>,
|
|
70
|
-
s2: $.Slice<T>,
|
|
90
|
+
export function IsEqualVTSlice<T>(
|
|
91
|
+
s1: $.Slice<T | $.VarRef<T> | null>,
|
|
92
|
+
s2: $.Slice<T | $.VarRef<T> | null>,
|
|
71
93
|
): boolean {
|
|
72
94
|
if ($.len(s1) !== $.len(s2)) {
|
|
73
95
|
return false
|
|
@@ -83,58 +105,78 @@ export function IsEqualVTSlice<T extends EqualVT<T>>(
|
|
|
83
105
|
export function EncodeVarint(
|
|
84
106
|
dAtA: $.Slice<number>,
|
|
85
107
|
offset: number,
|
|
86
|
-
v: number,
|
|
108
|
+
v: number | bigint,
|
|
87
109
|
): number {
|
|
88
110
|
offset -= SizeOfVarint(v)
|
|
89
111
|
const base = offset
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
112
|
+
let value = normalizedVarint(v)
|
|
113
|
+
while (value >= 0x80n) {
|
|
114
|
+
setByte(dAtA, offset, Number((value & 0x7fn) | 0x80n))
|
|
115
|
+
value >>= 7n
|
|
93
116
|
offset++
|
|
94
117
|
}
|
|
95
|
-
setByte(dAtA, offset,
|
|
118
|
+
setByte(dAtA, offset, Number(value))
|
|
96
119
|
return base
|
|
97
120
|
}
|
|
98
121
|
|
|
99
|
-
export function AppendVarint(
|
|
122
|
+
export function AppendVarint(
|
|
123
|
+
b: $.Slice<number>,
|
|
124
|
+
v: number | bigint,
|
|
125
|
+
): $.Slice<number> {
|
|
100
126
|
const bytes: number[] = []
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
127
|
+
let value = normalizedVarint(v)
|
|
128
|
+
while (value >= 0x80n) {
|
|
129
|
+
bytes.push(Number((value & 0x7fn) | 0x80n))
|
|
130
|
+
value >>= 7n
|
|
104
131
|
}
|
|
105
|
-
bytes.push(
|
|
132
|
+
bytes.push(Number(value))
|
|
106
133
|
return $.append(b, ...bytes)
|
|
107
134
|
}
|
|
108
135
|
|
|
109
136
|
export function ConsumeVarint(b: $.Slice<number>): [number, number] {
|
|
110
|
-
let v =
|
|
111
|
-
let shift =
|
|
137
|
+
let v = 0n
|
|
138
|
+
let shift = 0n
|
|
112
139
|
for (let i = 0; i < 10; i++) {
|
|
113
140
|
if (i >= $.len(b)) {
|
|
114
141
|
return [0, -1]
|
|
115
142
|
}
|
|
116
143
|
const value = byteSliceValue(b, i)
|
|
117
|
-
if (shift ===
|
|
144
|
+
if (shift === 63n && value > 1) {
|
|
118
145
|
return [0, -2]
|
|
119
146
|
}
|
|
120
|
-
v += (value & 0x7f)
|
|
147
|
+
v += BigInt(value & 0x7f) << shift
|
|
121
148
|
if (value < 0x80) {
|
|
122
|
-
return [v, i + 1]
|
|
149
|
+
return [varintResult(v), i + 1]
|
|
123
150
|
}
|
|
124
|
-
shift +=
|
|
151
|
+
shift += 7n
|
|
125
152
|
}
|
|
126
153
|
return [0, -2]
|
|
127
154
|
}
|
|
128
155
|
|
|
129
|
-
export function SizeOfVarint(x: number): number {
|
|
156
|
+
export function SizeOfVarint(x: number | bigint): number {
|
|
157
|
+
let value = normalizedVarint(x)
|
|
130
158
|
let n = 1
|
|
131
|
-
while (
|
|
132
|
-
|
|
159
|
+
while (value >= 0x80n) {
|
|
160
|
+
value >>= 7n
|
|
133
161
|
n++
|
|
134
162
|
}
|
|
135
163
|
return n
|
|
136
164
|
}
|
|
137
165
|
|
|
166
|
+
function normalizedVarint(value: number | bigint): bigint {
|
|
167
|
+
if (typeof value === 'bigint') {
|
|
168
|
+
return BigInt.asUintN(64, value)
|
|
169
|
+
}
|
|
170
|
+
return BigInt.asUintN(64, BigInt(Math.trunc(value)))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function varintResult(value: bigint): number {
|
|
174
|
+
if (value <= BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
175
|
+
return Number(value)
|
|
176
|
+
}
|
|
177
|
+
return value as unknown as number
|
|
178
|
+
}
|
|
179
|
+
|
|
138
180
|
export function DecodeVarint(
|
|
139
181
|
b: $.Slice<number>,
|
|
140
182
|
idx: number,
|
|
@@ -78,10 +78,11 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
78
78
|
a: new TestMessage('one', 1),
|
|
79
79
|
b: new TestMessage('two', 2),
|
|
80
80
|
})
|
|
81
|
-
const [sliceData, sliceErr] = MarshalSlice(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
const [sliceData, sliceErr] = MarshalSlice(
|
|
82
|
+
undefined,
|
|
83
|
+
DefaultMarshalerConfig,
|
|
84
|
+
[new TestMessage('one', 1), new TestMessage('two', 2)],
|
|
85
|
+
)
|
|
85
86
|
|
|
86
87
|
expect(mapErr).toBeNull()
|
|
87
88
|
expect(sliceErr).toBeNull()
|
|
@@ -99,7 +100,10 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
99
100
|
jsonBytes('{"name":"ok","count":"42"}'),
|
|
100
101
|
msg,
|
|
101
102
|
)
|
|
102
|
-
const state = NewUnmarshalState(
|
|
103
|
+
const state = NewUnmarshalState(
|
|
104
|
+
jsonBytes('["Zm9vYg==","YXI="]'),
|
|
105
|
+
DefaultUnmarshalerConfig,
|
|
106
|
+
)
|
|
103
107
|
|
|
104
108
|
expect(err).toBeNull()
|
|
105
109
|
expect(msg).toEqual(new TestMessage('ok', 42))
|
|
@@ -120,7 +124,10 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
120
124
|
|
|
121
125
|
it('accepts raw wrapped values and object wrapped values', () => {
|
|
122
126
|
const raw = NewUnmarshalState(jsonBytes('"abc"'), DefaultUnmarshalerConfig)
|
|
123
|
-
const object = NewUnmarshalState(
|
|
127
|
+
const object = NewUnmarshalState(
|
|
128
|
+
jsonBytes('{"value": "def"}'),
|
|
129
|
+
DefaultUnmarshalerConfig,
|
|
130
|
+
)
|
|
124
131
|
|
|
125
132
|
expect(raw?.ReadWrappedString()).toBe('abc')
|
|
126
133
|
expect(raw?.Err()).toBeNull()
|
|
@@ -129,13 +136,18 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
129
136
|
})
|
|
130
137
|
|
|
131
138
|
it('reads and writes protobuf timestamp values as time.Time pointers', () => {
|
|
132
|
-
const state = NewUnmarshalState(
|
|
139
|
+
const state = NewUnmarshalState(
|
|
140
|
+
jsonBytes('"2025-05-15T01:10:42Z"'),
|
|
141
|
+
DefaultUnmarshalerConfig,
|
|
142
|
+
)
|
|
133
143
|
const parsed = state?.ReadTime()
|
|
134
144
|
const jsonStream = new JsonStream()
|
|
135
145
|
const stream = new MarshalState({ stream: jsonStream })
|
|
136
146
|
|
|
137
147
|
expect(state?.Err()).toBeNull()
|
|
138
|
-
expect($.pointerValue(parsed)?.Format(time.RFC3339)).toBe(
|
|
148
|
+
expect($.pointerValue(parsed)?.Format(time.RFC3339)).toBe(
|
|
149
|
+
'2025-05-15T01:10:42Z',
|
|
150
|
+
)
|
|
139
151
|
|
|
140
152
|
stream.WriteTime(parsed ?? null)
|
|
141
153
|
|
|
@@ -144,9 +156,18 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
144
156
|
})
|
|
145
157
|
|
|
146
158
|
it('rejects invalid bool and numeric map keys', () => {
|
|
147
|
-
const boolState = NewUnmarshalState(
|
|
148
|
-
|
|
149
|
-
|
|
159
|
+
const boolState = NewUnmarshalState(
|
|
160
|
+
jsonBytes('{"yes": 1}'),
|
|
161
|
+
DefaultUnmarshalerConfig,
|
|
162
|
+
)
|
|
163
|
+
const intState = NewUnmarshalState(
|
|
164
|
+
jsonBytes('{"1.5": 1}'),
|
|
165
|
+
DefaultUnmarshalerConfig,
|
|
166
|
+
)
|
|
167
|
+
const uintState = NewUnmarshalState(
|
|
168
|
+
jsonBytes('{"-1": 1}'),
|
|
169
|
+
DefaultUnmarshalerConfig,
|
|
170
|
+
)
|
|
150
171
|
|
|
151
172
|
boolState?.ReadBoolMap(() => {})
|
|
152
173
|
intState?.ReadInt32Map(() => {})
|