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
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { join } from 'node:path'
|
|
2
5
|
import {
|
|
3
6
|
Base,
|
|
4
7
|
Dir,
|
|
@@ -16,6 +19,9 @@ import {
|
|
|
16
19
|
Abs,
|
|
17
20
|
Rel,
|
|
18
21
|
EvalSymlinks,
|
|
22
|
+
Walk,
|
|
23
|
+
WalkDir,
|
|
24
|
+
SkipDir,
|
|
19
25
|
Separator,
|
|
20
26
|
ListSeparator,
|
|
21
27
|
} from './path.js'
|
|
@@ -201,6 +207,80 @@ describe('path/filepath - Path manipulation functions', () => {
|
|
|
201
207
|
})
|
|
202
208
|
})
|
|
203
209
|
|
|
210
|
+
describe('Walk', () => {
|
|
211
|
+
it('should visit host filesystem paths in lexical order', async () => {
|
|
212
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
|
|
213
|
+
try {
|
|
214
|
+
mkdirSync(join(root, 'a', 'b'), { recursive: true })
|
|
215
|
+
writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
|
|
216
|
+
|
|
217
|
+
const visited: string[] = []
|
|
218
|
+
const err = await Walk(root, (path) => {
|
|
219
|
+
visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
|
|
220
|
+
return null
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
expect(err).toBeNull()
|
|
224
|
+
expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
|
|
225
|
+
} finally {
|
|
226
|
+
rmSync(root, { force: true, recursive: true })
|
|
227
|
+
}
|
|
228
|
+
})
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
describe('WalkDir', () => {
|
|
232
|
+
it('should visit host filesystem dir entries in lexical order', async () => {
|
|
233
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walkdir-'))
|
|
234
|
+
try {
|
|
235
|
+
mkdirSync(join(root, 'b'), { recursive: true })
|
|
236
|
+
mkdirSync(join(root, 'a'), { recursive: true })
|
|
237
|
+
writeFileSync(join(root, 'a', 'skipped.txt'), 'skip')
|
|
238
|
+
writeFileSync(join(root, 'b', 'file.txt'), 'ok')
|
|
239
|
+
|
|
240
|
+
const visited: string[] = []
|
|
241
|
+
const err = await WalkDir(root, (path, d, walkErr) => {
|
|
242
|
+
expect(walkErr).toBeNull()
|
|
243
|
+
visited.push(
|
|
244
|
+
`${path.slice(root.length).replace(/^\/?/, '') || '.'}:${d.Name()}:${d.IsDir()}`,
|
|
245
|
+
)
|
|
246
|
+
if (d.Name() === 'a') {
|
|
247
|
+
return SkipDir
|
|
248
|
+
}
|
|
249
|
+
return null
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
expect(err).toBeNull()
|
|
253
|
+
expect(visited).toEqual([
|
|
254
|
+
`.:${root.split('/').pop()}:true`,
|
|
255
|
+
'a:a:true',
|
|
256
|
+
'b:b:true',
|
|
257
|
+
'b/file.txt:file.txt:false',
|
|
258
|
+
])
|
|
259
|
+
} finally {
|
|
260
|
+
rmSync(root, { force: true, recursive: true })
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
it('should await async host filesystem dir callbacks', async () => {
|
|
265
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walkdir-'))
|
|
266
|
+
try {
|
|
267
|
+
writeFileSync(join(root, 'file.txt'), 'ok')
|
|
268
|
+
|
|
269
|
+
const visited: string[] = []
|
|
270
|
+
const err = await WalkDir(root, async (path) => {
|
|
271
|
+
await Promise.resolve()
|
|
272
|
+
visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
|
|
273
|
+
return null
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
expect(err).toBeNull()
|
|
277
|
+
expect(visited).toEqual(['.', 'file.txt'])
|
|
278
|
+
} finally {
|
|
279
|
+
rmSync(root, { force: true, recursive: true })
|
|
280
|
+
}
|
|
281
|
+
})
|
|
282
|
+
})
|
|
283
|
+
|
|
204
284
|
describe('Constants', () => {
|
|
205
285
|
it('should have correct separator constants', () => {
|
|
206
286
|
expect(Separator).toBe(47)
|
package/gs/path/filepath/path.ts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
// Package filepath implements utility routines for manipulating filename paths
|
|
2
2
|
// in a way compatible with the target operating system-defined file paths.
|
|
3
3
|
import * as $ from '@goscript/builtin/index.js'
|
|
4
|
+
import { getHostRuntime } from '@goscript/builtin/hostio.js'
|
|
5
|
+
import type { DirEntry } from '@goscript/io/fs/fs.js'
|
|
6
|
+
import { FileInfoToDirEntry } from '@goscript/io/fs/readdir.js'
|
|
7
|
+
|
|
8
|
+
type JoinElement = string | $.Slice<string>
|
|
9
|
+
|
|
10
|
+
function normalizeJoinElements(elem: JoinElement[]): string[] {
|
|
11
|
+
if (elem.length === 1 && typeof elem[0] !== 'string') {
|
|
12
|
+
const slice = elem[0]
|
|
13
|
+
const parts: string[] = []
|
|
14
|
+
for (let i = 0; i < $.len(slice); i++) {
|
|
15
|
+
parts.push(slice![i])
|
|
16
|
+
}
|
|
17
|
+
return parts
|
|
18
|
+
}
|
|
19
|
+
return elem as string[]
|
|
20
|
+
}
|
|
4
21
|
|
|
5
22
|
// Path separator constants
|
|
6
23
|
export const Separator = $.stringToRune('/')
|
|
@@ -123,15 +140,16 @@ export function Clean(path: string): string {
|
|
|
123
140
|
// are ignored. The result is Cleaned. However, if the argument
|
|
124
141
|
// list is empty or all its elements are empty, Join returns
|
|
125
142
|
// an empty string.
|
|
126
|
-
export function Join(...elem:
|
|
127
|
-
|
|
143
|
+
export function Join(...elem: JoinElement[]): string {
|
|
144
|
+
const partsArg = normalizeJoinElements(elem)
|
|
145
|
+
if (partsArg.length === 0) {
|
|
128
146
|
return ''
|
|
129
147
|
}
|
|
130
148
|
|
|
131
149
|
// Filter out empty elements but handle absolute paths
|
|
132
150
|
const parts: string[] = []
|
|
133
151
|
|
|
134
|
-
for (const e of
|
|
152
|
+
for (const e of partsArg) {
|
|
135
153
|
if (e === '') {
|
|
136
154
|
continue
|
|
137
155
|
}
|
|
@@ -304,19 +322,234 @@ export function Glob(_pattern: string): [string[], $.GoError] {
|
|
|
304
322
|
// prefix; that is, if Walk is called with "dir" and finds a file "a"
|
|
305
323
|
// in that directory, the walk function will be called with argument
|
|
306
324
|
// "dir/a". The info argument is the fs.FileInfo for the named path.
|
|
307
|
-
export type WalkFunc = (
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
325
|
+
export type WalkFunc = (
|
|
326
|
+
path: string,
|
|
327
|
+
info: any,
|
|
328
|
+
err: $.GoError,
|
|
329
|
+
) => $.GoError | Promise<$.GoError>
|
|
330
|
+
|
|
331
|
+
export async function Walk(root: string, walkFn: WalkFunc): Promise<$.GoError> {
|
|
332
|
+
return await walkHost(root, walkFn)
|
|
312
333
|
}
|
|
313
334
|
|
|
314
|
-
export
|
|
315
|
-
|
|
316
|
-
|
|
335
|
+
export type WalkDirFunc = (
|
|
336
|
+
path: string,
|
|
337
|
+
d: DirEntry,
|
|
338
|
+
err: $.GoError,
|
|
339
|
+
) => $.GoError | Promise<$.GoError>
|
|
340
|
+
|
|
341
|
+
export async function WalkDir(
|
|
342
|
+
root: string,
|
|
343
|
+
walkFn: WalkDirFunc,
|
|
344
|
+
): Promise<$.GoError> {
|
|
345
|
+
return await walkDirHost(root, walkFn)
|
|
317
346
|
}
|
|
318
347
|
|
|
319
348
|
// Localize is a stub - in Go it's used for Windows path localization
|
|
320
349
|
export function Localize(path: string): [string, $.GoError] {
|
|
321
350
|
return [path, null]
|
|
322
351
|
}
|
|
352
|
+
|
|
353
|
+
type HostStat = {
|
|
354
|
+
isDirectory?: boolean | (() => boolean)
|
|
355
|
+
mode?: number
|
|
356
|
+
mtimeMs?: number
|
|
357
|
+
size?: number
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
type HostEntry = {
|
|
361
|
+
name: string
|
|
362
|
+
isDir: boolean
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function hostError(err: unknown): $.GoError {
|
|
366
|
+
const message =
|
|
367
|
+
err instanceof Error ? err.message
|
|
368
|
+
: typeof err === 'string' ? err
|
|
369
|
+
: String(err)
|
|
370
|
+
return { Error: () => message }
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function statIsDir(stat: HostStat): boolean {
|
|
374
|
+
if (typeof stat.isDirectory === 'function') {
|
|
375
|
+
return stat.isDirectory()
|
|
376
|
+
}
|
|
377
|
+
return !!stat.isDirectory
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function fileInfo(path: string, stat: HostStat): any {
|
|
381
|
+
return {
|
|
382
|
+
IsDir: () => statIsDir(stat),
|
|
383
|
+
ModTime: () => null,
|
|
384
|
+
Mode: () => (stat.mode ?? 0) + (statIsDir(stat) ? 2147483648 : 0),
|
|
385
|
+
Name: () => Base(path),
|
|
386
|
+
Size: () => stat.size ?? 0,
|
|
387
|
+
Sys: () => stat,
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
function dirEntry(path: string, stat: HostStat): DirEntry {
|
|
392
|
+
return FileInfoToDirEntry(fileInfo(path, stat))
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function statPath(path: string): [HostStat | null, $.GoError] {
|
|
396
|
+
const runtime = getHostRuntime()
|
|
397
|
+
if (runtime.deno?.statSync) {
|
|
398
|
+
try {
|
|
399
|
+
return [runtime.deno.statSync(path), null]
|
|
400
|
+
} catch (err) {
|
|
401
|
+
return [null, hostError(err)]
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const nodeFS = runtime.nodeFS
|
|
406
|
+
if (nodeFS?.statSync) {
|
|
407
|
+
try {
|
|
408
|
+
return [nodeFS.statSync(path), null]
|
|
409
|
+
} catch (err) {
|
|
410
|
+
return [null, hostError(err)]
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return [null, $.newError('filesystem not supported')]
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function readDir(path: string): [HostEntry[] | null, $.GoError] {
|
|
418
|
+
const runtime = getHostRuntime()
|
|
419
|
+
if (runtime.deno?.readDirSync) {
|
|
420
|
+
try {
|
|
421
|
+
const entries: HostEntry[] = []
|
|
422
|
+
for (const entry of runtime.deno.readDirSync(path)) {
|
|
423
|
+
entries.push({ name: entry.name, isDir: !!entry.isDirectory })
|
|
424
|
+
}
|
|
425
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
426
|
+
return [entries, null]
|
|
427
|
+
} catch (err) {
|
|
428
|
+
return [null, hostError(err)]
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const nodeFS = runtime.nodeFS
|
|
433
|
+
if (nodeFS?.readdirSync) {
|
|
434
|
+
try {
|
|
435
|
+
const entries = nodeFS
|
|
436
|
+
.readdirSync(path, { withFileTypes: true })
|
|
437
|
+
.map((entry: any) => ({
|
|
438
|
+
name: String(entry.name),
|
|
439
|
+
isDir:
|
|
440
|
+
typeof entry.isDirectory === 'function' ?
|
|
441
|
+
entry.isDirectory()
|
|
442
|
+
: false,
|
|
443
|
+
}))
|
|
444
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
445
|
+
return [entries, null]
|
|
446
|
+
} catch (err) {
|
|
447
|
+
return [null, hostError(err)]
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return [null, $.newError('filesystem not supported')]
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
async function walkHost(path: string, walkFn: WalkFunc): Promise<$.GoError> {
|
|
455
|
+
const [stat, statErr] = statPath(path)
|
|
456
|
+
if (statErr !== null) {
|
|
457
|
+
return await walkFn(path, null, statErr)
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const visitErr = await walkFn(path, fileInfo(path, stat!), null)
|
|
461
|
+
if (visitErr === SkipAll) {
|
|
462
|
+
return null
|
|
463
|
+
}
|
|
464
|
+
if (visitErr !== null) {
|
|
465
|
+
if (visitErr === SkipDir && statIsDir(stat!)) {
|
|
466
|
+
return null
|
|
467
|
+
}
|
|
468
|
+
return visitErr
|
|
469
|
+
}
|
|
470
|
+
if (!statIsDir(stat!)) {
|
|
471
|
+
return null
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
const [entries, readErr] = readDir(path)
|
|
475
|
+
if (readErr !== null) {
|
|
476
|
+
return await walkFn(path, fileInfo(path, stat!), readErr)
|
|
477
|
+
}
|
|
478
|
+
for (const entry of entries!) {
|
|
479
|
+
const err = await walkHost(Join(path, entry.name), walkFn)
|
|
480
|
+
if (err === SkipDir) {
|
|
481
|
+
if (entry.isDir) {
|
|
482
|
+
continue
|
|
483
|
+
}
|
|
484
|
+
return err
|
|
485
|
+
}
|
|
486
|
+
if (err === SkipAll) {
|
|
487
|
+
return null
|
|
488
|
+
}
|
|
489
|
+
if (err !== null) {
|
|
490
|
+
return err
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return null
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function normalizeWalkDirErr(d: DirEntry, err: $.GoError): $.GoError {
|
|
497
|
+
if (err === SkipAll) {
|
|
498
|
+
return null
|
|
499
|
+
}
|
|
500
|
+
if (err === SkipDir && d?.IsDir?.()) {
|
|
501
|
+
return null
|
|
502
|
+
}
|
|
503
|
+
return err
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
function normalizeRootWalkDirErr(err: $.GoError): $.GoError {
|
|
507
|
+
if (err === SkipAll || err === SkipDir) {
|
|
508
|
+
return null
|
|
509
|
+
}
|
|
510
|
+
return err
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
async function walkDirHost(
|
|
514
|
+
path: string,
|
|
515
|
+
walkFn: WalkDirFunc,
|
|
516
|
+
): Promise<$.GoError> {
|
|
517
|
+
const [stat, statErr] = statPath(path)
|
|
518
|
+
if (statErr !== null) {
|
|
519
|
+
return normalizeRootWalkDirErr(await walkFn(path, null, statErr))
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const d = dirEntry(path, stat!)
|
|
523
|
+
const visitErr = await walkFn(path, d, null)
|
|
524
|
+
if (visitErr === SkipAll) {
|
|
525
|
+
return null
|
|
526
|
+
}
|
|
527
|
+
if (visitErr === SkipDir && statIsDir(stat!)) {
|
|
528
|
+
return null
|
|
529
|
+
}
|
|
530
|
+
if (visitErr !== null || !statIsDir(stat!)) {
|
|
531
|
+
return visitErr
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const [entries, readErr] = readDir(path)
|
|
535
|
+
if (readErr !== null) {
|
|
536
|
+
return normalizeWalkDirErr(d, await walkFn(path, d, readErr))
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
for (const entry of entries!) {
|
|
540
|
+
const err = await walkDirHost(Join(path, entry.name), walkFn)
|
|
541
|
+
if (err === SkipDir) {
|
|
542
|
+
if (entry.isDir) {
|
|
543
|
+
continue
|
|
544
|
+
}
|
|
545
|
+
return err
|
|
546
|
+
}
|
|
547
|
+
if (err === SkipAll) {
|
|
548
|
+
return null
|
|
549
|
+
}
|
|
550
|
+
if (err !== null) {
|
|
551
|
+
return err
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
return null
|
|
555
|
+
}
|
package/gs/path/path.ts
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
2
|
|
|
3
|
+
type JoinElement = string | $.Slice<string>
|
|
4
|
+
|
|
5
|
+
function normalizeJoinElements(elem: JoinElement[]): string[] {
|
|
6
|
+
if (elem.length === 1 && typeof elem[0] !== 'string') {
|
|
7
|
+
const slice = elem[0]
|
|
8
|
+
const parts: string[] = []
|
|
9
|
+
for (let i = 0; i < $.len(slice); i++) {
|
|
10
|
+
parts.push(slice![i])
|
|
11
|
+
}
|
|
12
|
+
return parts
|
|
13
|
+
}
|
|
14
|
+
return elem as string[]
|
|
15
|
+
}
|
|
16
|
+
|
|
3
17
|
class lazybuf {
|
|
4
18
|
public get s(): string {
|
|
5
19
|
return this._fields.s.value
|
|
@@ -245,10 +259,11 @@ export function Split(path: string): [string, string] {
|
|
|
245
259
|
// The result is Cleaned. However, if the argument list is
|
|
246
260
|
// empty or all its elements are empty, Join returns
|
|
247
261
|
// an empty string.
|
|
248
|
-
export function Join(...elem:
|
|
262
|
+
export function Join(...elem: JoinElement[]): string {
|
|
263
|
+
const parts = normalizeJoinElements(elem)
|
|
249
264
|
let size = 0
|
|
250
|
-
for (let _i = 0; _i < $.len(
|
|
251
|
-
const e =
|
|
265
|
+
for (let _i = 0; _i < $.len(parts); _i++) {
|
|
266
|
+
const e = parts![_i]
|
|
252
267
|
{
|
|
253
268
|
size += $.len(e)
|
|
254
269
|
}
|
|
@@ -257,8 +272,8 @@ export function Join(...elem: string[]): string {
|
|
|
257
272
|
return ''
|
|
258
273
|
}
|
|
259
274
|
let buf: string[] = []
|
|
260
|
-
for (let _i = 0; _i < $.len(
|
|
261
|
-
const e =
|
|
275
|
+
for (let _i = 0; _i < $.len(parts); _i++) {
|
|
276
|
+
const e = parts![_i]
|
|
262
277
|
{
|
|
263
278
|
if ($.len(buf) > 0 || e != '') {
|
|
264
279
|
if ($.len(buf) > 0) {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
TypeKind,
|
|
5
|
+
arrayToSlice,
|
|
6
|
+
asArray,
|
|
7
|
+
registerStructType,
|
|
8
|
+
} from '../builtin/index.js'
|
|
9
|
+
import { NewAt, TypeOf, ValueOf } from './index.js'
|
|
10
|
+
|
|
11
|
+
class Person {
|
|
12
|
+
public Name = 'Ada'
|
|
13
|
+
public Count = 3
|
|
14
|
+
|
|
15
|
+
public String(): string {
|
|
16
|
+
return this.Name
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
;(Person as any).__typeInfo = { name: 'main.Person' }
|
|
20
|
+
|
|
21
|
+
describe('reflect struct field access', () => {
|
|
22
|
+
it('finds struct fields by name and index', () => {
|
|
23
|
+
registerStructType(
|
|
24
|
+
'main.Person',
|
|
25
|
+
new Person(),
|
|
26
|
+
[{ name: 'String', args: [], returns: [] }],
|
|
27
|
+
Person,
|
|
28
|
+
{
|
|
29
|
+
Name: 'string',
|
|
30
|
+
Count: { kind: TypeKind.Basic, name: 'int' },
|
|
31
|
+
},
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
const person = new Person()
|
|
35
|
+
const typ = TypeOf(person)
|
|
36
|
+
const [field, ok] = typ.FieldByName('Name')
|
|
37
|
+
|
|
38
|
+
expect(ok).toBe(true)
|
|
39
|
+
expect(field.Name).toBe('Name')
|
|
40
|
+
expect(field.Index).toEqual([0])
|
|
41
|
+
expect(typ.FieldByNameFunc((name) => name === 'Count')[0].Name).toBe(
|
|
42
|
+
'Count',
|
|
43
|
+
)
|
|
44
|
+
expect(typ.AssignableTo(typ)).toBe(true)
|
|
45
|
+
expect(typ.MethodByName('String')[1]).toBe(true)
|
|
46
|
+
expect(ValueOf(person).FieldByName('Name').String()).toBe('Ada')
|
|
47
|
+
expect(
|
|
48
|
+
ValueOf(person)
|
|
49
|
+
.FieldByIndex(arrayToSlice([1]))
|
|
50
|
+
.Int(),
|
|
51
|
+
).toBe(3)
|
|
52
|
+
expect(ValueOf(person).FieldByName('Missing').IsValid()).toBe(false)
|
|
53
|
+
|
|
54
|
+
const stringMethod = ValueOf(person).MethodByName('String')
|
|
55
|
+
expect(stringMethod.IsValid()).toBe(true)
|
|
56
|
+
expect(asArray(stringMethod.Call(arrayToSlice([])))[0].String()).toBe('Ada')
|
|
57
|
+
|
|
58
|
+
const nameField = ValueOf(person).FieldByName('Name')
|
|
59
|
+
const namePtr = NewAt(nameField.Type(), nameField.UnsafeAddr() as any)
|
|
60
|
+
namePtr.Elem().SetString('Grace')
|
|
61
|
+
expect(person.Name).toBe('Grace')
|
|
62
|
+
})
|
|
63
|
+
})
|
package/gs/reflect/index.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export {
|
|
3
3
|
TypeOf,
|
|
4
4
|
TypeFor,
|
|
5
|
+
TypeAssert,
|
|
5
6
|
ValueOf,
|
|
6
7
|
Value,
|
|
7
8
|
Kind_String,
|
|
@@ -25,13 +26,17 @@ export {
|
|
|
25
26
|
Copy,
|
|
26
27
|
Indirect,
|
|
27
28
|
New,
|
|
29
|
+
NewAt,
|
|
28
30
|
MakeSlice,
|
|
29
31
|
MakeMap,
|
|
32
|
+
MakeMapWithSize,
|
|
30
33
|
Append,
|
|
34
|
+
AppendSlice,
|
|
31
35
|
MakeChan,
|
|
32
36
|
Select,
|
|
33
37
|
} from './value.js'
|
|
34
38
|
export { Swapper } from './swapper.js'
|
|
39
|
+
export { MapIter } from './map.js'
|
|
35
40
|
|
|
36
41
|
// Export new types and constants
|
|
37
42
|
export {
|
|
@@ -51,7 +56,6 @@ export type {
|
|
|
51
56
|
SelectDir,
|
|
52
57
|
SliceHeader,
|
|
53
58
|
StringHeader,
|
|
54
|
-
MapIter,
|
|
55
59
|
} from './types.js'
|
|
56
60
|
|
|
57
61
|
// Export kind constants
|
package/gs/reflect/iter.ts
CHANGED
|
@@ -11,7 +11,7 @@ export function rangeNum<T extends number | uintptr, N extends number | number>(
|
|
|
11
11
|
|
|
12
12
|
// if the iteration value type is define by
|
|
13
13
|
// type T built-in type.
|
|
14
|
-
return (_yield: ((v: Value) =>
|
|
14
|
+
return async (_yield: ((v: Value) => iter.YieldResult) | null): Promise<void> => {
|
|
15
15
|
let convert = t!.PkgPath!() != ''
|
|
16
16
|
// cannot use range T(v) because no core type.
|
|
17
17
|
|
|
@@ -24,7 +24,7 @@ export function rangeNum<T extends number | uintptr, N extends number | number>(
|
|
|
24
24
|
if (convert) {
|
|
25
25
|
tmp = tmp.Convert(t).clone()
|
|
26
26
|
}
|
|
27
|
-
if (!_yield!(tmp)) {
|
|
27
|
+
if (!await _yield!(tmp)) {
|
|
28
28
|
return
|
|
29
29
|
}
|
|
30
30
|
}
|
package/gs/reflect/map.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { MapIter } from './
|
|
2
|
+
import { AppendSlice, MakeMapWithSize, MapIter, MapOf, TypeOf, ValueOf } from './index.js'
|
|
3
3
|
|
|
4
4
|
describe('MapIter', () => {
|
|
5
5
|
it('should iterate over map entries with proper typing', () => {
|
|
@@ -29,3 +29,44 @@ describe('MapIter', () => {
|
|
|
29
29
|
expect(iter.Value().Interface()).toBe(100)
|
|
30
30
|
})
|
|
31
31
|
})
|
|
32
|
+
|
|
33
|
+
describe('Value.MapKeys', () => {
|
|
34
|
+
it('returns map keys as reflect values', () => {
|
|
35
|
+
const map = new Map<string, number>()
|
|
36
|
+
map.set('alpha', 1)
|
|
37
|
+
map.set('beta', 2)
|
|
38
|
+
|
|
39
|
+
const keys = ValueOf(map).MapKeys()
|
|
40
|
+
|
|
41
|
+
expect(keys?.map((key) => key.String()).sort()).toEqual(['alpha', 'beta'])
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('returns an empty slice for empty maps', () => {
|
|
45
|
+
const emptyMap = new Map<string, number>()
|
|
46
|
+
|
|
47
|
+
expect(ValueOf(emptyMap).MapKeys()).toEqual([])
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
describe('reflect compatibility surface', () => {
|
|
52
|
+
it('constructs maps, ranges entries, and looks up values', () => {
|
|
53
|
+
const typ = MapOf(TypeOf(''), TypeOf(0))
|
|
54
|
+
const mapValue = MakeMapWithSize(typ, 4)
|
|
55
|
+
const raw = mapValue.Interface() as Map<string, number>
|
|
56
|
+
raw.set('alpha', 1)
|
|
57
|
+
|
|
58
|
+
const iter = mapValue.MapRange()
|
|
59
|
+
|
|
60
|
+
expect(iter?.Key().Interface()).toBe('alpha')
|
|
61
|
+
expect(mapValue.MapIndex(ValueOf('alpha')).Interface()).toBe(1)
|
|
62
|
+
expect(mapValue.Type().Comparable()).toBe(false)
|
|
63
|
+
expect(TypeOf('alpha').Comparable()).toBe(true)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('slices and appends slice values', () => {
|
|
67
|
+
const sliced = ValueOf([1, 2, 3, 4]).Slice(1, 3)
|
|
68
|
+
const appended = AppendSlice(sliced, ValueOf([5, 6]))
|
|
69
|
+
|
|
70
|
+
expect(appended.Interface()).toEqual([2, 3, 5, 6])
|
|
71
|
+
})
|
|
72
|
+
})
|
package/gs/reflect/map.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
StructField,
|
|
7
7
|
TypeOf,
|
|
8
8
|
} from './type.js'
|
|
9
|
+
import { Method } from './types.js'
|
|
9
10
|
|
|
10
11
|
// Simple MapOf implementation using JavaScript Map
|
|
11
12
|
export function MapOf(key: Type, elem: Type): Type {
|
|
@@ -27,10 +28,18 @@ class MapType implements Type {
|
|
|
27
28
|
return MapKind // Map kind
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
public Comparable(): boolean {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
|
|
30
35
|
public Name(): string {
|
|
31
36
|
return '' // Map types are unnamed composite types
|
|
32
37
|
}
|
|
33
38
|
|
|
39
|
+
public PkgPath(): string {
|
|
40
|
+
return ''
|
|
41
|
+
}
|
|
42
|
+
|
|
34
43
|
public Size(): number {
|
|
35
44
|
return 8 // pointer size
|
|
36
45
|
}
|
|
@@ -51,6 +60,16 @@ class MapType implements Type {
|
|
|
51
60
|
throw new Error('reflect: Field of non-struct type map')
|
|
52
61
|
}
|
|
53
62
|
|
|
63
|
+
public FieldByName(_name: string): [StructField, boolean] {
|
|
64
|
+
throw new Error('reflect: FieldByName of non-struct type map')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public FieldByNameFunc(
|
|
68
|
+
_match: (name: string) => boolean,
|
|
69
|
+
): [StructField, boolean] {
|
|
70
|
+
throw new Error('reflect: FieldByNameFunc of non-struct type map')
|
|
71
|
+
}
|
|
72
|
+
|
|
54
73
|
public Implements(u: Type | null): boolean {
|
|
55
74
|
if (!u) {
|
|
56
75
|
return false
|
|
@@ -62,6 +81,10 @@ class MapType implements Type {
|
|
|
62
81
|
return false
|
|
63
82
|
}
|
|
64
83
|
|
|
84
|
+
public AssignableTo(u: Type | null): boolean {
|
|
85
|
+
return u != null && this.String() === u.String()
|
|
86
|
+
}
|
|
87
|
+
|
|
65
88
|
public OverflowInt(_x: number): boolean {
|
|
66
89
|
throw new Error('reflect: OverflowInt of non-integer type map')
|
|
67
90
|
}
|
|
@@ -78,6 +101,22 @@ class MapType implements Type {
|
|
|
78
101
|
return 0
|
|
79
102
|
}
|
|
80
103
|
|
|
104
|
+
public MethodByName(_name: string): [Method, boolean] {
|
|
105
|
+
return [
|
|
106
|
+
{
|
|
107
|
+
Name: '',
|
|
108
|
+
Type: TypeOf(null),
|
|
109
|
+
Func: () => undefined,
|
|
110
|
+
Index: 0,
|
|
111
|
+
},
|
|
112
|
+
false,
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public Len(): number {
|
|
117
|
+
throw new Error('reflect: Len of non-array type map')
|
|
118
|
+
}
|
|
119
|
+
|
|
81
120
|
public Bits(): number {
|
|
82
121
|
throw new Error('reflect: Bits of non-sized type map')
|
|
83
122
|
}
|