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
|
@@ -0,0 +1,1005 @@
|
|
|
1
|
+
import * as $ from '../../../../builtin/index.js'
|
|
2
|
+
import * as time from '../../../../time/index.js'
|
|
3
|
+
|
|
4
|
+
export interface FieldMask {
|
|
5
|
+
GetPaths(): $.Slice<string>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface Marshaler {
|
|
9
|
+
MarshalProtoJSON(s: MarshalState | null): void
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface Unmarshaler {
|
|
13
|
+
UnmarshalProtoJSON(s: UnmarshalState | null): void
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type JSONRecord = Record<string, unknown>
|
|
17
|
+
|
|
18
|
+
export class JsonStream {
|
|
19
|
+
private chunks: string[] = []
|
|
20
|
+
private err: $.GoError = null
|
|
21
|
+
|
|
22
|
+
constructor(_writer?: unknown) {}
|
|
23
|
+
|
|
24
|
+
public Error(): $.GoError {
|
|
25
|
+
return this.err
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public Write(p: $.Slice<number>): [number, $.GoError] {
|
|
29
|
+
this.chunks.push(bytesToString(p))
|
|
30
|
+
return [$.len(p), null]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public WriteArrayEnd(): void {
|
|
34
|
+
this.chunks.push(']')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public WriteArrayStart(): void {
|
|
38
|
+
this.chunks.push('[')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public WriteBool(b: boolean): void {
|
|
42
|
+
this.chunks.push(JSON.stringify(b))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public WriteFloat32(f: number): void {
|
|
46
|
+
this.WriteFloat64(f)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public WriteFloat64(f: number): void {
|
|
50
|
+
if (Number.isNaN(f)) {
|
|
51
|
+
this.WriteString('NaN')
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
if (f === Infinity) {
|
|
55
|
+
this.WriteString('Infinity')
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
if (f === -Infinity) {
|
|
59
|
+
this.WriteString('-Infinity')
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
this.chunks.push(JSON.stringify(f))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public WriteInt32(i: number): void {
|
|
66
|
+
this.chunks.push(JSON.stringify(i))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public WriteMore(): void {
|
|
70
|
+
this.chunks.push(',')
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public WriteNil(): void {
|
|
74
|
+
this.chunks.push('null')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public WriteObjectEnd(): void {
|
|
78
|
+
this.chunks.push('}')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public WriteObjectField(field: string): void {
|
|
82
|
+
this.WriteString(field)
|
|
83
|
+
this.chunks.push(':')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public WriteObjectStart(): void {
|
|
87
|
+
this.chunks.push('{')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public WriteString(str: string): void {
|
|
91
|
+
this.chunks.push(JSON.stringify(str))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public WriteUint32(u: number): void {
|
|
95
|
+
this.chunks.push(JSON.stringify(u))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public String(): string {
|
|
99
|
+
return this.chunks.join('')
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export class MarshalerConfig {
|
|
104
|
+
public EnumsAsInts = true
|
|
105
|
+
public AnyTypeResolver: unknown = null
|
|
106
|
+
|
|
107
|
+
constructor(init?: Partial<MarshalerConfig>) {
|
|
108
|
+
Object.assign(this, init)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public clone(): MarshalerConfig {
|
|
112
|
+
return new MarshalerConfig({
|
|
113
|
+
EnumsAsInts: this.EnumsAsInts,
|
|
114
|
+
AnyTypeResolver: this.AnyTypeResolver,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public Marshal(m: Marshaler | null): [$.Slice<number>, $.GoError] {
|
|
119
|
+
const stream = new JsonStream()
|
|
120
|
+
const state = new MarshalState({ config: this, stream })
|
|
121
|
+
if (m == null) {
|
|
122
|
+
state.WriteNil()
|
|
123
|
+
} else {
|
|
124
|
+
m.MarshalProtoJSON(state)
|
|
125
|
+
}
|
|
126
|
+
if (state.Err() != null) {
|
|
127
|
+
return [null, state.Err()]
|
|
128
|
+
}
|
|
129
|
+
return [stringToBytes(stream.String()), null]
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export class UnmarshalerConfig {
|
|
134
|
+
public AnyTypeResolver: unknown = null
|
|
135
|
+
|
|
136
|
+
constructor(init?: Partial<UnmarshalerConfig>) {
|
|
137
|
+
Object.assign(this, init)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public clone(): UnmarshalerConfig {
|
|
141
|
+
return new UnmarshalerConfig({ AnyTypeResolver: this.AnyTypeResolver })
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public Unmarshal(data: $.Slice<number>, m: Unmarshaler | null): $.GoError {
|
|
145
|
+
const state = NewUnmarshalState(data, this)
|
|
146
|
+
if (state == null) {
|
|
147
|
+
return $.newError('json: failed to allocate unmarshal state')
|
|
148
|
+
}
|
|
149
|
+
m?.UnmarshalProtoJSON(state)
|
|
150
|
+
return state.Err()
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export const DefaultMarshalerConfig = new MarshalerConfig()
|
|
155
|
+
export const DefaultUnmarshalerConfig = new UnmarshalerConfig()
|
|
156
|
+
|
|
157
|
+
export class MarshalState {
|
|
158
|
+
private configValue: MarshalerConfig
|
|
159
|
+
private stream: JsonStream
|
|
160
|
+
private err: $.GoError = null
|
|
161
|
+
private fields = new Set<string>()
|
|
162
|
+
|
|
163
|
+
constructor(init?: Partial<{ config: MarshalerConfig; stream: JsonStream }>) {
|
|
164
|
+
this.configValue = init?.config?.clone() ?? DefaultMarshalerConfig.clone()
|
|
165
|
+
this.stream = init?.stream ?? new JsonStream()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
public AnyTypeResolver(): unknown {
|
|
169
|
+
return this.configValue.AnyTypeResolver
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
public Config(): MarshalerConfig {
|
|
173
|
+
return this.configValue.clone()
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public Err(): $.GoError {
|
|
177
|
+
return this.err ?? this.stream.Error()
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public HasField(field: string): boolean {
|
|
181
|
+
return this.fields.has(field)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public SetError(err: $.GoError): void {
|
|
185
|
+
this.err = err
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public SetErrorf(format: string, ...args: unknown[]): void {
|
|
189
|
+
this.err = $.newError(formatError(format, args))
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public Sub(js: JsonStream | null): MarshalState | null {
|
|
193
|
+
return new MarshalState({ config: this.configValue, stream: js ?? new JsonStream() })
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public WithField(field: string): MarshalState | null {
|
|
197
|
+
const next = new MarshalState({ config: this.configValue, stream: this.stream })
|
|
198
|
+
next.fields = new Set(this.fields)
|
|
199
|
+
next.fields.add(field)
|
|
200
|
+
return next
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public WithFieldMask(...paths: string[]): MarshalState | null {
|
|
204
|
+
const next = new MarshalState({ config: this.configValue, stream: this.stream })
|
|
205
|
+
next.fields = new Set([...this.fields, ...paths])
|
|
206
|
+
return next
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public Write(v: $.Slice<number>): [number, $.GoError] {
|
|
210
|
+
return this.stream.Write(v)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
public WriteArrayEnd(): void {
|
|
214
|
+
this.stream.WriteArrayEnd()
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public WriteArrayStart(): void {
|
|
218
|
+
this.stream.WriteArrayStart()
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public WriteBool(v: boolean): void {
|
|
222
|
+
this.stream.WriteBool(v)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
public WriteBoolArray(vs: $.Slice<boolean>): void {
|
|
226
|
+
this.writeArray(vs, (v) => this.WriteBool(v))
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public WriteBytes(v: $.Slice<number>): void {
|
|
230
|
+
this.WriteString(base64Encode(v))
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public WriteBytesArray(vs: $.Slice<$.Slice<number>>): void {
|
|
234
|
+
this.writeArray(vs, (v) => this.WriteBytes(v))
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
public WriteDuration(x: number): void {
|
|
238
|
+
this.WriteString(`${x}s`)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public WriteEnum(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): void {
|
|
242
|
+
if (this.configValue.EnumsAsInts) {
|
|
243
|
+
this.WriteEnumNumber(x)
|
|
244
|
+
return
|
|
245
|
+
}
|
|
246
|
+
this.WriteEnumString(x, ...valueMaps)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
public WriteEnumNumber(x: number): void {
|
|
250
|
+
this.WriteInt32(x)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
public WriteEnumString(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): void {
|
|
254
|
+
const value = enumStringValue(x, valueMaps)
|
|
255
|
+
if (value == null) {
|
|
256
|
+
this.WriteEnumNumber(x)
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
this.WriteString(value)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
public WriteFieldMask(x: FieldMask | null): void {
|
|
263
|
+
this.WriteString(sliceValues(x?.GetPaths()).join(','))
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
public WriteFloat32(v: number): void {
|
|
267
|
+
this.stream.WriteFloat32(v)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public WriteFloat32Array(vs: $.Slice<number>): void {
|
|
271
|
+
this.writeArray(vs, (v) => this.WriteFloat32(v))
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
public WriteFloat64(v: number): void {
|
|
275
|
+
this.stream.WriteFloat64(v)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public WriteFloat64Array(vs: $.Slice<number>): void {
|
|
279
|
+
this.writeArray(vs, (v) => this.WriteFloat64(v))
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
public WriteInt32(v: number): void {
|
|
283
|
+
this.stream.WriteInt32(v)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
public WriteInt32Array(vs: $.Slice<number>): void {
|
|
287
|
+
this.writeArray(vs, (v) => this.WriteInt32(v))
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
public WriteInt64(v: number): void {
|
|
291
|
+
this.WriteString(String(Math.trunc(v)))
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
public WriteInt64Array(vs: $.Slice<number>): void {
|
|
295
|
+
this.writeArray(vs, (v) => this.WriteInt64(v))
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
public WriteLegacyFieldMask(x: FieldMask | null): void {
|
|
299
|
+
this.WriteFieldMask(x)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
public WriteMore(): void {
|
|
303
|
+
this.stream.WriteMore()
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
public WriteMoreIf(b: $.VarRef<boolean> | boolean): void {
|
|
307
|
+
const value = typeof b === 'boolean' ? b : b.value
|
|
308
|
+
if (value) {
|
|
309
|
+
this.WriteMore()
|
|
310
|
+
return
|
|
311
|
+
}
|
|
312
|
+
if (typeof b !== 'boolean') {
|
|
313
|
+
b.value = true
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
public WriteNil(): void {
|
|
318
|
+
this.stream.WriteNil()
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
public WriteObjectBoolField(field: boolean): void {
|
|
322
|
+
this.WriteObjectField(String(field))
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
public WriteObjectEnd(): void {
|
|
326
|
+
this.stream.WriteObjectEnd()
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
public WriteObjectField(field: string): void {
|
|
330
|
+
this.stream.WriteObjectField(field)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
public WriteObjectInt32Field(field: number): void {
|
|
334
|
+
this.WriteObjectField(String(Math.trunc(field)))
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
public WriteObjectInt64Field(field: number): void {
|
|
338
|
+
this.WriteObjectField(String(Math.trunc(field)))
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
public WriteObjectStart(): void {
|
|
342
|
+
this.stream.WriteObjectStart()
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
public WriteObjectStringField(field: string): void {
|
|
346
|
+
this.WriteObjectField(field)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public WriteObjectUint32Field(field: number): void {
|
|
350
|
+
this.WriteObjectField(String(Math.trunc(field)))
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
public WriteObjectUint64Field(field: number): void {
|
|
354
|
+
this.WriteObjectField(String(Math.trunc(field)))
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public WriteString(v: string): void {
|
|
358
|
+
this.stream.WriteString(v)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
public WriteStringArray(vs: $.Slice<string>): void {
|
|
362
|
+
this.writeArray(vs, (v) => this.WriteString(v))
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
public WriteTime(x: time.Time | $.VarRef<time.Time> | null): void {
|
|
366
|
+
this.WriteString($.pointerValue<time.Time>(x).Format(time.RFC3339Nano))
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
public WriteUint32(v: number): void {
|
|
370
|
+
this.stream.WriteUint32(v)
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
public WriteUint32Array(vs: $.Slice<number>): void {
|
|
374
|
+
this.writeArray(vs, (v) => this.WriteUint32(v))
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
public WriteUint64(v: number): void {
|
|
378
|
+
this.WriteString(String(Math.trunc(v)))
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
public WriteUint64Array(vs: $.Slice<number>): void {
|
|
382
|
+
this.writeArray(vs, (v) => this.WriteUint64(v))
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
private writeArray<T>(values: $.Slice<T>, writeValue: (value: T) => void): void {
|
|
386
|
+
this.WriteArrayStart()
|
|
387
|
+
let wrote = false
|
|
388
|
+
for (const value of sliceValues(values)) {
|
|
389
|
+
if (wrote) {
|
|
390
|
+
this.WriteMore()
|
|
391
|
+
}
|
|
392
|
+
wrote = true
|
|
393
|
+
writeValue(value)
|
|
394
|
+
}
|
|
395
|
+
this.WriteArrayEnd()
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export class UnmarshalState {
|
|
400
|
+
private configValue: UnmarshalerConfig
|
|
401
|
+
private value: unknown
|
|
402
|
+
private root: UnmarshalState
|
|
403
|
+
private err: $.GoError = null
|
|
404
|
+
private fieldMaskPaths: Set<string>
|
|
405
|
+
private path: string[]
|
|
406
|
+
private objectEntries: Array<[string, unknown]> | null = null
|
|
407
|
+
private objectIndex = 0
|
|
408
|
+
|
|
409
|
+
constructor(init?: Partial<{
|
|
410
|
+
config: UnmarshalerConfig
|
|
411
|
+
value: unknown
|
|
412
|
+
root: UnmarshalState
|
|
413
|
+
fieldMaskPaths: Set<string>
|
|
414
|
+
path: string[]
|
|
415
|
+
}>) {
|
|
416
|
+
this.configValue = init?.config?.clone() ?? DefaultUnmarshalerConfig.clone()
|
|
417
|
+
this.value = init?.value ?? null
|
|
418
|
+
this.root = init?.root ?? this
|
|
419
|
+
this.fieldMaskPaths = init?.fieldMaskPaths ?? new Set<string>()
|
|
420
|
+
this.path = init?.path ?? []
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
public AddField(field: string): void {
|
|
424
|
+
this.fieldMaskPaths.add([...this.path, field].join('.'))
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
public AnyTypeResolver(): unknown {
|
|
428
|
+
return this.configValue.AnyTypeResolver
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
public Config(): UnmarshalerConfig {
|
|
432
|
+
return this.configValue.clone()
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
public Err(): $.GoError {
|
|
436
|
+
return this.root.err
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
public FieldMask(): FieldMask | null {
|
|
440
|
+
const paths = Array.from(this.fieldMaskPaths)
|
|
441
|
+
return { GetPaths: () => $.arrayToSlice(paths) }
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
public ReadArray(cb: (() => void) | null): void {
|
|
445
|
+
if (!Array.isArray(this.value)) {
|
|
446
|
+
this.SetErrorf('expected JSON array')
|
|
447
|
+
return
|
|
448
|
+
}
|
|
449
|
+
const original = this.value
|
|
450
|
+
for (const item of this.value) {
|
|
451
|
+
this.value = item
|
|
452
|
+
cb?.()
|
|
453
|
+
if (this.Err() != null) {
|
|
454
|
+
break
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
this.value = original
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
public ReadBool(): boolean {
|
|
461
|
+
return this.value === true
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
public ReadBoolArray(): $.Slice<boolean> {
|
|
465
|
+
return this.readArrayValues(() => this.ReadBool())
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
public ReadBoolMap(cb: ((key: boolean) => void) | null): void {
|
|
469
|
+
this.readMapKeys((key) => {
|
|
470
|
+
const parsed = parseBoolMapKey(key)
|
|
471
|
+
if (parsed == null) {
|
|
472
|
+
this.SetErrorf('invalid map key %q for bool map', key)
|
|
473
|
+
return
|
|
474
|
+
}
|
|
475
|
+
cb?.(parsed)
|
|
476
|
+
})
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
public ReadBytes(): $.Slice<number> {
|
|
480
|
+
return base64Decode(this.ReadString())
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
public ReadBytesArray(): $.Slice<$.Slice<number>> {
|
|
484
|
+
return this.readArrayValues(() => this.ReadBytes())
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
public ReadDuration(): $.VarRef<number> | null {
|
|
488
|
+
return $.varRef(numberFromJSON(this.value))
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
public ReadEnum(...valueMaps: Array<Map<string, number> | Record<string, number> | null>): number {
|
|
492
|
+
if (typeof this.value === 'number') {
|
|
493
|
+
return Math.trunc(this.value)
|
|
494
|
+
}
|
|
495
|
+
if (typeof this.value === 'string') {
|
|
496
|
+
for (const valueMap of valueMaps) {
|
|
497
|
+
const mapped = lookupStringMap(valueMap, this.value)
|
|
498
|
+
if (mapped !== undefined) {
|
|
499
|
+
return mapped
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return Math.trunc(Number(this.value) || 0)
|
|
503
|
+
}
|
|
504
|
+
return 0
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
public ReadFieldMask(): FieldMask | null {
|
|
508
|
+
const paths = typeof this.value === 'string'
|
|
509
|
+
? this.value.split(',').filter((part) => part !== '')
|
|
510
|
+
: Array.isArray(recordValue(this.value)?.paths)
|
|
511
|
+
? sliceValues(recordValue(this.value)?.paths as $.Slice<string>)
|
|
512
|
+
: []
|
|
513
|
+
return { GetPaths: () => $.arrayToSlice(paths) }
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
public ReadFloat32(): number {
|
|
517
|
+
return numberFromJSON(this.value)
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
public ReadFloat32Array(): $.Slice<number> {
|
|
521
|
+
return this.readArrayValues(() => this.ReadFloat32())
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
public ReadFloat64(): number {
|
|
525
|
+
return numberFromJSON(this.value)
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
public ReadFloat64Array(): $.Slice<number> {
|
|
529
|
+
return this.readArrayValues(() => this.ReadFloat64())
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
public ReadInt32(): number {
|
|
533
|
+
return Math.trunc(numberFromJSON(this.value))
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
public ReadInt32Array(): $.Slice<number> {
|
|
537
|
+
return this.readArrayValues(() => this.ReadInt32())
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
public ReadInt32Map(cb: ((key: number) => void) | null): void {
|
|
541
|
+
this.readMapKeys((key) => {
|
|
542
|
+
const parsed = parseSignedMapKey(key, 32)
|
|
543
|
+
if (parsed == null) {
|
|
544
|
+
this.SetErrorf('invalid map key %q for int32 map', key)
|
|
545
|
+
return
|
|
546
|
+
}
|
|
547
|
+
cb?.(parsed)
|
|
548
|
+
})
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
public ReadInt64(): number {
|
|
552
|
+
return Math.trunc(numberFromJSON(this.value))
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
public ReadInt64Array(): $.Slice<number> {
|
|
556
|
+
return this.readArrayValues(() => this.ReadInt64())
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
public ReadInt64Map(cb: ((key: number) => void) | null): void {
|
|
560
|
+
this.readMapKeys((key) => {
|
|
561
|
+
const parsed = parseSignedMapKey(key, 64)
|
|
562
|
+
if (parsed == null) {
|
|
563
|
+
this.SetErrorf('invalid map key %q for int64 map', key)
|
|
564
|
+
return
|
|
565
|
+
}
|
|
566
|
+
cb?.(parsed)
|
|
567
|
+
})
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
public ReadNil(): boolean {
|
|
571
|
+
return this.value === null
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
public ReadObject(cb: ((key: string) => void) | null): void {
|
|
575
|
+
const record = recordValue(this.value)
|
|
576
|
+
if (record == null) {
|
|
577
|
+
this.SetErrorf('expected JSON object')
|
|
578
|
+
return
|
|
579
|
+
}
|
|
580
|
+
const original = this.value
|
|
581
|
+
for (const key of Object.keys(record)) {
|
|
582
|
+
this.value = record[key]
|
|
583
|
+
cb?.(key)
|
|
584
|
+
if (this.Err() != null) {
|
|
585
|
+
break
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
this.value = original
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
public ReadObjectField(): string {
|
|
592
|
+
const record = recordValue(this.value)
|
|
593
|
+
if (record == null) {
|
|
594
|
+
this.SetErrorf('expected JSON object')
|
|
595
|
+
return ''
|
|
596
|
+
}
|
|
597
|
+
if (this.objectEntries == null) {
|
|
598
|
+
this.objectEntries = Object.entries(record)
|
|
599
|
+
this.objectIndex = 0
|
|
600
|
+
}
|
|
601
|
+
if (this.objectIndex >= this.objectEntries.length) {
|
|
602
|
+
return ''
|
|
603
|
+
}
|
|
604
|
+
const [key, value] = this.objectEntries[this.objectIndex]
|
|
605
|
+
this.objectIndex++
|
|
606
|
+
this.value = value
|
|
607
|
+
return key
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
public ReadString(): string {
|
|
611
|
+
if (typeof this.value === 'string') {
|
|
612
|
+
return this.value
|
|
613
|
+
}
|
|
614
|
+
if (this.value == null) {
|
|
615
|
+
return ''
|
|
616
|
+
}
|
|
617
|
+
return String(this.value)
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
public ReadStringArray(): $.Slice<string> {
|
|
621
|
+
return this.readArrayValues(() => this.ReadString())
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
public ReadStringMap(cb: ((key: string) => void) | null): void {
|
|
625
|
+
this.readMapKeys((key) => cb?.(key))
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
public ReadTime(): $.VarRef<time.Time> | null {
|
|
629
|
+
const [parsed, err] = time.Parse(time.RFC3339, this.ReadString())
|
|
630
|
+
if (err != null) {
|
|
631
|
+
this.SetError(err)
|
|
632
|
+
}
|
|
633
|
+
return $.varRef($.markAsStructValue($.cloneStructValue(parsed)))
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
public ReadUint32(): number {
|
|
637
|
+
return Math.trunc(Math.max(0, numberFromJSON(this.value)))
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
public ReadUint32Array(): $.Slice<number> {
|
|
641
|
+
return this.readArrayValues(() => this.ReadUint32())
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
public ReadUint32Map(cb: ((key: number) => void) | null): void {
|
|
645
|
+
this.readMapKeys((key) => {
|
|
646
|
+
const parsed = parseUnsignedMapKey(key, 32)
|
|
647
|
+
if (parsed == null) {
|
|
648
|
+
this.SetErrorf('invalid map key %q for uint32 map', key)
|
|
649
|
+
return
|
|
650
|
+
}
|
|
651
|
+
cb?.(parsed)
|
|
652
|
+
})
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
public ReadUint64(): number {
|
|
656
|
+
return this.ReadUint32()
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
public ReadUint64Array(): $.Slice<number> {
|
|
660
|
+
return this.readArrayValues(() => this.ReadUint64())
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
public ReadUint64Map(cb: ((key: number) => void) | null): void {
|
|
664
|
+
this.readMapKeys((key) => {
|
|
665
|
+
const parsed = parseUnsignedMapKey(key, 64)
|
|
666
|
+
if (parsed == null) {
|
|
667
|
+
this.SetErrorf('invalid map key %q for uint64 map', key)
|
|
668
|
+
return
|
|
669
|
+
}
|
|
670
|
+
cb?.(parsed)
|
|
671
|
+
})
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
public ReadWrappedBool(): boolean { return this.readWrapped(() => this.ReadBool()) }
|
|
675
|
+
public ReadWrappedBytes(): $.Slice<number> { return this.readWrapped(() => this.ReadBytes()) }
|
|
676
|
+
public ReadWrappedFloat32(): number { return this.readWrapped(() => this.ReadFloat32()) }
|
|
677
|
+
public ReadWrappedFloat64(): number { return this.readWrapped(() => this.ReadFloat64()) }
|
|
678
|
+
public ReadWrappedInt32(): number { return this.readWrapped(() => this.ReadInt32()) }
|
|
679
|
+
public ReadWrappedInt64(): number { return this.readWrapped(() => this.ReadInt64()) }
|
|
680
|
+
public ReadWrappedString(): string { return this.readWrapped(() => this.ReadString()) }
|
|
681
|
+
public ReadWrappedUint32(): number { return this.readWrapped(() => this.ReadUint32()) }
|
|
682
|
+
public ReadWrappedUint64(): number { return this.readWrapped(() => this.ReadUint64()) }
|
|
683
|
+
|
|
684
|
+
public SetError(err: $.GoError): void {
|
|
685
|
+
this.root.err = err
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
public SetErrorf(format: string, ...args: unknown[]): void {
|
|
689
|
+
this.SetError($.newError(formatError(format, args)))
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
public Skip(): void {}
|
|
693
|
+
|
|
694
|
+
public SkipAndAppendBytes(p: $.Slice<number>): $.Slice<number> {
|
|
695
|
+
const encoded = new TextEncoder().encode(JSON.stringify(this.value))
|
|
696
|
+
return $.append(p, encoded)
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
public SkipAndReturnBytes(): $.Slice<number> {
|
|
700
|
+
return stringToBytes(JSON.stringify(this.value))
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
public Sub(data: $.Slice<number>): UnmarshalState | null {
|
|
704
|
+
return NewUnmarshalState(data, this.configValue)
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
public WhatIsNext(): number {
|
|
708
|
+
if (this.value === null) {
|
|
709
|
+
return 0
|
|
710
|
+
}
|
|
711
|
+
if (Array.isArray(this.value)) {
|
|
712
|
+
return 1
|
|
713
|
+
}
|
|
714
|
+
if (typeof this.value === 'object') {
|
|
715
|
+
return 2
|
|
716
|
+
}
|
|
717
|
+
if (typeof this.value === 'string') {
|
|
718
|
+
return 3
|
|
719
|
+
}
|
|
720
|
+
if (typeof this.value === 'number') {
|
|
721
|
+
return 4
|
|
722
|
+
}
|
|
723
|
+
if (typeof this.value === 'boolean') {
|
|
724
|
+
return 5
|
|
725
|
+
}
|
|
726
|
+
return 0
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
public WithField(_field: string, _mask: boolean = true): UnmarshalState | null {
|
|
730
|
+
return new UnmarshalState({
|
|
731
|
+
config: this.configValue,
|
|
732
|
+
value: this.value,
|
|
733
|
+
root: this.root,
|
|
734
|
+
fieldMaskPaths: _mask ? this.fieldMaskPaths : new Set<string>(),
|
|
735
|
+
path: [...this.path, _field],
|
|
736
|
+
})
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
private readArrayValues<T>(read: () => T): $.Slice<T> {
|
|
740
|
+
const values: T[] = []
|
|
741
|
+
this.ReadArray(() => {
|
|
742
|
+
values.push(read())
|
|
743
|
+
})
|
|
744
|
+
return $.arrayToSlice(values)
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
private readMapKeys(cb: (key: string) => void): void {
|
|
748
|
+
const record = recordValue(this.value)
|
|
749
|
+
if (record == null) {
|
|
750
|
+
this.SetErrorf('expected JSON object')
|
|
751
|
+
return
|
|
752
|
+
}
|
|
753
|
+
const original = this.value
|
|
754
|
+
for (const key of Object.keys(record)) {
|
|
755
|
+
this.value = record[key]
|
|
756
|
+
cb(key)
|
|
757
|
+
if (this.Err() != null) {
|
|
758
|
+
break
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
this.value = original
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
private readWrapped<T>(read: () => T): T {
|
|
765
|
+
const record = recordValue(this.value)
|
|
766
|
+
if (record == null) {
|
|
767
|
+
return read()
|
|
768
|
+
}
|
|
769
|
+
if (!Object.hasOwn(record, 'value')) {
|
|
770
|
+
this.SetErrorf('first field in wrapped value is not value')
|
|
771
|
+
return read()
|
|
772
|
+
}
|
|
773
|
+
const keys = Object.keys(record)
|
|
774
|
+
if (keys.length !== 1) {
|
|
775
|
+
this.SetErrorf('unexpected %q field in wrapped value', keys.find((key) => key !== 'value') ?? '')
|
|
776
|
+
return read()
|
|
777
|
+
}
|
|
778
|
+
const original = this.value
|
|
779
|
+
this.value = record.value
|
|
780
|
+
const value = read()
|
|
781
|
+
this.value = original
|
|
782
|
+
return value
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
export function NewJsonStream(wr: unknown): JsonStream | null {
|
|
787
|
+
return new JsonStream(wr)
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
export function NewMarshalState(config: MarshalerConfig, stream: JsonStream | null): MarshalState | null {
|
|
791
|
+
return new MarshalState({ config, stream: stream ?? new JsonStream() })
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
export function NewUnmarshalState(data: $.Slice<number>, config: UnmarshalerConfig): UnmarshalState | null {
|
|
795
|
+
try {
|
|
796
|
+
return new UnmarshalState({ config, value: JSON.parse(bytesToString(data)) })
|
|
797
|
+
} catch (err) {
|
|
798
|
+
const state = new UnmarshalState({ config })
|
|
799
|
+
state.SetError($.newError(err instanceof Error ? err.message : String(err)))
|
|
800
|
+
return state
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
export function Marshal(c: MarshalerConfig, m: Marshaler | null): [$.Slice<number>, $.GoError] {
|
|
805
|
+
return c.Marshal(m)
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
export function MarshalMap<M extends Map<string, Marshaler> | Record<string, Marshaler>>(
|
|
809
|
+
_typeArgs: $.GenericTypeArgs | undefined,
|
|
810
|
+
c: MarshalerConfig,
|
|
811
|
+
mm: M,
|
|
812
|
+
): [$.Slice<number>, $.GoError] {
|
|
813
|
+
const stream = new JsonStream()
|
|
814
|
+
const state = new MarshalState({ config: c, stream })
|
|
815
|
+
state.WriteObjectStart()
|
|
816
|
+
const keys = mm instanceof Map ? Array.from(mm.keys()) : Object.keys(mm)
|
|
817
|
+
keys.sort()
|
|
818
|
+
keys.forEach((key, idx) => {
|
|
819
|
+
if (idx !== 0) {
|
|
820
|
+
state.WriteMore()
|
|
821
|
+
}
|
|
822
|
+
state.WriteObjectField(key)
|
|
823
|
+
const value = mm instanceof Map ? mm.get(key) : mm[key]
|
|
824
|
+
value?.MarshalProtoJSON(state)
|
|
825
|
+
})
|
|
826
|
+
state.WriteObjectEnd()
|
|
827
|
+
return state.Err() == null ? [stringToBytes(stream.String()), null] : [null, state.Err()]
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
export function MarshalSlice<S extends $.Slice<Marshaler>>(
|
|
831
|
+
_typeArgs: $.GenericTypeArgs | undefined,
|
|
832
|
+
c: MarshalerConfig,
|
|
833
|
+
ms: S,
|
|
834
|
+
): [$.Slice<number>, $.GoError] {
|
|
835
|
+
const stream = new JsonStream()
|
|
836
|
+
const state = new MarshalState({ config: c, stream })
|
|
837
|
+
state.WriteArrayStart()
|
|
838
|
+
sliceValues(ms).forEach((value, idx) => {
|
|
839
|
+
if (idx !== 0) {
|
|
840
|
+
state.WriteMore()
|
|
841
|
+
}
|
|
842
|
+
value?.MarshalProtoJSON(state)
|
|
843
|
+
})
|
|
844
|
+
state.WriteArrayEnd()
|
|
845
|
+
return state.Err() == null ? [stringToBytes(stream.String()), null] : [null, state.Err()]
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
export function GetEnumString(x: number, ...valueMaps: Array<Map<number, string> | Record<number, string> | null>): string {
|
|
849
|
+
return enumStringValue(x, valueMaps) ?? String(x)
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
export function ParseEnumString(v: string, ...valueMaps: Array<Map<string, number> | Record<string, number> | null>): [number, $.GoError] {
|
|
853
|
+
for (const valueMap of valueMaps) {
|
|
854
|
+
const value = lookupStringMap(valueMap, v)
|
|
855
|
+
if (value !== undefined) {
|
|
856
|
+
return [value, null]
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
const parsed = Number(v)
|
|
860
|
+
return Number.isFinite(parsed) ? [parsed, null] : [0, $.newError(`invalid enum ${v}`)]
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
function sliceValues<T>(values: $.Slice<T> | readonly T[] | null | undefined): T[] {
|
|
864
|
+
return Array.from((values ?? []) as Iterable<T>)
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
function bytesToString(bytes: $.Slice<number>): string {
|
|
868
|
+
return new TextDecoder().decode(new Uint8Array(sliceValues(bytes)))
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function stringToBytes(value: string): $.Slice<number> {
|
|
872
|
+
return $.arrayToSlice(Array.from(new TextEncoder().encode(value)))
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
function recordValue(value: unknown): JSONRecord | null {
|
|
876
|
+
if (value == null || Array.isArray(value) || typeof value !== 'object') {
|
|
877
|
+
return null
|
|
878
|
+
}
|
|
879
|
+
return value as JSONRecord
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
function numberFromJSON(value: unknown): number {
|
|
883
|
+
if (typeof value === 'number') {
|
|
884
|
+
return value
|
|
885
|
+
}
|
|
886
|
+
if (typeof value === 'string') {
|
|
887
|
+
switch (value) {
|
|
888
|
+
case 'NaN':
|
|
889
|
+
return NaN
|
|
890
|
+
case 'Infinity':
|
|
891
|
+
return Infinity
|
|
892
|
+
case '-Infinity':
|
|
893
|
+
return -Infinity
|
|
894
|
+
default:
|
|
895
|
+
return Number(value) || 0
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
return 0
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
function parseBoolMapKey(key: string): boolean | null {
|
|
902
|
+
switch (key) {
|
|
903
|
+
case 'true':
|
|
904
|
+
return true
|
|
905
|
+
case 'false':
|
|
906
|
+
return false
|
|
907
|
+
default:
|
|
908
|
+
return null
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
function parseSignedMapKey(key: string, bits: 32 | 64): number | null {
|
|
913
|
+
if (!/^-?(0|[1-9]\d*)$/.test(key)) {
|
|
914
|
+
return null
|
|
915
|
+
}
|
|
916
|
+
const parsed = Number(key)
|
|
917
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
918
|
+
return null
|
|
919
|
+
}
|
|
920
|
+
if (bits === 32 && (parsed < -2147483648 || parsed > 2147483647)) {
|
|
921
|
+
return null
|
|
922
|
+
}
|
|
923
|
+
return parsed
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
function parseUnsignedMapKey(key: string, bits: 32 | 64): number | null {
|
|
927
|
+
if (!/^(0|[1-9]\d*)$/.test(key)) {
|
|
928
|
+
return null
|
|
929
|
+
}
|
|
930
|
+
const parsed = Number(key)
|
|
931
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
932
|
+
return null
|
|
933
|
+
}
|
|
934
|
+
if (bits === 32 && parsed > 4294967295) {
|
|
935
|
+
return null
|
|
936
|
+
}
|
|
937
|
+
return parsed
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
function enumStringValue(
|
|
941
|
+
x: number,
|
|
942
|
+
valueMaps: Array<Map<number, string> | Record<number, string> | null>,
|
|
943
|
+
): string | null {
|
|
944
|
+
for (const valueMap of valueMaps) {
|
|
945
|
+
if (valueMap == null) {
|
|
946
|
+
continue
|
|
947
|
+
}
|
|
948
|
+
const value = valueMap instanceof Map ? valueMap.get(x) : valueMap[x]
|
|
949
|
+
if (value !== undefined) {
|
|
950
|
+
return value
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
return null
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
function lookupStringMap(valueMap: Map<string, number> | Record<string, number> | null, key: string): number | undefined {
|
|
957
|
+
if (valueMap == null) {
|
|
958
|
+
return undefined
|
|
959
|
+
}
|
|
960
|
+
return valueMap instanceof Map ? valueMap.get(key) : valueMap[key]
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
function formatError(format: string, args: unknown[]): string {
|
|
964
|
+
return format.replace(/%[vqsd]/g, () => String(args.shift()))
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
const base64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
968
|
+
|
|
969
|
+
function base64Encode(bytes: $.Slice<number>): string {
|
|
970
|
+
const data = sliceValues(bytes)
|
|
971
|
+
let out = ''
|
|
972
|
+
for (let idx = 0; idx < data.length; idx += 3) {
|
|
973
|
+
const a = data[idx] ?? 0
|
|
974
|
+
const b = data[idx + 1] ?? 0
|
|
975
|
+
const c = data[idx + 2] ?? 0
|
|
976
|
+
const triple = (a << 16) | (b << 8) | c
|
|
977
|
+
out += base64Alphabet[(triple >> 18) & 0x3f]
|
|
978
|
+
out += base64Alphabet[(triple >> 12) & 0x3f]
|
|
979
|
+
out += idx + 1 < data.length ? base64Alphabet[(triple >> 6) & 0x3f] : '='
|
|
980
|
+
out += idx + 2 < data.length ? base64Alphabet[triple & 0x3f] : '='
|
|
981
|
+
}
|
|
982
|
+
return out
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
function base64Decode(value: string): $.Slice<number> {
|
|
986
|
+
const normalized = value.replace(/-/g, '+').replace(/_/g, '/')
|
|
987
|
+
const padded = normalized + '='.repeat((4 - (normalized.length % 4)) % 4)
|
|
988
|
+
const bytes: number[] = []
|
|
989
|
+
for (let idx = 0; idx < padded.length; idx += 4) {
|
|
990
|
+
const chars = padded.slice(idx, idx + 4)
|
|
991
|
+
const a = base64Alphabet.indexOf(chars[0])
|
|
992
|
+
const b = base64Alphabet.indexOf(chars[1])
|
|
993
|
+
const c = chars[2] === '=' ? 0 : base64Alphabet.indexOf(chars[2])
|
|
994
|
+
const d = chars[3] === '=' ? 0 : base64Alphabet.indexOf(chars[3])
|
|
995
|
+
const triple = (a << 18) | (b << 12) | (c << 6) | d
|
|
996
|
+
bytes.push((triple >> 16) & 0xff)
|
|
997
|
+
if (chars[2] !== '=') {
|
|
998
|
+
bytes.push((triple >> 8) & 0xff)
|
|
999
|
+
}
|
|
1000
|
+
if (chars[3] !== '=') {
|
|
1001
|
+
bytes.push(triple & 0xff)
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
return $.arrayToSlice(bytes)
|
|
1005
|
+
}
|