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
package/gs/math/bits/index.ts
CHANGED
|
@@ -4,6 +4,24 @@
|
|
|
4
4
|
// UintSize is the size of a uint in bits
|
|
5
5
|
export const UintSize = 32 // Assuming 32-bit for JavaScript numbers
|
|
6
6
|
|
|
7
|
+
type Word64 = number | bigint
|
|
8
|
+
|
|
9
|
+
const uint64Mask = (1n << 64n) - 1n
|
|
10
|
+
|
|
11
|
+
function toUint64(x: Word64): bigint {
|
|
12
|
+
return BigInt(x) & uint64Mask
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function useBigIntResult(...values: Word64[]): boolean {
|
|
16
|
+
return values.some((value) => typeof value === 'bigint')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function word64Result(value: bigint, useBigInt: boolean): Word64 {
|
|
20
|
+
return useBigInt || value > BigInt(Number.MAX_SAFE_INTEGER) ?
|
|
21
|
+
value
|
|
22
|
+
: Number(value)
|
|
23
|
+
}
|
|
24
|
+
|
|
7
25
|
// --- Leading zeros ---
|
|
8
26
|
export function LeadingZeros(x: number): number {
|
|
9
27
|
return Math.clz32(x >>> 0)
|
|
@@ -21,8 +39,9 @@ export function LeadingZeros32(x: number): number {
|
|
|
21
39
|
return Math.clz32(x >>> 0)
|
|
22
40
|
}
|
|
23
41
|
|
|
24
|
-
export function LeadingZeros64(x:
|
|
42
|
+
export function LeadingZeros64(x: Word64): number {
|
|
25
43
|
// For 64-bit, we need to handle it differently
|
|
44
|
+
x = toUint64(x)
|
|
26
45
|
if (x === 0n) return 64
|
|
27
46
|
let count = 0
|
|
28
47
|
let mask = 1n << 63n
|
|
@@ -59,7 +78,8 @@ export function TrailingZeros32(x: number): number {
|
|
|
59
78
|
return count
|
|
60
79
|
}
|
|
61
80
|
|
|
62
|
-
export function TrailingZeros64(x:
|
|
81
|
+
export function TrailingZeros64(x: Word64): number {
|
|
82
|
+
x = toUint64(x)
|
|
63
83
|
if (x === 0n) return 64
|
|
64
84
|
let count = 0
|
|
65
85
|
while ((x & 1n) === 0n && count < 64) {
|
|
@@ -93,7 +113,8 @@ export function OnesCount32(x: number): number {
|
|
|
93
113
|
return count
|
|
94
114
|
}
|
|
95
115
|
|
|
96
|
-
export function OnesCount64(x:
|
|
116
|
+
export function OnesCount64(x: Word64): number {
|
|
117
|
+
x = toUint64(x)
|
|
97
118
|
let count = 0
|
|
98
119
|
while (x > 0n) {
|
|
99
120
|
count++
|
|
@@ -128,12 +149,17 @@ export function RotateLeft32(x: number, k: number): number {
|
|
|
128
149
|
return ((x << k) | (x >>> (n - k))) >>> 0
|
|
129
150
|
}
|
|
130
151
|
|
|
131
|
-
export function RotateLeft64(x:
|
|
152
|
+
export function RotateLeft64(x: number, k: number): number
|
|
153
|
+
export function RotateLeft64(x: bigint, k: number): bigint
|
|
154
|
+
export function RotateLeft64(x: Word64, k: number): Word64 {
|
|
132
155
|
const n = 64
|
|
133
156
|
k = k % n
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
return (
|
|
157
|
+
const useBigInt = useBigIntResult(x)
|
|
158
|
+
const word = toUint64(x)
|
|
159
|
+
return word64Result(
|
|
160
|
+
((word << BigInt(k)) | (word >> BigInt(n - k))) & uint64Mask,
|
|
161
|
+
useBigInt,
|
|
162
|
+
)
|
|
137
163
|
}
|
|
138
164
|
|
|
139
165
|
// --- Reverse ---
|
|
@@ -168,25 +194,35 @@ export function Reverse32(x: number): number {
|
|
|
168
194
|
return x >>> 0
|
|
169
195
|
}
|
|
170
196
|
|
|
171
|
-
export function Reverse64(x:
|
|
197
|
+
export function Reverse64(x: number): number
|
|
198
|
+
export function Reverse64(x: bigint): bigint
|
|
199
|
+
export function Reverse64(x: Word64): Word64 {
|
|
172
200
|
// Implement 64-bit reverse using similar bit manipulation
|
|
173
|
-
const
|
|
174
|
-
|
|
201
|
+
const useBigInt = useBigIntResult(x)
|
|
202
|
+
let word = toUint64(x)
|
|
175
203
|
|
|
176
204
|
// Swap 32-bit halves
|
|
177
|
-
|
|
205
|
+
word =
|
|
206
|
+
((word & 0xffffffff00000000n) >> 32n) |
|
|
207
|
+
((word & 0x00000000ffffffffn) << 32n)
|
|
178
208
|
// Swap 16-bit chunks
|
|
179
|
-
|
|
209
|
+
word =
|
|
210
|
+
((word & 0xffff0000ffff0000n) >> 16n) |
|
|
211
|
+
((word & 0x0000ffff0000ffffn) << 16n)
|
|
180
212
|
// Swap 8-bit chunks
|
|
181
|
-
|
|
213
|
+
word =
|
|
214
|
+
((word & 0xff00ff00ff00ff00n) >> 8n) | ((word & 0x00ff00ff00ff00ffn) << 8n)
|
|
182
215
|
// Swap 4-bit chunks
|
|
183
|
-
|
|
216
|
+
word =
|
|
217
|
+
((word & 0xf0f0f0f0f0f0f0f0n) >> 4n) | ((word & 0x0f0f0f0f0f0f0f0fn) << 4n)
|
|
184
218
|
// Swap 2-bit chunks
|
|
185
|
-
|
|
219
|
+
word =
|
|
220
|
+
((word & 0xccccccccccccccccn) >> 2n) | ((word & 0x3333333333333333n) << 2n)
|
|
186
221
|
// Swap 1-bit chunks
|
|
187
|
-
|
|
222
|
+
word =
|
|
223
|
+
((word & 0xaaaaaaaaaaaaaaaan) >> 1n) | ((word & 0x5555555555555555n) << 1n)
|
|
188
224
|
|
|
189
|
-
return
|
|
225
|
+
return word64Result(word & uint64Mask, useBigInt)
|
|
190
226
|
}
|
|
191
227
|
|
|
192
228
|
// --- ReverseBytes ---
|
|
@@ -209,20 +245,23 @@ export function ReverseBytes32(x: number): number {
|
|
|
209
245
|
)
|
|
210
246
|
}
|
|
211
247
|
|
|
212
|
-
export function ReverseBytes64(x:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
((
|
|
221
|
-
((
|
|
222
|
-
((
|
|
223
|
-
((
|
|
224
|
-
((
|
|
225
|
-
|
|
248
|
+
export function ReverseBytes64(x: number): number
|
|
249
|
+
export function ReverseBytes64(x: bigint): bigint
|
|
250
|
+
export function ReverseBytes64(x: Word64): Word64 {
|
|
251
|
+
const useBigInt = useBigIntResult(x)
|
|
252
|
+
const word = toUint64(x)
|
|
253
|
+
|
|
254
|
+
return word64Result(
|
|
255
|
+
(((word & 0xffn) << 56n) |
|
|
256
|
+
((word & 0xff00n) << 40n) |
|
|
257
|
+
((word & 0xff0000n) << 24n) |
|
|
258
|
+
((word & 0xff000000n) << 8n) |
|
|
259
|
+
((word & 0xff00000000n) >> 8n) |
|
|
260
|
+
((word & 0xff0000000000n) >> 24n) |
|
|
261
|
+
((word & 0xff000000000000n) >> 40n) |
|
|
262
|
+
((word & 0xff00000000000000n) >> 56n)) &
|
|
263
|
+
uint64Mask,
|
|
264
|
+
useBigInt,
|
|
226
265
|
)
|
|
227
266
|
}
|
|
228
267
|
|
|
@@ -243,7 +282,7 @@ export function Len32(x: number): number {
|
|
|
243
282
|
return 32 - LeadingZeros32(x)
|
|
244
283
|
}
|
|
245
284
|
|
|
246
|
-
export function Len64(x:
|
|
285
|
+
export function Len64(x: Word64): number {
|
|
247
286
|
return 64 - LeadingZeros64(x)
|
|
248
287
|
}
|
|
249
288
|
|
|
@@ -260,26 +299,20 @@ export function Mul32(x: number, y: number): [number, number] {
|
|
|
260
299
|
return [hi, lo]
|
|
261
300
|
}
|
|
262
301
|
|
|
263
|
-
export function Mul64(x:
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
// Multiply parts
|
|
273
|
-
const p00 = x0 * y0
|
|
274
|
-
const p01 = x0 * y1
|
|
275
|
-
const p10 = x1 * y0
|
|
276
|
-
const p11 = x1 * y1
|
|
302
|
+
export function Mul64(x: number, y: number): [number, number]
|
|
303
|
+
export function Mul64(x: bigint, y: bigint): [bigint, bigint]
|
|
304
|
+
export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
|
|
305
|
+
const useBigInt = useBigIntResult(x, y)
|
|
306
|
+
x = toUint64(x)
|
|
307
|
+
y = toUint64(y)
|
|
308
|
+
const product = x * y
|
|
309
|
+
const lo = product & uint64Mask
|
|
310
|
+
const hi = product >> 64n
|
|
277
311
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return [hi, lo]
|
|
312
|
+
return [
|
|
313
|
+
word64Result(hi & uint64Mask, useBigInt),
|
|
314
|
+
word64Result(lo, useBigInt),
|
|
315
|
+
]
|
|
283
316
|
}
|
|
284
317
|
|
|
285
318
|
// --- Division functions ---
|
|
@@ -302,7 +335,13 @@ export function Div32(hi: number, lo: number, y: number): [number, number] {
|
|
|
302
335
|
return [Number(quotient), Number(remainder)]
|
|
303
336
|
}
|
|
304
337
|
|
|
305
|
-
export function Div64(hi:
|
|
338
|
+
export function Div64(hi: number, lo: number, y: number): [number, number]
|
|
339
|
+
export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
|
|
340
|
+
export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
|
|
341
|
+
const useBigInt = useBigIntResult(hi, lo, y)
|
|
342
|
+
hi = toUint64(hi)
|
|
343
|
+
lo = toUint64(lo)
|
|
344
|
+
y = toUint64(y)
|
|
306
345
|
if (y === 0n) {
|
|
307
346
|
throw new Error('division by zero')
|
|
308
347
|
}
|
|
@@ -313,7 +352,7 @@ export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint] {
|
|
|
313
352
|
const quotient = dividend / y
|
|
314
353
|
const remainder = dividend % y
|
|
315
354
|
|
|
316
|
-
return [quotient, remainder]
|
|
355
|
+
return [word64Result(quotient, useBigInt), word64Result(remainder, useBigInt)]
|
|
317
356
|
}
|
|
318
357
|
|
|
319
358
|
// --- Add and Sub with carry ---
|
|
@@ -328,12 +367,14 @@ export function Add32(x: number, y: number, carry: number): [number, number] {
|
|
|
328
367
|
return [result, carryOut]
|
|
329
368
|
}
|
|
330
369
|
|
|
331
|
-
export function Add64(x:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const
|
|
335
|
-
const
|
|
336
|
-
|
|
370
|
+
export function Add64(x: number, y: number, carry: number): [number, number]
|
|
371
|
+
export function Add64(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
|
|
372
|
+
export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
|
|
373
|
+
const useBigInt = useBigIntResult(x, y, carry)
|
|
374
|
+
const sum = toUint64(x) + toUint64(y) + toUint64(carry)
|
|
375
|
+
const result = sum & uint64Mask
|
|
376
|
+
const carryOut = sum > uint64Mask ? 1n : 0n
|
|
377
|
+
return [word64Result(result, useBigInt), word64Result(carryOut, useBigInt)]
|
|
337
378
|
}
|
|
338
379
|
|
|
339
380
|
export function Sub(x: number, y: number, borrow: number): [number, number] {
|
|
@@ -347,10 +388,12 @@ export function Sub32(x: number, y: number, borrow: number): [number, number] {
|
|
|
347
388
|
return [result, borrowOut]
|
|
348
389
|
}
|
|
349
390
|
|
|
350
|
-
export function Sub64(x:
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
const
|
|
391
|
+
export function Sub64(x: number, y: number, borrow: number): [number, number]
|
|
392
|
+
export function Sub64(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
|
|
393
|
+
export function Sub64(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
|
|
394
|
+
const useBigInt = useBigIntResult(x, y, borrow)
|
|
395
|
+
const diff = toUint64(x) - toUint64(y) - toUint64(borrow)
|
|
396
|
+
const result = diff & uint64Mask
|
|
354
397
|
const borrowOut = diff < 0n ? 1n : 0n
|
|
355
|
-
return [result, borrowOut]
|
|
398
|
+
return [word64Result(result, useBigInt), word64Result(borrowOut, useBigInt)]
|
|
356
399
|
}
|
package/gs/math/const.gs.test.ts
CHANGED
|
@@ -69,12 +69,18 @@ describe('Mathematical Constants', () => {
|
|
|
69
69
|
expect(MaxUint32).toBe(4294967295)
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
-
it('should have correct
|
|
73
|
-
expect(MaxInt).toBe(9223372036854775807n)
|
|
74
|
-
expect(MinInt).toBe(-9223372036854775808n)
|
|
75
|
-
expect(MaxInt64).toBe(9223372036854775807n)
|
|
76
|
-
expect(MinInt64).toBe(-9223372036854775808n)
|
|
72
|
+
it('should have correct wide integer limits', () => {
|
|
73
|
+
expect(MaxInt).toBe(Number(9223372036854775807n))
|
|
74
|
+
expect(MinInt).toBe(Number(-9223372036854775808n))
|
|
75
|
+
expect(MaxInt64).toBe(Number(9223372036854775807n))
|
|
76
|
+
expect(MinInt64).toBe(Number(-9223372036854775808n))
|
|
77
77
|
expect(MaxUint).toBe(0xffffffffffffffffn)
|
|
78
78
|
expect(MaxUint64).toBe(0xffffffffffffffffn)
|
|
79
79
|
})
|
|
80
|
+
|
|
81
|
+
it('should typecheck current number-based uint64 comparisons', () => {
|
|
82
|
+
const counter: number = 0
|
|
83
|
+
const atLimit: boolean = counter === MaxUint64
|
|
84
|
+
expect(atLimit).toBe(false)
|
|
85
|
+
})
|
|
80
86
|
})
|
package/gs/math/const.gs.ts
CHANGED
|
@@ -47,10 +47,10 @@ export let SmallestNonzeroFloat64: number = Number.MIN_VALUE
|
|
|
47
47
|
let intSize: number = (32 << ((~(0 as number) >> 63)))
|
|
48
48
|
|
|
49
49
|
// MaxInt32 or MaxInt64 depending on intSize.
|
|
50
|
-
export let MaxInt:
|
|
50
|
+
export let MaxInt: number = 9223372036854775807
|
|
51
51
|
|
|
52
52
|
// MinInt32 or MinInt64 depending on intSize.
|
|
53
|
-
export let MinInt:
|
|
53
|
+
export let MinInt: number = -9223372036854775808
|
|
54
54
|
|
|
55
55
|
// 127
|
|
56
56
|
export let MaxInt8: number = 127
|
|
@@ -71,10 +71,10 @@ export let MaxInt32: number = 2147483647
|
|
|
71
71
|
export let MinInt32: number = -2147483648
|
|
72
72
|
|
|
73
73
|
// 9223372036854775807
|
|
74
|
-
export let MaxInt64:
|
|
74
|
+
export let MaxInt64: number = 9223372036854775807
|
|
75
75
|
|
|
76
76
|
// -9223372036854775808
|
|
77
|
-
export let MinInt64:
|
|
77
|
+
export let MinInt64: number = -9223372036854775808
|
|
78
78
|
|
|
79
79
|
// MaxUint32 or MaxUint64 depending on intSize.
|
|
80
80
|
export let MaxUint: bigint = 0xFFFFFFFFFFFFFFFFn
|
|
@@ -89,5 +89,4 @@ export let MaxUint16: number = 65535
|
|
|
89
89
|
export let MaxUint32: number = 4294967295
|
|
90
90
|
|
|
91
91
|
// 18446744073709551615
|
|
92
|
-
export let MaxUint64: bigint = 0xFFFFFFFFFFFFFFFFn
|
|
93
|
-
|
|
92
|
+
export let MaxUint64: number | bigint = 0xFFFFFFFFFFFFFFFFn
|
package/gs/mime/index.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function FormatMediaType(
|
|
2
|
+
t: string,
|
|
3
|
+
param: Map<string, string> | Record<string, string> | null,
|
|
4
|
+
): string {
|
|
5
|
+
if (!isToken(t)) {
|
|
6
|
+
return ''
|
|
7
|
+
}
|
|
8
|
+
let out = t
|
|
9
|
+
const entries =
|
|
10
|
+
param instanceof Map ?
|
|
11
|
+
Array.from(param.entries())
|
|
12
|
+
: Object.entries(param ?? {})
|
|
13
|
+
entries.sort(([a], [b]) => a.localeCompare(b))
|
|
14
|
+
for (const [key, value] of entries) {
|
|
15
|
+
if (!isToken(key)) {
|
|
16
|
+
return ''
|
|
17
|
+
}
|
|
18
|
+
out += formatParam(key, String(value))
|
|
19
|
+
}
|
|
20
|
+
return out
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function formatParam(key: string, value: string): string {
|
|
24
|
+
if (isToken(value)) {
|
|
25
|
+
return `; ${key}=${value}`
|
|
26
|
+
}
|
|
27
|
+
return `; ${key}*=utf-8''${percentEncode(value)}`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isToken(value: string): boolean {
|
|
31
|
+
return /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(value)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function percentEncode(value: string): string {
|
|
35
|
+
let out = ''
|
|
36
|
+
for (const byte of new TextEncoder().encode(value)) {
|
|
37
|
+
if (
|
|
38
|
+
(byte >= 0x30 && byte <= 0x39) ||
|
|
39
|
+
(byte >= 0x41 && byte <= 0x5a) ||
|
|
40
|
+
(byte >= 0x61 && byte <= 0x7a) ||
|
|
41
|
+
byte === 0x21 ||
|
|
42
|
+
byte === 0x23 ||
|
|
43
|
+
byte === 0x24 ||
|
|
44
|
+
byte === 0x26 ||
|
|
45
|
+
byte === 0x2b ||
|
|
46
|
+
byte === 0x2d ||
|
|
47
|
+
byte === 0x2e ||
|
|
48
|
+
byte === 0x5e ||
|
|
49
|
+
byte === 0x5f ||
|
|
50
|
+
byte === 0x60 ||
|
|
51
|
+
byte === 0x7c ||
|
|
52
|
+
byte === 0x7e
|
|
53
|
+
) {
|
|
54
|
+
out += String.fromCharCode(byte)
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
out += `%${byte.toString(16).toUpperCase().padStart(2, '0')}`
|
|
58
|
+
}
|
|
59
|
+
return out
|
|
60
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
4
|
+
|
|
5
|
+
import { Handler, Header_Get, Header_Set, MethodGet, NewRequest, StatusPartialContent } from '../index.js'
|
|
6
|
+
import { NewServer, NewUnstartedServer, Server_Start } from './index.js'
|
|
7
|
+
|
|
8
|
+
describe('net/http/httptest override', () => {
|
|
9
|
+
it('exports server helpers for typechecked server tests', () => {
|
|
10
|
+
const handler: Handler = {
|
|
11
|
+
ServeHTTP: () => undefined,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const srv = NewServer(handler)
|
|
15
|
+
expect(srv.URL).toBe('http://127.0.0.1')
|
|
16
|
+
expect(srv.Client()).toBeTruthy()
|
|
17
|
+
expect(srv.Config().Handler).toBe(handler)
|
|
18
|
+
expect(Server_Start(NewUnstartedServer(handler))?.Error()).toBe(
|
|
19
|
+
'net/http/httptest: Server.Start is not implemented in GoScript',
|
|
20
|
+
)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('routes Client.Do through the in-memory server handler', async () => {
|
|
24
|
+
const srv = NewServer({
|
|
25
|
+
ServeHTTP(w, r) {
|
|
26
|
+
Header_Set(w!.Header(), 'Content-Range', 'bytes 0-3/4')
|
|
27
|
+
const range = Header_Get($.pointerValue(r)!.Header, 'Range')
|
|
28
|
+
if (range !== 'bytes=0-3') {
|
|
29
|
+
w!.WriteHeader(400)
|
|
30
|
+
w!.Write($.stringToBytes(range))
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
w!.WriteHeader(StatusPartialContent)
|
|
34
|
+
w!.Write($.stringToBytes('data'))
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
const [req, reqErr] = NewRequest(MethodGet, srv.URL + '/pack.kvf', null)
|
|
38
|
+
expect(reqErr).toBeNull()
|
|
39
|
+
Header_Set(req!.Header, 'Range', 'bytes=0-3')
|
|
40
|
+
|
|
41
|
+
const [resp, err] = await srv.Client().Do(req)
|
|
42
|
+
|
|
43
|
+
expect(err).toBeNull()
|
|
44
|
+
expect(resp?.StatusCode).toBe(StatusPartialContent)
|
|
45
|
+
expect(Header_Get(resp!.Header, 'Content-Range')).toBe('bytes 0-3/4')
|
|
46
|
+
const buf = new Uint8Array(4)
|
|
47
|
+
const [n, readErr] = resp!.Body!.Read(buf)
|
|
48
|
+
expect(readErr).toBeNull()
|
|
49
|
+
expect(n).toBe(4)
|
|
50
|
+
expect(Buffer.from(buf).toString('utf8')).toBe('data')
|
|
51
|
+
expect(resp!.Body!.Close()).toBeNull()
|
|
52
|
+
})
|
|
53
|
+
})
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import * as bytes from '@goscript/bytes/index.js'
|
|
3
|
+
import * as errors from '@goscript/errors/index.js'
|
|
4
|
+
import * as http from '@goscript/net/http/index.js'
|
|
5
|
+
import * as io from '@goscript/io/index.js'
|
|
6
|
+
|
|
7
|
+
class responseBody implements io.ReadCloser {
|
|
8
|
+
private reader: bytes.Reader
|
|
9
|
+
|
|
10
|
+
constructor(data: $.Bytes) {
|
|
11
|
+
this.reader = bytes.NewReader(Uint8Array.from(data ?? []))
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public Read(p: $.Bytes): [number, $.GoError] {
|
|
15
|
+
return this.reader.Read(p)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public Close(): $.GoError {
|
|
19
|
+
return null
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class ResponseRecorder implements http.ResponseWriter {
|
|
24
|
+
public Code = 200
|
|
25
|
+
public Body = new bytes.Buffer()
|
|
26
|
+
private headerMap = new http.Header()
|
|
27
|
+
private wroteHeader = false
|
|
28
|
+
|
|
29
|
+
public Header(): http.Header {
|
|
30
|
+
return this.headerMap
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public Write(p: $.Slice<number>): [number, $.GoError] {
|
|
34
|
+
if (!this.wroteHeader) {
|
|
35
|
+
this.WriteHeader(http.StatusOK)
|
|
36
|
+
}
|
|
37
|
+
return this.Body.Write(p)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public WriteHeader(statusCode: number): void {
|
|
41
|
+
if (this.wroteHeader) {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
this.wroteHeader = true
|
|
45
|
+
this.Code = statusCode
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public Result(): http.Response {
|
|
49
|
+
return new http.Response({
|
|
50
|
+
Body: new responseBody(this.Body.Bytes()),
|
|
51
|
+
Header: this.headerMap,
|
|
52
|
+
StatusCode: this.Code,
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function NewRecorder(): ResponseRecorder {
|
|
58
|
+
return new ResponseRecorder()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function NewRequest(method: string, target: string, body: io.Reader | null): http.Request {
|
|
62
|
+
const [req, err] = http.NewRequest(method, target, body)
|
|
63
|
+
if (err != null || req == null) {
|
|
64
|
+
throw err ?? errors.New('net/http/httptest: NewRequest returned nil request')
|
|
65
|
+
}
|
|
66
|
+
return req
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export class Server {
|
|
70
|
+
public URL: string
|
|
71
|
+
private handler: http.Handler | null
|
|
72
|
+
|
|
73
|
+
constructor(init?: Partial<Server> & { Handler?: http.Handler | null }) {
|
|
74
|
+
this.URL = init?.URL ?? 'http://127.0.0.1'
|
|
75
|
+
this.handler = init?.Handler ?? null
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public Client(): http.Client {
|
|
79
|
+
return new http.Client({ Transport: new serverTransport(this) })
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public Close(): void {}
|
|
83
|
+
|
|
84
|
+
public Config(): http.Server {
|
|
85
|
+
return new http.Server({ Handler: this.handler })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public ServeHTTP(w: http.ResponseWriter | null, r: http.Request | $.VarRef<http.Request> | null): void | Promise<void> {
|
|
89
|
+
return this.handler?.ServeHTTP(w, r)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
class serverTransport implements http.RoundTripper {
|
|
94
|
+
constructor(private server: Server) {}
|
|
95
|
+
|
|
96
|
+
public RoundTrip(req: http.Request | $.VarRef<http.Request> | null): [http.Response | null, $.GoError] {
|
|
97
|
+
const request = $.pointerValue<http.Request | null>(req)
|
|
98
|
+
if (request == null) {
|
|
99
|
+
return [null, errors.New('net/http: nil Request')]
|
|
100
|
+
}
|
|
101
|
+
const recorder = NewRecorder()
|
|
102
|
+
const served = this.server.ServeHTTP(recorder, request)
|
|
103
|
+
if (served instanceof Promise) {
|
|
104
|
+
return [null, errors.New('net/http/httptest: async handlers are not supported by Client.Do')]
|
|
105
|
+
}
|
|
106
|
+
return [recorder.Result(), null]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function NewServer(handler: http.Handler | null): Server {
|
|
111
|
+
return new Server({ Handler: handler })
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function NewUnstartedServer(handler: http.Handler | null): Server {
|
|
115
|
+
return new Server({ Handler: handler })
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function Server_Start(_s: Server | $.VarRef<Server> | null): $.GoError {
|
|
119
|
+
return errors.New('net/http/httptest: Server.Start is not implemented in GoScript')
|
|
120
|
+
}
|