goscript 0.1.0 → 0.1.2
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 +286 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +9 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +33 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -10
- package/compiler/config.go +2 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +69 -0
- package/compiler/gotest/request.go +210 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +1225 -0
- package/compiler/gotest/runner_test.go +1271 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +80 -21
- package/compiler/lowering.go +6754 -602
- package/compiler/override-facts.go +357 -0
- package/compiler/override-registry.go +52 -190
- package/compiler/override-registry_test.go +182 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +99 -9
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +129 -0
- package/compiler/package-test-graph.go +112 -0
- package/compiler/package-test-graph_test.go +202 -0
- package/compiler/runtime-contract.go +229 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +25 -6
- package/compiler/semantic-model.go +819 -74
- package/compiler/semantic-model_test.go +104 -0
- package/compiler/service.go +10 -4
- package/compiler/skeleton_test.go +2777 -524
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +342 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +576 -86
- 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 +40 -3
- package/dist/gs/builtin/builtin.js +430 -22
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +32 -10
- package/dist/gs/builtin/channel.js +119 -25
- 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 +64 -10
- package/dist/gs/builtin/slice.js +619 -244
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +7 -2
- package/dist/gs/builtin/type.js +128 -29
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +7 -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 +74 -70
- package/dist/gs/bytes/buffer.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/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.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 +6 -5
- package/dist/gs/context/context.js +17 -12
- 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/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/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/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/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 +4 -0
- package/dist/gs/encoding/json/index.js +33 -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 +108 -4
- 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 +37 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -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 +861 -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 +217 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- 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.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- 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/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 +507 -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/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 +60 -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/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/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 +70 -48
- 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 +52 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +30 -0
- package/dist/gs/net/http/httptest/index.js +101 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +131 -0
- package/dist/gs/net/http/index.js +307 -0
- package/dist/gs/net/http/index.js.map +1 -0
- 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/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- 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/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +8 -4
- package/dist/gs/path/filepath/path.js +192 -8
- 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 +4 -3
- package/dist/gs/reflect/index.js +3 -2
- 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 +29 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +31 -9
- package/dist/gs/reflect/type.js +536 -43
- 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 +41 -0
- package/dist/gs/runtime/debug/index.js +66 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- 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/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/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 +42 -8
- package/dist/gs/slices/slices.js +425 -11
- 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 +60 -22
- 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 +29 -19
- 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/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 +8 -3
- package/dist/gs/sync/sync.js +66 -11
- 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 +117 -111
- package/dist/gs/syscall/errors.js +45 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +37 -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 +383 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +26 -1
- 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 +78 -0
- package/dist/gs/testing/testing.js +318 -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 +227 -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 +76 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +8 -8
- package/go.sum +14 -14
- package/gs/builtin/builtin.ts +585 -27
- package/gs/builtin/channel.ts +183 -29
- 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 +383 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +785 -265
- package/gs/builtin/type.ts +160 -41
- package/gs/builtin/varRef.ts +40 -1
- package/gs/bytes/buffer.gs.ts +74 -70
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- 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 +71 -0
- package/gs/context/context.ts +30 -29
- 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/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -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/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/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +39 -3
- package/gs/encoding/json/index.ts +45 -3
- package/gs/errors/errors.test.ts +85 -0
- package/gs/errors/errors.ts +132 -4
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +55 -19
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -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 +37 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
- 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/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 +583 -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/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 +69 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +17 -9
- package/gs/io/io.ts +177 -31
- package/gs/io/meta.json +10 -2
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +75 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +13 -11
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +107 -64
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +60 -0
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +120 -0
- package/gs/net/http/index.test.ts +148 -0
- package/gs/net/http/index.ts +432 -0
- 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/dir_unix.gs.ts +2 -3
- 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 +96 -17
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +181 -3
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +80 -0
- package/gs/path/filepath/path.ts +244 -11
- package/gs/path/path.ts +20 -5
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +5 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +42 -1
- package/gs/reflect/map.ts +39 -0
- package/gs/reflect/type.ts +728 -65
- 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 +45 -0
- package/gs/runtime/debug/index.ts +96 -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/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- 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 +180 -0
- package/gs/slices/slices.ts +502 -15
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +85 -26
- package/gs/sort/slice.test.ts +40 -0
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +33 -20
- 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/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +69 -1
- package/gs/sync/sync.ts +72 -13
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +165 -112
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +485 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +111 -0
- package/gs/syscall/types.ts +63 -2
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +146 -0
- package/gs/testing/testing.ts +399 -0
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +110 -0
- package/gs/time/time.ts +309 -57
- package/gs/unicode/unicode.test.ts +36 -0
- package/gs/unicode/unicode.ts +115 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +98 -0
- package/package.json +3 -2
|
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'
|
|
|
2
2
|
|
|
3
3
|
import * as $ from '@goscript/builtin/index.js'
|
|
4
4
|
|
|
5
|
-
import { Marshal, Unmarshal } from './index.js'
|
|
5
|
+
import { Marshal, MarshalIndent, Unmarshal, type Unmarshaler } from './index.js'
|
|
6
6
|
|
|
7
7
|
class Person {
|
|
8
8
|
public _fields = {
|
|
@@ -17,14 +17,36 @@ class Person {
|
|
|
17
17
|
[],
|
|
18
18
|
Person,
|
|
19
19
|
{
|
|
20
|
-
Name: {
|
|
20
|
+
Name: {
|
|
21
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
22
|
+
tag: 'json:"name"',
|
|
23
|
+
},
|
|
21
24
|
Age: { type: { kind: $.TypeKind.Basic, name: 'int' }, tag: 'json:"age"' },
|
|
22
|
-
Active: {
|
|
25
|
+
Active: {
|
|
26
|
+
type: { kind: $.TypeKind.Basic, name: 'bool' },
|
|
27
|
+
tag: 'json:"active"',
|
|
28
|
+
},
|
|
23
29
|
},
|
|
24
30
|
)
|
|
25
31
|
}
|
|
26
32
|
|
|
27
33
|
describe('encoding/json override', () => {
|
|
34
|
+
it('registers the Unmarshaler interface shape', () => {
|
|
35
|
+
class CustomUnmarshaler implements Unmarshaler {
|
|
36
|
+
UnmarshalJSON(_data: $.Slice<number>): $.GoError {
|
|
37
|
+
return null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const [value, ok] = $.typeAssertTuple<Unmarshaler>(
|
|
42
|
+
new CustomUnmarshaler(),
|
|
43
|
+
'json.Unmarshaler',
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
expect(ok).toBe(true)
|
|
47
|
+
expect(value.UnmarshalJSON($.stringToBytes('{}'))).toBeNull()
|
|
48
|
+
})
|
|
49
|
+
|
|
28
50
|
it('marshals struct fields through json tags', () => {
|
|
29
51
|
const person = new Person()
|
|
30
52
|
person._fields.Name.value = 'Alice'
|
|
@@ -39,6 +61,20 @@ describe('encoding/json override', () => {
|
|
|
39
61
|
)
|
|
40
62
|
})
|
|
41
63
|
|
|
64
|
+
it('marshals indented JSON with a line prefix', () => {
|
|
65
|
+
const person = new Person()
|
|
66
|
+
person._fields.Name.value = 'Alice'
|
|
67
|
+
person._fields.Age.value = 30
|
|
68
|
+
person._fields.Active.value = true
|
|
69
|
+
|
|
70
|
+
const [data, err] = MarshalIndent(person, '> ', ' ')
|
|
71
|
+
|
|
72
|
+
expect(err).toBeNull()
|
|
73
|
+
expect($.bytesToString(data)).toBe(
|
|
74
|
+
'{\n> "name": "Alice",\n> "age": 30,\n> "active": true\n> }',
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
|
|
42
78
|
it('unmarshals into struct and map pointers', () => {
|
|
43
79
|
const person = $.varRef(new Person())
|
|
44
80
|
const personErr = Unmarshal(
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
2
|
|
|
3
|
+
export interface Unmarshaler {
|
|
4
|
+
UnmarshalJSON(data: $.Slice<number>): $.GoError
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
$.registerInterfaceType('json.Unmarshaler', null, [
|
|
8
|
+
{
|
|
9
|
+
name: 'UnmarshalJSON',
|
|
10
|
+
args: [
|
|
11
|
+
{
|
|
12
|
+
name: 'data',
|
|
13
|
+
type: {
|
|
14
|
+
kind: $.TypeKind.Slice,
|
|
15
|
+
elemType: { kind: $.TypeKind.Basic, name: 'uint8' },
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
returns: [{ type: 'GoError' }],
|
|
20
|
+
},
|
|
21
|
+
])
|
|
22
|
+
|
|
3
23
|
export function Marshal(v: unknown): [$.Slice<number>, $.GoError] {
|
|
4
24
|
try {
|
|
5
25
|
return [$.stringToBytes(JSON.stringify(marshalValue(v))), null]
|
|
@@ -8,6 +28,30 @@ export function Marshal(v: unknown): [$.Slice<number>, $.GoError] {
|
|
|
8
28
|
}
|
|
9
29
|
}
|
|
10
30
|
|
|
31
|
+
export function MarshalIndent(
|
|
32
|
+
v: unknown,
|
|
33
|
+
prefix: string,
|
|
34
|
+
indent: string,
|
|
35
|
+
): [$.Slice<number>, $.GoError] {
|
|
36
|
+
try {
|
|
37
|
+
const text = JSON.stringify(marshalValue(v), null, indent)
|
|
38
|
+
if (prefix === '') {
|
|
39
|
+
return [$.stringToBytes(text), null]
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
$.stringToBytes(
|
|
43
|
+
text
|
|
44
|
+
.split('\n')
|
|
45
|
+
.map((line, idx) => (idx === 0 ? line : prefix + line))
|
|
46
|
+
.join('\n'),
|
|
47
|
+
),
|
|
48
|
+
null,
|
|
49
|
+
]
|
|
50
|
+
} catch (err) {
|
|
51
|
+
return [null, goError(err)]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
11
55
|
export function Unmarshal(data: $.Slice<number>, v: unknown): $.GoError {
|
|
12
56
|
try {
|
|
13
57
|
assignDecodedValue(v, JSON.parse($.bytesToString(data)))
|
|
@@ -123,9 +167,7 @@ function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
|
123
167
|
)
|
|
124
168
|
}
|
|
125
169
|
|
|
126
|
-
function structFieldMetadata(
|
|
127
|
-
value: unknown,
|
|
128
|
-
): Record<string, { tag?: string }> {
|
|
170
|
+
function structFieldMetadata(value: unknown): Record<string, { tag?: string }> {
|
|
129
171
|
if (value === null || typeof value !== 'object') {
|
|
130
172
|
return {}
|
|
131
173
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
4
|
+
|
|
5
|
+
import { AsType, Errorf, Is, Join, Wrap, Wrapf } from './errors.js'
|
|
6
|
+
|
|
7
|
+
class DNSError {
|
|
8
|
+
public readonly IsNotFound = true
|
|
9
|
+
|
|
10
|
+
public Error(): string {
|
|
11
|
+
return 'dns'
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class Wrapper {
|
|
16
|
+
constructor(private readonly err: $.GoError) {}
|
|
17
|
+
|
|
18
|
+
public Error(): string {
|
|
19
|
+
return 'wrapped'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public Unwrap(): $.GoError {
|
|
23
|
+
return this.err
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const dnsTypeArgs: $.GenericTypeArgs = {
|
|
28
|
+
E: {
|
|
29
|
+
type: { kind: $.TypeKind.Pointer, elemType: 'net.DNSError' },
|
|
30
|
+
zero: () => null,
|
|
31
|
+
},
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('errors.AsType', () => {
|
|
35
|
+
it('returns a directly matching error', () => {
|
|
36
|
+
const dns = $.interfaceValue<$.GoError>(new DNSError(), '*net.DNSError')
|
|
37
|
+
|
|
38
|
+
const [matched, ok] = AsType(dnsTypeArgs, dns)
|
|
39
|
+
|
|
40
|
+
expect(ok).toBe(true)
|
|
41
|
+
expect(matched).toBe(dns)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('walks wrapped errors depth first', () => {
|
|
45
|
+
const dns = $.interfaceValue<$.GoError>(new DNSError(), '*net.DNSError')
|
|
46
|
+
const wrapped = $.interfaceValue<$.GoError>(
|
|
47
|
+
new Wrapper(dns),
|
|
48
|
+
'*main.Wrapper',
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
const [matched, ok] = AsType(dnsTypeArgs, Join(null, wrapped))
|
|
52
|
+
|
|
53
|
+
expect(ok).toBe(true)
|
|
54
|
+
expect(matched).toBe(dns)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('returns zero when no error matches', () => {
|
|
58
|
+
const [matched, ok] = AsType(dnsTypeArgs, $.newError('plain'))
|
|
59
|
+
|
|
60
|
+
expect(ok).toBe(false)
|
|
61
|
+
expect(matched).toBe(null)
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
describe('errors github.com/pkg/errors compatibility helpers', () => {
|
|
66
|
+
it('formats new errors', () => {
|
|
67
|
+
expect(Errorf('bad %s: %d', 'value', 42)?.Error()).toBe('bad value: 42')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('wraps and unwraps errors', () => {
|
|
71
|
+
const base = $.newError('root')
|
|
72
|
+
const wrapped = Wrap(base, 'context')
|
|
73
|
+
|
|
74
|
+
expect(wrapped?.Error()).toBe('context: root')
|
|
75
|
+
expect(Is(wrapped, base)).toBe(true)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('wraps formatted context and preserves nil', () => {
|
|
79
|
+
const base = $.newError('root')
|
|
80
|
+
|
|
81
|
+
expect(Wrapf(base, 'context %d', 7)?.Error()).toBe('context 7: root')
|
|
82
|
+
expect(Wrap(null, 'context')).toBe(null)
|
|
83
|
+
expect(Wrapf(null, 'context %d', 7)).toBe(null)
|
|
84
|
+
})
|
|
85
|
+
})
|
package/gs/errors/errors.ts
CHANGED
|
@@ -6,6 +6,57 @@ export function New(text: string): $.GoError {
|
|
|
6
6
|
return $.newError(text)
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
export function Errorf(format: string, ...args: any[]): $.GoError {
|
|
10
|
+
return New(formatText(format, args))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function Wrap(err: $.GoError, message: string): $.GoError {
|
|
14
|
+
if (err === null) {
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
17
|
+
return wrapError(err, message)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function Wrapf(
|
|
21
|
+
err: $.GoError,
|
|
22
|
+
format: string,
|
|
23
|
+
...args: any[]
|
|
24
|
+
): $.GoError {
|
|
25
|
+
if (err === null) {
|
|
26
|
+
return null
|
|
27
|
+
}
|
|
28
|
+
return wrapError(err, formatText(format, args))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function wrapError(err: Exclude<$.GoError, null>, message: string): $.GoError {
|
|
32
|
+
const wrapped = $.newError(`${message}: ${err.Error()}`)
|
|
33
|
+
;(wrapped as any).Unwrap = function (): $.GoError {
|
|
34
|
+
return err
|
|
35
|
+
}
|
|
36
|
+
return wrapped
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function formatText(format: string, args: any[]): string {
|
|
40
|
+
let argIndex = 0
|
|
41
|
+
return format.replace(/%[sdqv%]/g, (match) => {
|
|
42
|
+
if (match === '%%') {
|
|
43
|
+
return '%'
|
|
44
|
+
}
|
|
45
|
+
if (argIndex >= args.length) {
|
|
46
|
+
return match
|
|
47
|
+
}
|
|
48
|
+
const arg = args[argIndex++]
|
|
49
|
+
switch (match) {
|
|
50
|
+
case '%d':
|
|
51
|
+
return String(Number(arg))
|
|
52
|
+
case '%q':
|
|
53
|
+
return JSON.stringify(String(arg))
|
|
54
|
+
default:
|
|
55
|
+
return String(arg)
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
9
60
|
// ErrUnsupported indicates that a requested operation cannot be performed,
|
|
10
61
|
// because it is unsupported. For example, a call to os.Link when using a
|
|
11
62
|
// file system that does not support hard links.
|
|
@@ -140,10 +191,7 @@ export function As(err: $.GoError, target: any): boolean {
|
|
|
140
191
|
throw new Error('errors: target cannot be nil')
|
|
141
192
|
}
|
|
142
193
|
|
|
143
|
-
|
|
144
|
-
if (err.constructor === target.constructor) {
|
|
145
|
-
// Copy properties from err to target
|
|
146
|
-
Object.assign(target, err)
|
|
194
|
+
if (assignAsTarget(err, target)) {
|
|
147
195
|
return true
|
|
148
196
|
}
|
|
149
197
|
|
|
@@ -179,6 +227,86 @@ export function As(err: $.GoError, target: any): boolean {
|
|
|
179
227
|
return false
|
|
180
228
|
}
|
|
181
229
|
|
|
230
|
+
function assignAsTarget(err: Exclude<$.GoError, null>, target: any): boolean {
|
|
231
|
+
const targetType = asTargetType(target)
|
|
232
|
+
if (targetType !== undefined) {
|
|
233
|
+
const [matched, ok] = $.typeAssertTuple<any>(err, targetType)
|
|
234
|
+
if (!ok) {
|
|
235
|
+
return false
|
|
236
|
+
}
|
|
237
|
+
if ($.isVarRef(target)) {
|
|
238
|
+
target.value = matched
|
|
239
|
+
return true
|
|
240
|
+
}
|
|
241
|
+
Object.assign(target, matched)
|
|
242
|
+
return true
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (err.constructor === target.constructor) {
|
|
246
|
+
Object.assign(target, err)
|
|
247
|
+
return true
|
|
248
|
+
}
|
|
249
|
+
return false
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function asTargetType(target: any): string | undefined {
|
|
253
|
+
const goType = target?.__goType
|
|
254
|
+
if (typeof goType !== 'string' || !goType.startsWith('*')) {
|
|
255
|
+
return undefined
|
|
256
|
+
}
|
|
257
|
+
return goType.slice(1)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// AsType finds the first error in err's tree that matches the generic error
|
|
261
|
+
// type E, returning the matching error and true. Otherwise it returns E's zero
|
|
262
|
+
// value and false.
|
|
263
|
+
export function AsType(
|
|
264
|
+
typeArgs: $.GenericTypeArgs | undefined,
|
|
265
|
+
err: $.GoError,
|
|
266
|
+
): [any, boolean] {
|
|
267
|
+
const descriptor = typeArgs?.E
|
|
268
|
+
const zero = (): any => descriptor?.zero?.() ?? null
|
|
269
|
+
if (err === null || descriptor?.type === undefined) {
|
|
270
|
+
return [zero(), false]
|
|
271
|
+
}
|
|
272
|
+
return asType(err, descriptor.type, zero)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function asType(
|
|
276
|
+
err: $.GoError,
|
|
277
|
+
typeInfo: $.TypeInfo | string,
|
|
278
|
+
zero: () => any,
|
|
279
|
+
): [any, boolean] {
|
|
280
|
+
if (err === null) {
|
|
281
|
+
return [zero(), false]
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const [asserted, ok] = $.typeAssertTuple<any>(err, typeInfo)
|
|
285
|
+
if (ok) {
|
|
286
|
+
return [asserted, true]
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (typeof (err as any).Unwrap === 'function') {
|
|
290
|
+
const result = (err as any).Unwrap()
|
|
291
|
+
if (Array.isArray(result)) {
|
|
292
|
+
for (const wrappedErr of result) {
|
|
293
|
+
if (wrappedErr && typeof wrappedErr.Error === 'function') {
|
|
294
|
+
const [matched, matchedOK] = asType(wrappedErr, typeInfo, zero)
|
|
295
|
+
if (matchedOK) {
|
|
296
|
+
return [matched, true]
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return [zero(), false]
|
|
301
|
+
}
|
|
302
|
+
if (result && typeof result.Error === 'function') {
|
|
303
|
+
return asType(result, typeInfo, zero)
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return [zero(), false]
|
|
308
|
+
}
|
|
309
|
+
|
|
182
310
|
// Join returns an error that wraps the given errors.
|
|
183
311
|
// Any nil error values are discarded.
|
|
184
312
|
// Join returns nil if every value in errs is nil.
|
package/gs/fmt/fmt.test.ts
CHANGED
|
@@ -36,7 +36,9 @@ function captureStdout(run: () => void): string {
|
|
|
36
36
|
length?: number,
|
|
37
37
|
_position?: number | null,
|
|
38
38
|
) => {
|
|
39
|
-
buf += new TextDecoder().decode(
|
|
39
|
+
buf += new TextDecoder().decode(
|
|
40
|
+
chunk.subarray(0, length ?? chunk.length),
|
|
41
|
+
)
|
|
40
42
|
return length ?? chunk.length
|
|
41
43
|
},
|
|
42
44
|
),
|
package/gs/fmt/fmt.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface State {
|
|
|
22
22
|
Flag(c: number): boolean
|
|
23
23
|
Precision(): [number, boolean]
|
|
24
24
|
Width(): [number, boolean]
|
|
25
|
-
Write(b:
|
|
25
|
+
Write(b: $.Bytes): [number, $.GoError | null]
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// Simple printf-style formatting implementation
|
|
@@ -199,7 +199,11 @@ function parseFormat(format: string, args: any[]): string {
|
|
|
199
199
|
const verb = format[j]
|
|
200
200
|
|
|
201
201
|
if (argIndex < args.length) {
|
|
202
|
-
|
|
202
|
+
const arg = args[argIndex]
|
|
203
|
+
let formatted = formatWithState(arg, verb, flags, width, precision)
|
|
204
|
+
if (formatted === null) {
|
|
205
|
+
formatted = formatValue(arg, verb)
|
|
206
|
+
}
|
|
203
207
|
|
|
204
208
|
// Apply width and precision formatting
|
|
205
209
|
if (width && !precision) {
|
|
@@ -217,7 +221,7 @@ function parseFormat(format: string, args: any[]): string {
|
|
|
217
221
|
(verb === 'f' || verb === 'e' || verb === 'g')
|
|
218
222
|
) {
|
|
219
223
|
const p = parseInt(precision)
|
|
220
|
-
const num = Number(
|
|
224
|
+
const num = Number(arg)
|
|
221
225
|
if (verb === 'f') {
|
|
222
226
|
formatted = num.toFixed(p)
|
|
223
227
|
} else if (verb === 'e') {
|
|
@@ -257,6 +261,39 @@ function parseFormat(format: string, args: any[]): string {
|
|
|
257
261
|
return result
|
|
258
262
|
}
|
|
259
263
|
|
|
264
|
+
function formatWithState(
|
|
265
|
+
value: any,
|
|
266
|
+
verb: string,
|
|
267
|
+
flags: string,
|
|
268
|
+
width: string,
|
|
269
|
+
precision: string,
|
|
270
|
+
): string | null {
|
|
271
|
+
if (!value || typeof value.Format !== 'function') {
|
|
272
|
+
return null
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
let out = ''
|
|
276
|
+
const state: State = {
|
|
277
|
+
Flag(c: number): boolean {
|
|
278
|
+
return flags.includes(String.fromCharCode(c))
|
|
279
|
+
},
|
|
280
|
+
Precision(): [number, boolean] {
|
|
281
|
+
return precision === '' ? [0, false] : [parseInt(precision), true]
|
|
282
|
+
},
|
|
283
|
+
Width(): [number, boolean] {
|
|
284
|
+
return width === '' ? [0, false] : [parseInt(width), true]
|
|
285
|
+
},
|
|
286
|
+
Write(b: $.Bytes): [number, $.GoError | null] {
|
|
287
|
+
const text = $.bytesToString(b)
|
|
288
|
+
out += text
|
|
289
|
+
return [text.length, null]
|
|
290
|
+
},
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
value.Format(state, verb.codePointAt(0) ?? 0)
|
|
294
|
+
return out
|
|
295
|
+
}
|
|
296
|
+
|
|
260
297
|
// Global stdout simulation for Print functions
|
|
261
298
|
let stdout = {
|
|
262
299
|
write: (data: string) => {
|
|
@@ -361,34 +398,33 @@ export function Fprintln(w: any, ...a: any[]): [number, $.GoError | null] {
|
|
|
361
398
|
}
|
|
362
399
|
|
|
363
400
|
// Append functions (append to byte slice)
|
|
364
|
-
export function Append(b:
|
|
401
|
+
export function Append(b: $.Bytes, ...a: any[]): $.Bytes {
|
|
365
402
|
const result = a.map(defaultFormat).join(' ')
|
|
366
403
|
const encoded = new TextEncoder().encode(result)
|
|
367
|
-
const
|
|
368
|
-
newArray.
|
|
369
|
-
newArray.set(
|
|
404
|
+
const base = $.bytesToUint8Array(b)
|
|
405
|
+
const newArray = new Uint8Array(base.length + encoded.length)
|
|
406
|
+
newArray.set(base)
|
|
407
|
+
newArray.set(encoded, base.length)
|
|
370
408
|
return newArray
|
|
371
409
|
}
|
|
372
410
|
|
|
373
|
-
export function Appendf(
|
|
374
|
-
b: Uint8Array,
|
|
375
|
-
format: string,
|
|
376
|
-
...a: any[]
|
|
377
|
-
): Uint8Array {
|
|
411
|
+
export function Appendf(b: $.Bytes, format: string, ...a: any[]): $.Bytes {
|
|
378
412
|
const result = parseFormat(format, a)
|
|
379
413
|
const encoded = new TextEncoder().encode(result)
|
|
380
|
-
const
|
|
381
|
-
newArray.
|
|
382
|
-
newArray.set(
|
|
414
|
+
const base = $.bytesToUint8Array(b)
|
|
415
|
+
const newArray = new Uint8Array(base.length + encoded.length)
|
|
416
|
+
newArray.set(base)
|
|
417
|
+
newArray.set(encoded, base.length)
|
|
383
418
|
return newArray
|
|
384
419
|
}
|
|
385
420
|
|
|
386
|
-
export function Appendln(b:
|
|
421
|
+
export function Appendln(b: $.Bytes, ...a: any[]): $.Bytes {
|
|
387
422
|
const result = a.map(defaultFormat).join(' ') + '\n'
|
|
388
423
|
const encoded = new TextEncoder().encode(result)
|
|
389
|
-
const
|
|
390
|
-
newArray.
|
|
391
|
-
newArray.set(
|
|
424
|
+
const base = $.bytesToUint8Array(b)
|
|
425
|
+
const newArray = new Uint8Array(base.length + encoded.length)
|
|
426
|
+
newArray.set(base)
|
|
427
|
+
newArray.set(encoded, base.length)
|
|
392
428
|
return newArray
|
|
393
429
|
}
|
|
394
430
|
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import * as $ from '../../../builtin/index.js'
|
|
4
|
+
import {
|
|
5
|
+
AppendVarint,
|
|
6
|
+
type CloneMessage,
|
|
7
|
+
CompareEqualVT,
|
|
8
|
+
ConsumeVarint,
|
|
9
|
+
DecodeFixed32,
|
|
10
|
+
DecodeFixed64,
|
|
11
|
+
DecodeVarint,
|
|
12
|
+
DecodeVarintInt32,
|
|
13
|
+
DecodeVarintInt64,
|
|
14
|
+
DecodeVarintUint32,
|
|
15
|
+
EncodeVarint,
|
|
16
|
+
ErrIntOverflow,
|
|
17
|
+
ErrInvalidLength,
|
|
18
|
+
ErrUnexpectedEndOfGroup,
|
|
19
|
+
IsEqualVTSlice,
|
|
20
|
+
SizeOfVarint,
|
|
21
|
+
Skip,
|
|
22
|
+
} from './index.js'
|
|
4
23
|
|
|
5
24
|
class TestValue {
|
|
6
25
|
constructor(private readonly value: string) {}
|
|
@@ -10,6 +29,30 @@ class TestValue {
|
|
|
10
29
|
}
|
|
11
30
|
}
|
|
12
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
|
+
|
|
13
56
|
describe('protobuf-go-lite EqualVT helpers', () => {
|
|
14
57
|
it('accepts compiler-emitted runtime type arguments', () => {
|
|
15
58
|
const equal = CompareEqualVT<TestValue>({
|
|
@@ -20,4 +63,88 @@ describe('protobuf-go-lite EqualVT helpers', () => {
|
|
|
20
63
|
expect(equal(new TestValue('a'), new TestValue('b'))).toBe(false)
|
|
21
64
|
expect(equal(null, null)).toBe(true)
|
|
22
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
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
describe('protobuf-go-lite wire helpers', () => {
|
|
94
|
+
it('encodes and decodes varints', () => {
|
|
95
|
+
const buf = new Uint8Array(4)
|
|
96
|
+
|
|
97
|
+
const offset = EncodeVarint(buf, 4, 300)
|
|
98
|
+
|
|
99
|
+
expect(offset).toBe(2)
|
|
100
|
+
expect(Array.from(buf.slice(offset))).toEqual([0xac, 0x02])
|
|
101
|
+
expect(SizeOfVarint(300)).toBe(2)
|
|
102
|
+
expect(DecodeVarint(buf, offset)).toEqual([300, 4, null])
|
|
103
|
+
expect(DecodeVarintInt32(buf, offset)).toEqual([300, 4, null])
|
|
104
|
+
expect(DecodeVarintInt64(buf, offset)).toEqual([300, 4, null])
|
|
105
|
+
expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
|
|
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,
|
|
114
|
+
])
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('decodes fixed64 values', () => {
|
|
118
|
+
expect(DecodeFixed32(new Uint8Array([0x44, 0x33, 0x22, 0x11]), 0)).toEqual([
|
|
119
|
+
0x11223344,
|
|
120
|
+
4,
|
|
121
|
+
null,
|
|
122
|
+
])
|
|
123
|
+
|
|
124
|
+
expect(
|
|
125
|
+
DecodeFixed64(
|
|
126
|
+
new Uint8Array([0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11]),
|
|
127
|
+
0,
|
|
128
|
+
),
|
|
129
|
+
).toEqual([0x1122334455667800, 8, null])
|
|
130
|
+
|
|
131
|
+
const [, , err] = DecodeFixed64(new Uint8Array([1, 2, 3]), 0)
|
|
132
|
+
expect(err?.Error()).toBe('unexpected EOF')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('skips protobuf records', () => {
|
|
136
|
+
expect(Skip(new Uint8Array([0x08, 0x96, 0x01]))).toEqual([3, null])
|
|
137
|
+
expect(Skip(new Uint8Array([0x12, 0x03, 0x61, 0x62, 0x63]))).toEqual([
|
|
138
|
+
5,
|
|
139
|
+
null,
|
|
140
|
+
])
|
|
141
|
+
expect(Skip(new Uint8Array([0x0c]))).toEqual([0, ErrUnexpectedEndOfGroup])
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('reports protobuf wire errors as Go errors', () => {
|
|
145
|
+
expect(ErrInvalidLength?.Error()).toContain('negative length')
|
|
146
|
+
expect(ErrIntOverflow?.Error()).toContain('integer overflow')
|
|
147
|
+
const [, eof] = Skip(new Uint8Array([0x08, 0x80]))
|
|
148
|
+
expect(eof?.Error()).toBe('unexpected EOF')
|
|
149
|
+
})
|
|
23
150
|
})
|