goscript 0.0.84 → 0.1.1
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 -243
- package/cmd/goscript/cmd-test.go +193 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +11 -5
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +220 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +188 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +67 -0
- package/compiler/gotest/request.go +145 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +588 -0
- package/compiler/gotest/runner_test.go +627 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +184 -0
- package/compiler/lowering.go +8072 -0
- package/compiler/override-facts.go +307 -0
- package/compiler/override-registry.go +283 -0
- package/compiler/override-registry_test.go +254 -0
- package/compiler/package-graph.go +254 -0
- package/compiler/package-graph_test.go +316 -0
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +105 -0
- package/compiler/package-test-graph.go +117 -0
- package/compiler/package-test-graph_test.go +144 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +439 -0
- package/compiler/runtime-contract_test.go +104 -0
- package/compiler/semantic-model-types.go +113 -0
- package/compiler/semantic-model.go +1422 -0
- package/compiler/semantic-model_test.go +471 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1775 -0
- package/compiler/tsworkspace/owner.go +334 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/typescript-emitter.go +1040 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +79 -0
- package/compiler/wasm_api.go +140 -124
- package/dist/compiler/index.d.ts +1 -3
- package/dist/compiler/index.js +31 -55
- package/dist/compiler/index.js.map +1 -1
- package/dist/gs/builtin/builtin.d.ts +33 -2
- package/dist/gs/builtin/builtin.js +217 -6
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +11 -3
- package/dist/gs/builtin/channel.js +12 -0
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +15 -1
- package/dist/gs/builtin/hostio.js +134 -49
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/index.d.ts +1 -0
- package/dist/gs/builtin/index.js +1 -0
- package/dist/gs/builtin/index.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +23 -3
- package/dist/gs/builtin/slice.js +216 -44
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +16 -2
- package/dist/gs/builtin/type.js +134 -21
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +5 -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 +48 -44
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.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/context/context.d.ts +5 -4
- package/dist/gs/context/context.js +10 -10
- package/dist/gs/context/context.js.map +1 -1
- 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 +5 -0
- package/dist/gs/crypto/rand/index.js +77 -0
- package/dist/gs/crypto/rand/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 +178 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +81 -0
- 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 +36 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
- 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 +825 -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 +163 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/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/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- 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 +42 -0
- package/dist/gs/go/scanner/index.js +155 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +187 -0
- package/dist/gs/go/token/index.js +578 -0
- package/dist/gs/go/token/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/fs.js.map +1 -1
- 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/readdir.js.map +1 -1
- package/dist/gs/io/fs/readfile.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +64 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- 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/maps/iter.d.ts +3 -3
- package/dist/gs/maps/iter.js +3 -3
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +2 -2
- 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 +66 -34
- 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 +50 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +11 -0
- package/dist/gs/net/http/httptest/index.js +21 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +27 -0
- package/dist/gs/net/http/index.js +61 -0
- package/dist/gs/net/http/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 +2 -4
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.js +66 -9
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +9 -9
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.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 +3 -1
- package/dist/gs/path/filepath/path.js +133 -4
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/match.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 +3 -3
- package/dist/gs/reflect/index.js +2 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +3 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +9 -5
- package/dist/gs/reflect/type.js +233 -21
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +2 -0
- package/dist/gs/runtime/debug/index.js +8 -0
- package/dist/gs/runtime/debug/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/slices/slices.d.ts +24 -5
- package/dist/gs/slices/slices.js +214 -5
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +3 -3
- package/dist/gs/sort/slice.gs.js +6 -6
- 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/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/quote.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +3 -2
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.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/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +3 -0
- package/dist/gs/sync/sync.js +39 -0
- 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 +2 -0
- package/dist/gs/syscall/errors.js +8 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +43 -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 +375 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +22 -0
- 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 +77 -0
- package/dist/gs/testing/testing.js +301 -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 +205 -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 +71 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +2 -2
- package/go.sum +9 -0
- package/gs/builtin/builtin.ts +266 -8
- package/gs/builtin/channel.ts +22 -0
- package/gs/builtin/hostio.test.ts +177 -0
- package/gs/builtin/hostio.ts +171 -56
- package/gs/builtin/index.ts +1 -0
- package/gs/builtin/runtime-contract.test.ts +356 -0
- package/gs/builtin/slice.ts +259 -50
- package/gs/builtin/type.ts +188 -30
- package/gs/builtin/varRef.ts +38 -1
- package/gs/bytes/buffer.gs.ts +48 -44
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/context/context.test.ts +41 -0
- package/gs/context/context.ts +22 -26
- 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 +32 -0
- package/gs/crypto/rand/index.ts +90 -0
- package/gs/crypto/rand/meta.json +5 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +79 -0
- package/gs/encoding/json/index.ts +210 -0
- package/gs/errors/errors.test.ts +82 -0
- package/gs/errors/errors.ts +104 -0
- package/gs/fmt/fmt.ts +56 -16
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -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 +72 -0
- package/gs/go/scanner/index.ts +204 -0
- package/gs/go/token/index.test.ts +67 -0
- package/gs/go/token/index.ts +686 -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 +77 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +9 -9
- package/gs/io/io.ts +174 -31
- package/gs/io/meta.json +10 -2
- package/gs/maps/iter.ts +12 -6
- package/gs/maps/maps.ts +8 -6
- package/gs/math/bits/index.ts +103 -47
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +54 -0
- package/gs/net/http/httptest/index.ts +25 -0
- package/gs/net/http/index.test.ts +20 -0
- package/gs/net/http/index.ts +81 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/file_unix_js.test.ts +50 -0
- package/gs/os/meta.json +1 -2
- package/gs/os/tempfile.gs.test.ts +85 -0
- package/gs/os/tempfile.gs.ts +71 -11
- package/gs/os/types_js.gs.ts +11 -11
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +178 -3
- package/gs/path/filepath/path.test.ts +25 -0
- package/gs/path/filepath/path.ts +159 -5
- package/gs/path/path.ts +20 -5
- package/gs/reflect/index.ts +2 -1
- package/gs/reflect/map.test.ts +19 -0
- package/gs/reflect/map.ts +4 -0
- package/gs/reflect/type.ts +298 -29
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/runtime/debug/index.test.ts +24 -0
- package/gs/runtime/debug/index.ts +8 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/slices/slices.test.ts +94 -0
- package/gs/slices/slices.ts +245 -5
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +16 -7
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.ts +4 -3
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +36 -0
- package/gs/sync/sync.ts +39 -0
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +10 -0
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +458 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +85 -0
- package/gs/syscall/types.ts +56 -0
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +90 -0
- package/gs/testing/testing.ts +382 -0
- package/gs/time/time.test.ts +106 -0
- package/gs/time/time.ts +278 -57
- package/gs/unicode/unicode.test.ts +25 -0
- package/gs/unicode/unicode.ts +119 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +91 -0
- package/package.json +14 -13
- package/compiler/analysis.go +0 -3475
- package/compiler/analysis_test.go +0 -338
- package/compiler/assignment.go +0 -580
- package/compiler/builtin_test.go +0 -92
- package/compiler/code-writer.go +0 -115
- package/compiler/compiler_test.go +0 -149
- package/compiler/composite-lit.go +0 -779
- package/compiler/config_test.go +0 -62
- package/compiler/constraint.go +0 -86
- package/compiler/decl.go +0 -801
- package/compiler/expr-call-async.go +0 -188
- package/compiler/expr-call-builtins.go +0 -208
- package/compiler/expr-call-helpers.go +0 -382
- package/compiler/expr-call-make.go +0 -318
- package/compiler/expr-call-type-conversion.go +0 -520
- package/compiler/expr-call.go +0 -413
- package/compiler/expr-selector.go +0 -343
- package/compiler/expr-star.go +0 -82
- package/compiler/expr-type.go +0 -442
- package/compiler/expr-value.go +0 -89
- package/compiler/expr.go +0 -773
- package/compiler/field.go +0 -183
- package/compiler/gs_dependencies_test.go +0 -298
- package/compiler/lit.go +0 -322
- package/compiler/output.go +0 -72
- package/compiler/primitive.go +0 -149
- package/compiler/protobuf.go +0 -697
- package/compiler/sanitize.go +0 -100
- package/compiler/spec-struct.go +0 -995
- package/compiler/spec-value.go +0 -540
- package/compiler/spec.go +0 -725
- package/compiler/stmt-assign.go +0 -664
- package/compiler/stmt-for.go +0 -266
- package/compiler/stmt-range.go +0 -475
- package/compiler/stmt-select.go +0 -262
- package/compiler/stmt-type-switch.go +0 -147
- package/compiler/stmt.go +0 -1308
- package/compiler/type-assert.go +0 -386
- package/compiler/type-info.go +0 -156
- package/compiler/type-utils.go +0 -207
- package/compiler/type.go +0 -892
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import { getHostRuntime, type NodeFSModule } from '@goscript/builtin/hostio.js'
|
|
2
3
|
|
|
3
4
|
export const ErrBadPattern = $.newError('syntax error in pattern')
|
|
4
5
|
|
|
@@ -238,12 +239,186 @@ function matchCharClass(
|
|
|
238
239
|
// The only possible returned error is ErrBadPattern, when pattern is malformed.
|
|
239
240
|
export function Glob(pattern: string): [string[], $.GoError] {
|
|
240
241
|
try {
|
|
241
|
-
// Validate the pattern using the same logic as Match
|
|
242
242
|
validatePattern(pattern)
|
|
243
|
-
|
|
244
|
-
return [[], null]
|
|
243
|
+
return [globHost(pattern), null]
|
|
245
244
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
246
245
|
} catch (err) {
|
|
247
246
|
return [[], ErrBadPattern]
|
|
248
247
|
}
|
|
249
248
|
}
|
|
249
|
+
|
|
250
|
+
function hasMeta(path: string): boolean {
|
|
251
|
+
return /[*?[\\]/.test(path)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function splitPattern(pattern: string): { absolute: boolean; segments: string[] } {
|
|
255
|
+
const absolute = pattern.startsWith('/')
|
|
256
|
+
const segments = pattern.split('/').filter((segment, index) => {
|
|
257
|
+
if (index === 0 && segment === '') {
|
|
258
|
+
return false
|
|
259
|
+
}
|
|
260
|
+
return segment !== '' && segment !== '.'
|
|
261
|
+
})
|
|
262
|
+
return { absolute, segments }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function cleanMatch(path: string): string {
|
|
266
|
+
const absolute = path.startsWith('/')
|
|
267
|
+
const parts: string[] = []
|
|
268
|
+
for (const part of path.split('/')) {
|
|
269
|
+
if (part === '' || part === '.') {
|
|
270
|
+
continue
|
|
271
|
+
}
|
|
272
|
+
if (part === '..') {
|
|
273
|
+
if (parts.length > 0 && parts[parts.length - 1] !== '..') {
|
|
274
|
+
parts.pop()
|
|
275
|
+
} else if (!absolute) {
|
|
276
|
+
parts.push(part)
|
|
277
|
+
}
|
|
278
|
+
continue
|
|
279
|
+
}
|
|
280
|
+
parts.push(part)
|
|
281
|
+
}
|
|
282
|
+
const out = parts.join('/')
|
|
283
|
+
if (absolute) {
|
|
284
|
+
return '/' + out
|
|
285
|
+
}
|
|
286
|
+
return out === '' ? '.' : out
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function joinPath(dir: string, name: string): string {
|
|
290
|
+
if (dir === '' || dir === '.') {
|
|
291
|
+
return name
|
|
292
|
+
}
|
|
293
|
+
if (dir === '/') {
|
|
294
|
+
return '/' + name
|
|
295
|
+
}
|
|
296
|
+
return dir.replace(/\/+$/, '') + '/' + name
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
type HostDirEntry = { name: string; isDir: boolean }
|
|
300
|
+
|
|
301
|
+
function readDir(path: string): HostDirEntry[] | null {
|
|
302
|
+
const runtime = getHostRuntime()
|
|
303
|
+
const denoObj = runtime.deno
|
|
304
|
+
if (denoObj?.readDirSync) {
|
|
305
|
+
try {
|
|
306
|
+
const entries: HostDirEntry[] = []
|
|
307
|
+
for (const entry of denoObj.readDirSync(path)) {
|
|
308
|
+
entries.push({ name: entry.name, isDir: !!entry.isDirectory })
|
|
309
|
+
}
|
|
310
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
311
|
+
return entries
|
|
312
|
+
} catch {
|
|
313
|
+
return null
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const nodeFS = runtime.nodeFS
|
|
318
|
+
if (nodeFS?.readdirSync) {
|
|
319
|
+
try {
|
|
320
|
+
const entries = nodeFS
|
|
321
|
+
.readdirSync(path, { withFileTypes: true })
|
|
322
|
+
.map((entry: any) => ({
|
|
323
|
+
name: String(entry.name),
|
|
324
|
+
isDir:
|
|
325
|
+
typeof entry.isDirectory === 'function' ?
|
|
326
|
+
entry.isDirectory()
|
|
327
|
+
: false,
|
|
328
|
+
}))
|
|
329
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
330
|
+
return entries
|
|
331
|
+
} catch {
|
|
332
|
+
return null
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return null
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function exists(path: string): boolean {
|
|
340
|
+
const runtime = getHostRuntime()
|
|
341
|
+
if (runtime.deno?.statSync) {
|
|
342
|
+
try {
|
|
343
|
+
runtime.deno.statSync(path)
|
|
344
|
+
return true
|
|
345
|
+
} catch {
|
|
346
|
+
return false
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const nodeFS = runtime.nodeFS
|
|
351
|
+
if (nodeFS?.statSync) {
|
|
352
|
+
try {
|
|
353
|
+
nodeFS.statSync(path)
|
|
354
|
+
return true
|
|
355
|
+
} catch {
|
|
356
|
+
return false
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return false
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function isDir(path: string, nodeFS?: NodeFSModule | null): boolean {
|
|
364
|
+
const runtime = getHostRuntime()
|
|
365
|
+
if (runtime.deno?.statSync) {
|
|
366
|
+
try {
|
|
367
|
+
return !!runtime.deno.statSync(path).isDirectory
|
|
368
|
+
} catch {
|
|
369
|
+
return false
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const fs = nodeFS ?? runtime.nodeFS
|
|
374
|
+
if (fs?.statSync) {
|
|
375
|
+
try {
|
|
376
|
+
const stat = fs.statSync(path)
|
|
377
|
+
return typeof stat.isDirectory === 'function' ? stat.isDirectory() : false
|
|
378
|
+
} catch {
|
|
379
|
+
return false
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return false
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function globHost(pattern: string): string[] {
|
|
387
|
+
const { absolute, segments } = splitPattern(pattern)
|
|
388
|
+
if (!hasMeta(pattern)) {
|
|
389
|
+
return exists(pattern) ? [cleanMatch(pattern)] : []
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
let prefixes = [absolute ? '/' : '.']
|
|
393
|
+
for (const [index, segment] of segments.entries()) {
|
|
394
|
+
const next: string[] = []
|
|
395
|
+
const last = index === segments.length - 1
|
|
396
|
+
const segmentHasMeta = hasMeta(segment)
|
|
397
|
+
for (const prefix of prefixes) {
|
|
398
|
+
if (!segmentHasMeta) {
|
|
399
|
+
const candidate = joinPath(prefix, segment)
|
|
400
|
+
if (last || isDir(candidate)) {
|
|
401
|
+
next.push(candidate)
|
|
402
|
+
}
|
|
403
|
+
continue
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const entries = readDir(prefix)
|
|
407
|
+
if (entries === null) {
|
|
408
|
+
continue
|
|
409
|
+
}
|
|
410
|
+
for (const entry of entries) {
|
|
411
|
+
const [matched, err] = Match(segment, entry.name)
|
|
412
|
+
if (err !== null || !matched) {
|
|
413
|
+
continue
|
|
414
|
+
}
|
|
415
|
+
if (last || entry.isDir) {
|
|
416
|
+
next.push(joinPath(prefix, entry.name))
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
prefixes = next
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return prefixes.map(cleanMatch).sort()
|
|
424
|
+
}
|
|
@@ -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,7 @@ import {
|
|
|
16
19
|
Abs,
|
|
17
20
|
Rel,
|
|
18
21
|
EvalSymlinks,
|
|
22
|
+
Walk,
|
|
19
23
|
Separator,
|
|
20
24
|
ListSeparator,
|
|
21
25
|
} from './path.js'
|
|
@@ -201,6 +205,27 @@ describe('path/filepath - Path manipulation functions', () => {
|
|
|
201
205
|
})
|
|
202
206
|
})
|
|
203
207
|
|
|
208
|
+
describe('Walk', () => {
|
|
209
|
+
it('should visit host filesystem paths in lexical order', () => {
|
|
210
|
+
const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
|
|
211
|
+
try {
|
|
212
|
+
mkdirSync(join(root, 'a', 'b'), { recursive: true })
|
|
213
|
+
writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
|
|
214
|
+
|
|
215
|
+
const visited: string[] = []
|
|
216
|
+
const err = Walk(root, (path) => {
|
|
217
|
+
visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
|
|
218
|
+
return null
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
expect(err).toBeNull()
|
|
222
|
+
expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
|
|
223
|
+
} finally {
|
|
224
|
+
rmSync(root, { force: true, recursive: true })
|
|
225
|
+
}
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
|
|
204
229
|
describe('Constants', () => {
|
|
205
230
|
it('should have correct separator constants', () => {
|
|
206
231
|
expect(Separator).toBe(47)
|
package/gs/path/filepath/path.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
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
|
+
|
|
6
|
+
type JoinElement = string | $.Slice<string>
|
|
7
|
+
|
|
8
|
+
function normalizeJoinElements(elem: JoinElement[]): string[] {
|
|
9
|
+
if (elem.length === 1 && typeof elem[0] !== 'string') {
|
|
10
|
+
const slice = elem[0]
|
|
11
|
+
const parts: string[] = []
|
|
12
|
+
for (let i = 0; i < $.len(slice); i++) {
|
|
13
|
+
parts.push(slice![i])
|
|
14
|
+
}
|
|
15
|
+
return parts
|
|
16
|
+
}
|
|
17
|
+
return elem as string[]
|
|
18
|
+
}
|
|
4
19
|
|
|
5
20
|
// Path separator constants
|
|
6
21
|
export const Separator = $.stringToRune('/')
|
|
@@ -123,15 +138,16 @@ export function Clean(path: string): string {
|
|
|
123
138
|
// are ignored. The result is Cleaned. However, if the argument
|
|
124
139
|
// list is empty or all its elements are empty, Join returns
|
|
125
140
|
// an empty string.
|
|
126
|
-
export function Join(...elem:
|
|
127
|
-
|
|
141
|
+
export function Join(...elem: JoinElement[]): string {
|
|
142
|
+
const partsArg = normalizeJoinElements(elem)
|
|
143
|
+
if (partsArg.length === 0) {
|
|
128
144
|
return ''
|
|
129
145
|
}
|
|
130
146
|
|
|
131
147
|
// Filter out empty elements but handle absolute paths
|
|
132
148
|
const parts: string[] = []
|
|
133
149
|
|
|
134
|
-
for (const e of
|
|
150
|
+
for (const e of partsArg) {
|
|
135
151
|
if (e === '') {
|
|
136
152
|
continue
|
|
137
153
|
}
|
|
@@ -307,8 +323,7 @@ export function Glob(_pattern: string): [string[], $.GoError] {
|
|
|
307
323
|
export type WalkFunc = (path: string, info: any, err: $.GoError) => $.GoError
|
|
308
324
|
|
|
309
325
|
export function Walk(root: string, walkFn: WalkFunc): $.GoError {
|
|
310
|
-
|
|
311
|
-
return walkFn(root, null, $.newError('filesystem not supported'))
|
|
326
|
+
return walkHost(root, walkFn)
|
|
312
327
|
}
|
|
313
328
|
|
|
314
329
|
export function WalkDir(_root: string, _walkFn: any): $.GoError {
|
|
@@ -320,3 +335,142 @@ export function WalkDir(_root: string, _walkFn: any): $.GoError {
|
|
|
320
335
|
export function Localize(path: string): [string, $.GoError] {
|
|
321
336
|
return [path, null]
|
|
322
337
|
}
|
|
338
|
+
|
|
339
|
+
type HostStat = {
|
|
340
|
+
isDirectory?: boolean | (() => boolean)
|
|
341
|
+
mode?: number
|
|
342
|
+
mtimeMs?: number
|
|
343
|
+
size?: number
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
type HostEntry = {
|
|
347
|
+
name: string
|
|
348
|
+
isDir: boolean
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function hostError(err: unknown): $.GoError {
|
|
352
|
+
const message =
|
|
353
|
+
err instanceof Error ? err.message
|
|
354
|
+
: typeof err === 'string' ? err
|
|
355
|
+
: String(err)
|
|
356
|
+
return { Error: () => message }
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function statIsDir(stat: HostStat): boolean {
|
|
360
|
+
if (typeof stat.isDirectory === 'function') {
|
|
361
|
+
return stat.isDirectory()
|
|
362
|
+
}
|
|
363
|
+
return !!stat.isDirectory
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function fileInfo(path: string, stat: HostStat): any {
|
|
367
|
+
return {
|
|
368
|
+
IsDir: () => statIsDir(stat),
|
|
369
|
+
ModTime: () => null,
|
|
370
|
+
Mode: () => (stat.mode ?? 0) + (statIsDir(stat) ? 2147483648 : 0),
|
|
371
|
+
Name: () => Base(path),
|
|
372
|
+
Size: () => stat.size ?? 0,
|
|
373
|
+
Sys: () => stat,
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function statPath(path: string): [HostStat | null, $.GoError] {
|
|
378
|
+
const runtime = getHostRuntime()
|
|
379
|
+
if (runtime.deno?.statSync) {
|
|
380
|
+
try {
|
|
381
|
+
return [runtime.deno.statSync(path), null]
|
|
382
|
+
} catch (err) {
|
|
383
|
+
return [null, hostError(err)]
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const nodeFS = runtime.nodeFS
|
|
388
|
+
if (nodeFS?.statSync) {
|
|
389
|
+
try {
|
|
390
|
+
return [nodeFS.statSync(path), null]
|
|
391
|
+
} catch (err) {
|
|
392
|
+
return [null, hostError(err)]
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return [null, $.newError('filesystem not supported')]
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function readDir(path: string): [HostEntry[] | null, $.GoError] {
|
|
400
|
+
const runtime = getHostRuntime()
|
|
401
|
+
if (runtime.deno?.readDirSync) {
|
|
402
|
+
try {
|
|
403
|
+
const entries: HostEntry[] = []
|
|
404
|
+
for (const entry of runtime.deno.readDirSync(path)) {
|
|
405
|
+
entries.push({ name: entry.name, isDir: !!entry.isDirectory })
|
|
406
|
+
}
|
|
407
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
408
|
+
return [entries, null]
|
|
409
|
+
} catch (err) {
|
|
410
|
+
return [null, hostError(err)]
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const nodeFS = runtime.nodeFS
|
|
415
|
+
if (nodeFS?.readdirSync) {
|
|
416
|
+
try {
|
|
417
|
+
const entries = nodeFS
|
|
418
|
+
.readdirSync(path, { withFileTypes: true })
|
|
419
|
+
.map((entry: any) => ({
|
|
420
|
+
name: String(entry.name),
|
|
421
|
+
isDir:
|
|
422
|
+
typeof entry.isDirectory === 'function' ?
|
|
423
|
+
entry.isDirectory()
|
|
424
|
+
: false,
|
|
425
|
+
}))
|
|
426
|
+
entries.sort((a, b) => a.name.localeCompare(b.name))
|
|
427
|
+
return [entries, null]
|
|
428
|
+
} catch (err) {
|
|
429
|
+
return [null, hostError(err)]
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return [null, $.newError('filesystem not supported')]
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function walkHost(path: string, walkFn: WalkFunc): $.GoError {
|
|
437
|
+
const [stat, statErr] = statPath(path)
|
|
438
|
+
if (statErr !== null) {
|
|
439
|
+
return walkFn(path, null, statErr)
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const visitErr = walkFn(path, fileInfo(path, stat!), null)
|
|
443
|
+
if (visitErr === SkipAll) {
|
|
444
|
+
return null
|
|
445
|
+
}
|
|
446
|
+
if (visitErr !== null) {
|
|
447
|
+
if (visitErr === SkipDir && statIsDir(stat!)) {
|
|
448
|
+
return null
|
|
449
|
+
}
|
|
450
|
+
return visitErr
|
|
451
|
+
}
|
|
452
|
+
if (!statIsDir(stat!)) {
|
|
453
|
+
return null
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const [entries, readErr] = readDir(path)
|
|
457
|
+
if (readErr !== null) {
|
|
458
|
+
return walkFn(path, fileInfo(path, stat!), readErr)
|
|
459
|
+
}
|
|
460
|
+
for (const entry of entries!) {
|
|
461
|
+
const err = walkHost(Join(path, entry.name), walkFn)
|
|
462
|
+
if (err === SkipDir) {
|
|
463
|
+
if (entry.isDir) {
|
|
464
|
+
continue
|
|
465
|
+
}
|
|
466
|
+
return err
|
|
467
|
+
}
|
|
468
|
+
if (err === SkipAll) {
|
|
469
|
+
return null
|
|
470
|
+
}
|
|
471
|
+
if (err !== null) {
|
|
472
|
+
return err
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return null
|
|
476
|
+
}
|
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) {
|
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,
|
|
@@ -47,7 +48,6 @@ export {
|
|
|
47
48
|
} from './types.js'
|
|
48
49
|
export type {
|
|
49
50
|
uintptr,
|
|
50
|
-
Pointer,
|
|
51
51
|
Method,
|
|
52
52
|
SelectDir,
|
|
53
53
|
SliceHeader,
|
|
@@ -80,6 +80,7 @@ export {
|
|
|
80
80
|
Interface,
|
|
81
81
|
Map,
|
|
82
82
|
Ptr,
|
|
83
|
+
Pointer,
|
|
83
84
|
Slice,
|
|
84
85
|
String,
|
|
85
86
|
Struct,
|
package/gs/reflect/map.test.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
2
|
import { MapIter } from './map.js'
|
|
3
|
+
import { ValueOf } from './type.js'
|
|
3
4
|
|
|
4
5
|
describe('MapIter', () => {
|
|
5
6
|
it('should iterate over map entries with proper typing', () => {
|
|
@@ -29,3 +30,21 @@ describe('MapIter', () => {
|
|
|
29
30
|
expect(iter.Value().Interface()).toBe(100)
|
|
30
31
|
})
|
|
31
32
|
})
|
|
33
|
+
|
|
34
|
+
describe('Value.MapKeys', () => {
|
|
35
|
+
it('returns map keys as reflect values', () => {
|
|
36
|
+
const map = new Map<string, number>()
|
|
37
|
+
map.set('alpha', 1)
|
|
38
|
+
map.set('beta', 2)
|
|
39
|
+
|
|
40
|
+
const keys = ValueOf(map).MapKeys()
|
|
41
|
+
|
|
42
|
+
expect(keys?.map((key) => key.String()).sort()).toEqual(['alpha', 'beta'])
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('returns an empty slice for empty maps', () => {
|
|
46
|
+
const emptyMap = new Map<string, number>()
|
|
47
|
+
|
|
48
|
+
expect(ValueOf(emptyMap).MapKeys()).toEqual([])
|
|
49
|
+
})
|
|
50
|
+
})
|
package/gs/reflect/map.ts
CHANGED