goscript 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +267 -255
- package/cmd/goscript/cmd-test.go +286 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +9 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +33 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -10
- package/compiler/config.go +2 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +69 -0
- package/compiler/gotest/request.go +210 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +1225 -0
- package/compiler/gotest/runner_test.go +1271 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +80 -21
- package/compiler/lowering.go +6754 -602
- package/compiler/override-facts.go +357 -0
- package/compiler/override-registry.go +52 -190
- package/compiler/override-registry_test.go +182 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +99 -9
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +129 -0
- package/compiler/package-test-graph.go +112 -0
- package/compiler/package-test-graph_test.go +202 -0
- package/compiler/runtime-contract.go +229 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +25 -6
- package/compiler/semantic-model.go +819 -74
- package/compiler/semantic-model_test.go +104 -0
- package/compiler/service.go +10 -4
- package/compiler/skeleton_test.go +2777 -524
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +342 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +576 -86
- package/compiler/wasm/compile.go +1 -1
- package/compiler/wasm/compile_test.go +61 -11
- package/compiler/wasm_api.go +172 -7
- package/dist/gs/builtin/builtin.d.ts +40 -3
- package/dist/gs/builtin/builtin.js +430 -22
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +32 -10
- package/dist/gs/builtin/channel.js +119 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +64 -10
- package/dist/gs/builtin/slice.js +619 -244
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +7 -2
- package/dist/gs/builtin/type.js +128 -29
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +7 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +74 -70
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +6 -5
- package/dist/gs/context/context.js +17 -12
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +4 -0
- package/dist/gs/encoding/json/index.js +33 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +108 -4
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +13 -0
- package/dist/gs/go/scanner/index.js +35 -0
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.d.ts +156 -0
- package/dist/gs/go/token/index.js +507 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +60 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +70 -48
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +52 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +30 -0
- package/dist/gs/net/http/httptest/index.js +101 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +131 -0
- package/dist/gs/net/http/index.js +307 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +8 -4
- package/dist/gs/path/filepath/path.js +192 -8
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +4 -3
- package/dist/gs/reflect/index.js +3 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +29 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +31 -9
- package/dist/gs/reflect/type.js +536 -43
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +41 -0
- package/dist/gs/runtime/debug/index.js +66 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +42 -8
- package/dist/gs/slices/slices.js +425 -11
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +60 -22
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +29 -19
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +8 -3
- package/dist/gs/sync/sync.js +66 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +117 -111
- package/dist/gs/syscall/errors.js +45 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +37 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +383 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +26 -1
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +78 -0
- package/dist/gs/testing/testing.js +318 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +227 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +76 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +8 -8
- package/go.sum +14 -14
- package/gs/builtin/builtin.ts +585 -27
- package/gs/builtin/channel.ts +183 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +383 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +785 -265
- package/gs/builtin/type.ts +160 -41
- package/gs/builtin/varRef.ts +40 -1
- package/gs/bytes/buffer.gs.ts +74 -70
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +71 -0
- package/gs/context/context.ts +30 -29
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +39 -3
- package/gs/encoding/json/index.ts +45 -3
- package/gs/errors/errors.test.ts +85 -0
- package/gs/errors/errors.ts +132 -4
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +55 -19
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +22 -0
- package/gs/go/scanner/index.ts +47 -0
- package/gs/go/token/index.test.ts +47 -1
- package/gs/go/token/index.ts +583 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +69 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +17 -9
- package/gs/io/io.ts +177 -31
- package/gs/io/meta.json +10 -2
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +75 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +13 -11
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +107 -64
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +60 -0
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +120 -0
- package/gs/net/http/index.test.ts +148 -0
- package/gs/net/http/index.ts +432 -0
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +96 -17
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +181 -3
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +80 -0
- package/gs/path/filepath/path.ts +244 -11
- package/gs/path/path.ts +20 -5
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +5 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +42 -1
- package/gs/reflect/map.ts +39 -0
- package/gs/reflect/type.ts +728 -65
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +45 -0
- package/gs/runtime/debug/index.ts +96 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +180 -0
- package/gs/slices/slices.ts +502 -15
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +85 -26
- package/gs/sort/slice.test.ts +40 -0
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +33 -20
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +69 -1
- package/gs/sync/sync.ts +72 -13
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +165 -112
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +485 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +111 -0
- package/gs/syscall/types.ts +63 -2
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +146 -0
- package/gs/testing/testing.ts +399 -0
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +110 -0
- package/gs/time/time.ts +309 -57
- package/gs/unicode/unicode.test.ts +36 -0
- package/gs/unicode/unicode.ts +115 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +98 -0
- package/package.json +3 -2
package/gs/time/time.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as $ from '../builtin/index.js'
|
|
1
2
|
import { makeChannel, ChannelRef, makeChannelRef } from '../builtin/channel.js'
|
|
2
3
|
|
|
3
4
|
// Time represents a time instant with nanosecond precision
|
|
@@ -132,11 +133,40 @@ export class Time {
|
|
|
132
133
|
return this._nsec
|
|
133
134
|
}
|
|
134
135
|
|
|
136
|
+
public Date(): [number, Month, number] {
|
|
137
|
+
return [this.Year(), this.Month(), this.Day()]
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public Clock(): [number, number, number] {
|
|
141
|
+
return [this.Hour(), this.Minute(), this.Second()]
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public Zone(): [string, number] {
|
|
145
|
+
if (this._location.offsetSeconds !== undefined) {
|
|
146
|
+
return [this._location.name, this._location.offsetSeconds]
|
|
147
|
+
}
|
|
148
|
+
const offset = -this._date.getTimezoneOffset() * 60
|
|
149
|
+
return [this._location.name, offset]
|
|
150
|
+
}
|
|
151
|
+
|
|
135
152
|
// Location returns the time zone information associated with t
|
|
136
153
|
public Location(): Location {
|
|
137
154
|
return this._location
|
|
138
155
|
}
|
|
139
156
|
|
|
157
|
+
// UTC returns t with the location set to UTC.
|
|
158
|
+
public UTC(): Time {
|
|
159
|
+
return Time.create(this._date, this._nsec, undefined, UTC)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// In returns a copy of t representing the same instant in loc.
|
|
163
|
+
public In(loc: Location | $.VarRef<Location> | null): Time {
|
|
164
|
+
if (loc === null) {
|
|
165
|
+
throw new Error('time: missing Location in call to Time.In')
|
|
166
|
+
}
|
|
167
|
+
return Time.create(this._date, this._nsec, undefined, $.pointerValue(loc))
|
|
168
|
+
}
|
|
169
|
+
|
|
140
170
|
// Format returns a textual representation of the time value formatted according to the layout
|
|
141
171
|
public Format(layout: string): string {
|
|
142
172
|
// Implementation of Go's time formatting based on reference time:
|
|
@@ -498,7 +528,7 @@ export class Time {
|
|
|
498
528
|
// Add adds the duration d to t, returning the sum
|
|
499
529
|
// Preserves monotonic reading if present
|
|
500
530
|
public Add(d: Duration): Time {
|
|
501
|
-
const durationNs = d
|
|
531
|
+
const durationNs = durationNumber(d)
|
|
502
532
|
const newDate = new globalThis.Date(
|
|
503
533
|
this._date.getTime() + Math.floor(durationNs / 1000000),
|
|
504
534
|
)
|
|
@@ -508,6 +538,33 @@ export class Time {
|
|
|
508
538
|
return Time.create(newDate, newNsec, newMonotonic, this._location)
|
|
509
539
|
}
|
|
510
540
|
|
|
541
|
+
public AddDate(years: number, months: number, days: number): Time {
|
|
542
|
+
if (this._location.offsetSeconds !== undefined) {
|
|
543
|
+
const offsetMs = this._location.offsetSeconds * 1000
|
|
544
|
+
const local = new globalThis.Date(this._date.getTime() + offsetMs)
|
|
545
|
+
const shifted = globalThis.Date.UTC(
|
|
546
|
+
local.getUTCFullYear() + years,
|
|
547
|
+
local.getUTCMonth() + months,
|
|
548
|
+
local.getUTCDate() + days,
|
|
549
|
+
local.getUTCHours(),
|
|
550
|
+
local.getUTCMinutes(),
|
|
551
|
+
local.getUTCSeconds(),
|
|
552
|
+
local.getUTCMilliseconds(),
|
|
553
|
+
)
|
|
554
|
+
return Time.create(
|
|
555
|
+
new globalThis.Date(shifted - offsetMs),
|
|
556
|
+
this._nsec,
|
|
557
|
+
undefined,
|
|
558
|
+
this._location,
|
|
559
|
+
)
|
|
560
|
+
}
|
|
561
|
+
const shifted = new globalThis.Date(this._date.getTime())
|
|
562
|
+
shifted.setFullYear(shifted.getFullYear() + years)
|
|
563
|
+
shifted.setMonth(shifted.getMonth() + months)
|
|
564
|
+
shifted.setDate(shifted.getDate() + days)
|
|
565
|
+
return Time.create(shifted, this._nsec, undefined, this._location)
|
|
566
|
+
}
|
|
567
|
+
|
|
511
568
|
// Equal reports whether t and u represent the same time instant
|
|
512
569
|
// Uses monotonic clock if both times have it
|
|
513
570
|
public Equal(u: Time): boolean {
|
|
@@ -517,6 +574,10 @@ export class Time {
|
|
|
517
574
|
return this._date.getTime() === u._date.getTime() && this._nsec === u._nsec
|
|
518
575
|
}
|
|
519
576
|
|
|
577
|
+
public IsZero(): boolean {
|
|
578
|
+
return this.Equal(new Time())
|
|
579
|
+
}
|
|
580
|
+
|
|
520
581
|
// Before reports whether the time instant t is before u
|
|
521
582
|
// Uses monotonic clock if both times have it
|
|
522
583
|
public Before(u: Time): boolean {
|
|
@@ -579,6 +640,25 @@ export class Time {
|
|
|
579
640
|
// Duration represents a span of time (nanoseconds)
|
|
580
641
|
export type Duration = number
|
|
581
642
|
|
|
643
|
+
const maxDuration = Number(9223372036854775807n)
|
|
644
|
+
const minDuration = Number(-9223372036854775808n)
|
|
645
|
+
const maxTimerDelayMilliseconds = 0x7fffffff
|
|
646
|
+
|
|
647
|
+
function durationNumber(d: Duration): number {
|
|
648
|
+
return Number(d)
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
function timeoutMilliseconds(d: Duration): number {
|
|
652
|
+
const ms = durationNumber(d) / 1000000
|
|
653
|
+
if (!Number.isFinite(ms) || ms > maxTimerDelayMilliseconds) {
|
|
654
|
+
return maxTimerDelayMilliseconds
|
|
655
|
+
}
|
|
656
|
+
if (ms <= 0) {
|
|
657
|
+
return 0
|
|
658
|
+
}
|
|
659
|
+
return ms
|
|
660
|
+
}
|
|
661
|
+
|
|
582
662
|
// Duration comparison function
|
|
583
663
|
export function Duration_lt(receiver: Duration, other: Duration): boolean {
|
|
584
664
|
return receiver < other
|
|
@@ -589,7 +669,147 @@ export function Duration_multiply(
|
|
|
589
669
|
receiver: Duration,
|
|
590
670
|
multiplier: number,
|
|
591
671
|
): Duration {
|
|
592
|
-
return receiver * multiplier
|
|
672
|
+
return durationNumber(receiver) * multiplier
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
export function Duration_Abs(receiver: Duration): Duration {
|
|
676
|
+
const value = durationNumber(receiver)
|
|
677
|
+
if (value >= 0) {
|
|
678
|
+
return value
|
|
679
|
+
}
|
|
680
|
+
if (value === minDuration) {
|
|
681
|
+
return maxDuration
|
|
682
|
+
}
|
|
683
|
+
return -value
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
export function Duration_Hours(receiver: Duration): number {
|
|
687
|
+
return durationNumber(receiver) / Hour
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
export function Duration_Microseconds(receiver: Duration): number {
|
|
691
|
+
return Math.trunc(durationNumber(receiver) / Microsecond)
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
export function Duration_Milliseconds(receiver: Duration): number {
|
|
695
|
+
return Math.trunc(durationNumber(receiver) / Millisecond)
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
export function Duration_Minutes(receiver: Duration): number {
|
|
699
|
+
return durationNumber(receiver) / Minute
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
export function Duration_Nanoseconds(receiver: Duration): number {
|
|
703
|
+
return durationNumber(receiver)
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
export function Duration_Round(
|
|
707
|
+
receiver: Duration,
|
|
708
|
+
multiple: Duration,
|
|
709
|
+
): Duration {
|
|
710
|
+
const value = durationNumber(receiver)
|
|
711
|
+
const unit = durationNumber(multiple)
|
|
712
|
+
if (unit <= 0) {
|
|
713
|
+
return value
|
|
714
|
+
}
|
|
715
|
+
const rounded =
|
|
716
|
+
value >= 0 ?
|
|
717
|
+
Math.floor(value / unit + 0.5) * unit
|
|
718
|
+
: Math.ceil(value / unit - 0.5) * unit
|
|
719
|
+
return Math.max(minDuration, Math.min(maxDuration, rounded))
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// Duration_Seconds returns the duration as a floating point number of seconds.
|
|
723
|
+
export function Duration_Seconds(receiver: Duration): number {
|
|
724
|
+
return durationNumber(receiver) / Second
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
export function Duration_Truncate(
|
|
728
|
+
receiver: Duration,
|
|
729
|
+
multiple: Duration,
|
|
730
|
+
): Duration {
|
|
731
|
+
const value = durationNumber(receiver)
|
|
732
|
+
const unit = durationNumber(multiple)
|
|
733
|
+
if (unit <= 0) {
|
|
734
|
+
return value
|
|
735
|
+
}
|
|
736
|
+
return value - (value % unit)
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
export function Duration_String(receiver: Duration): string {
|
|
740
|
+
const value = durationNumber(receiver)
|
|
741
|
+
if (value === 0) {
|
|
742
|
+
return '0s'
|
|
743
|
+
}
|
|
744
|
+
const sign = value < 0 ? '-' : ''
|
|
745
|
+
let remaining = Math.abs(value)
|
|
746
|
+
if (remaining < Second) {
|
|
747
|
+
return sign + formatSubsecond(remaining)
|
|
748
|
+
}
|
|
749
|
+
const hours = Math.floor(remaining / Hour)
|
|
750
|
+
remaining -= hours * Hour
|
|
751
|
+
const minutes = Math.floor(remaining / Minute)
|
|
752
|
+
remaining -= minutes * Minute
|
|
753
|
+
const seconds = Math.floor(remaining / Second)
|
|
754
|
+
remaining -= seconds * Second
|
|
755
|
+
|
|
756
|
+
let out = sign
|
|
757
|
+
if (hours !== 0) {
|
|
758
|
+
out += `${hours}h`
|
|
759
|
+
}
|
|
760
|
+
if (minutes !== 0) {
|
|
761
|
+
out += `${minutes}m`
|
|
762
|
+
}
|
|
763
|
+
if (seconds !== 0 || remaining !== 0) {
|
|
764
|
+
out += formatSeconds(seconds, remaining)
|
|
765
|
+
}
|
|
766
|
+
return out
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
export function Duration_format(
|
|
770
|
+
receiver: Duration,
|
|
771
|
+
buf: $.VarRef<number[]>,
|
|
772
|
+
): number {
|
|
773
|
+
const text = Duration_String(receiver)
|
|
774
|
+
const bytes = Array.from(new TextEncoder().encode(text))
|
|
775
|
+
const start = Math.max(0, buf.value.length - bytes.length)
|
|
776
|
+
for (
|
|
777
|
+
let idx = 0;
|
|
778
|
+
idx < bytes.length && start + idx < buf.value.length;
|
|
779
|
+
idx++
|
|
780
|
+
) {
|
|
781
|
+
buf.value[start + idx] = bytes[idx]!
|
|
782
|
+
}
|
|
783
|
+
return start
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
function formatSeconds(seconds: number, nanos: number): string {
|
|
787
|
+
if (nanos === 0) {
|
|
788
|
+
return `${seconds}s`
|
|
789
|
+
}
|
|
790
|
+
const fraction = String(nanos).padStart(9, '0').replace(/0+$/, '')
|
|
791
|
+
return `${seconds}.${fraction}s`
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
function formatSubsecond(nanos: number): string {
|
|
795
|
+
if (nanos >= Millisecond) {
|
|
796
|
+
return formatUnit(nanos, Millisecond, 'ms')
|
|
797
|
+
}
|
|
798
|
+
if (nanos >= Microsecond) {
|
|
799
|
+
return formatUnit(nanos, Microsecond, '\u00b5s')
|
|
800
|
+
}
|
|
801
|
+
return `${nanos}ns`
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
function formatUnit(nanos: number, unit: number, suffix: string): string {
|
|
805
|
+
const whole = Math.floor(nanos / unit)
|
|
806
|
+
const rem = nanos % unit
|
|
807
|
+
if (rem === 0) {
|
|
808
|
+
return `${whole}${suffix}`
|
|
809
|
+
}
|
|
810
|
+
const scale = Math.log10(unit)
|
|
811
|
+
const fraction = String(rem).padStart(scale, '0').replace(/0+$/, '')
|
|
812
|
+
return `${whole}.${fraction}${suffix}`
|
|
593
813
|
}
|
|
594
814
|
|
|
595
815
|
// Location represents a time zone
|
|
@@ -692,17 +912,13 @@ export class Timer {
|
|
|
692
912
|
private _timeout: NodeJS.Timeout | number
|
|
693
913
|
private _duration: Duration
|
|
694
914
|
private _callback?: () => void
|
|
915
|
+
private _channel = makeChannel(1, new Time(), 'both')
|
|
916
|
+
public C: ChannelRef<Time> = makeChannelRef(this._channel, 'receive')
|
|
695
917
|
|
|
696
918
|
constructor(duration: Duration, callback?: () => void) {
|
|
697
919
|
this._duration = duration
|
|
698
920
|
this._callback = callback
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
if (callback) {
|
|
702
|
-
this._timeout = setTimeout(callback, ms)
|
|
703
|
-
} else {
|
|
704
|
-
this._timeout = setTimeout(() => {}, ms)
|
|
705
|
-
}
|
|
921
|
+
this._timeout = this.start(duration)
|
|
706
922
|
}
|
|
707
923
|
|
|
708
924
|
// Stop prevents the Timer from firing
|
|
@@ -718,13 +934,19 @@ export class Timer {
|
|
|
718
934
|
// Reset changes the timer to expire after duration d
|
|
719
935
|
public Reset(d: Duration): boolean {
|
|
720
936
|
this.Stop()
|
|
721
|
-
|
|
937
|
+
this._duration = d
|
|
938
|
+
this._timeout = this.start(d)
|
|
939
|
+
return true
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
private start(d: Duration): NodeJS.Timeout | number {
|
|
943
|
+
const ms = timeoutMilliseconds(d)
|
|
722
944
|
if (this._callback) {
|
|
723
|
-
|
|
724
|
-
} else {
|
|
725
|
-
this._timeout = setTimeout(() => {}, ms)
|
|
945
|
+
return setTimeout(this._callback, ms)
|
|
726
946
|
}
|
|
727
|
-
return
|
|
947
|
+
return setTimeout(() => {
|
|
948
|
+
this._channel.send(Now()).catch(() => {})
|
|
949
|
+
}, ms)
|
|
728
950
|
}
|
|
729
951
|
}
|
|
730
952
|
|
|
@@ -733,11 +955,12 @@ export class Ticker {
|
|
|
733
955
|
private _interval: NodeJS.Timeout | number
|
|
734
956
|
private _duration: Duration
|
|
735
957
|
private _stopped: boolean = false
|
|
958
|
+
private _channel = makeChannel(1, new Time(), 'both')
|
|
959
|
+
public C: ChannelRef<Time> = makeChannelRef(this._channel, 'receive')
|
|
736
960
|
|
|
737
961
|
constructor(duration: Duration) {
|
|
738
962
|
this._duration = duration
|
|
739
|
-
|
|
740
|
-
this._interval = setInterval(() => {}, ms)
|
|
963
|
+
this._interval = this.start(duration)
|
|
741
964
|
}
|
|
742
965
|
|
|
743
966
|
// Stop turns off a ticker
|
|
@@ -755,20 +978,22 @@ export class Ticker {
|
|
|
755
978
|
this.Stop()
|
|
756
979
|
this._stopped = false
|
|
757
980
|
this._duration = d
|
|
758
|
-
|
|
759
|
-
this._interval = setInterval(() => {}, ms)
|
|
981
|
+
this._interval = this.start(d)
|
|
760
982
|
}
|
|
761
983
|
|
|
762
984
|
// Channel returns an async iterator that yields time values
|
|
763
985
|
public async *Channel(): AsyncIterableIterator<Time> {
|
|
764
|
-
const ms = this._duration / 1000000
|
|
765
986
|
while (!this._stopped) {
|
|
766
|
-
await
|
|
767
|
-
if (!this._stopped) {
|
|
768
|
-
yield Now()
|
|
769
|
-
}
|
|
987
|
+
yield await this.C.receive()
|
|
770
988
|
}
|
|
771
989
|
}
|
|
990
|
+
|
|
991
|
+
private start(d: Duration): NodeJS.Timeout | number {
|
|
992
|
+
const ms = timeoutMilliseconds(d)
|
|
993
|
+
return setInterval(() => {
|
|
994
|
+
this._channel.send(Now()).catch(() => {})
|
|
995
|
+
}, ms)
|
|
996
|
+
}
|
|
772
997
|
}
|
|
773
998
|
|
|
774
999
|
// Now returns the current local time with monotonic clock reading
|
|
@@ -861,17 +1086,29 @@ export function Until(t: Time): Duration {
|
|
|
861
1086
|
|
|
862
1087
|
// Sleep pauses the current execution for at least the duration d
|
|
863
1088
|
export async function Sleep(d: Duration): Promise<void> {
|
|
864
|
-
const ms = d
|
|
1089
|
+
const ms = timeoutMilliseconds(d)
|
|
865
1090
|
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
866
1091
|
}
|
|
867
1092
|
|
|
868
1093
|
// Export month constants
|
|
1094
|
+
export const January = Month.January
|
|
1095
|
+
export const February = Month.February
|
|
1096
|
+
export const March = Month.March
|
|
1097
|
+
export const April = Month.April
|
|
869
1098
|
export const May = Month.May
|
|
1099
|
+
export const June = Month.June
|
|
1100
|
+
export const July = Month.July
|
|
1101
|
+
export const August = Month.August
|
|
1102
|
+
export const September = Month.September
|
|
1103
|
+
export const October = Month.October
|
|
1104
|
+
export const November = Month.November
|
|
1105
|
+
export const December = Month.December
|
|
870
1106
|
|
|
871
1107
|
// Time layout constants (matching Go's time package)
|
|
872
1108
|
export const DateTime = '2006-01-02 15:04:05'
|
|
873
1109
|
export const Layout = "01/02 03:04:05PM '06 -0700"
|
|
874
1110
|
export const RFC3339 = '2006-01-02T15:04:05Z07:00'
|
|
1111
|
+
export const RFC3339Nano = '2006-01-02T15:04:05.999999999Z07:00'
|
|
875
1112
|
export const Kitchen = '3:04PM'
|
|
876
1113
|
|
|
877
1114
|
// Unix returns the local Time corresponding to the given Unix time,
|
|
@@ -907,12 +1144,12 @@ export function UnixNano(nsec: number): Time {
|
|
|
907
1144
|
// ParseDuration parses a duration string
|
|
908
1145
|
// A duration string is a possibly signed sequence of decimal numbers,
|
|
909
1146
|
// each with optional fraction and a unit suffix
|
|
910
|
-
export function ParseDuration(s: string): Duration {
|
|
1147
|
+
export function ParseDuration(s: string): [Duration, $.GoError] {
|
|
911
1148
|
const regex = /^([+-]?)(\d+(?:\.\d+)?)(ns|us|µs|ms|s|m|h)$/
|
|
912
1149
|
const match = s.match(regex)
|
|
913
1150
|
|
|
914
1151
|
if (!match) {
|
|
915
|
-
|
|
1152
|
+
return [0, $.newError(`time: invalid duration "${s}"`)]
|
|
916
1153
|
}
|
|
917
1154
|
|
|
918
1155
|
const [, sign, valueStr, unit] = match
|
|
@@ -941,14 +1178,14 @@ export function ParseDuration(s: string): Duration {
|
|
|
941
1178
|
nanoseconds = value * 3600000000000
|
|
942
1179
|
break
|
|
943
1180
|
default:
|
|
944
|
-
|
|
1181
|
+
return [0, $.newError(`time: unknown unit "${unit}" in duration "${s}"`)]
|
|
945
1182
|
}
|
|
946
1183
|
|
|
947
|
-
return nanoseconds
|
|
1184
|
+
return [nanoseconds, null]
|
|
948
1185
|
}
|
|
949
1186
|
|
|
950
1187
|
// Parse parses a formatted string and returns the time value it represents
|
|
951
|
-
export function Parse(layout: string, value: string): Time {
|
|
1188
|
+
export function Parse(layout: string, value: string): [Time, $.GoError] {
|
|
952
1189
|
return ParseInLocation(layout, value, UTC)
|
|
953
1190
|
}
|
|
954
1191
|
|
|
@@ -957,7 +1194,7 @@ export function ParseInLocation(
|
|
|
957
1194
|
layout: string,
|
|
958
1195
|
value: string,
|
|
959
1196
|
loc: Location,
|
|
960
|
-
): Time {
|
|
1197
|
+
): [Time, $.GoError] {
|
|
961
1198
|
// This is a simplified implementation
|
|
962
1199
|
// A full implementation would need to parse according to the layout format
|
|
963
1200
|
|
|
@@ -965,48 +1202,63 @@ export function ParseInLocation(
|
|
|
965
1202
|
if (layout === RFC3339 || layout === '2006-01-02T15:04:05Z07:00') {
|
|
966
1203
|
const date = new globalThis.Date(value)
|
|
967
1204
|
if (isNaN(date.getTime())) {
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
1205
|
+
return [
|
|
1206
|
+
new Time(),
|
|
1207
|
+
$.toGoError(
|
|
1208
|
+
new ParseError(
|
|
1209
|
+
layout,
|
|
1210
|
+
value,
|
|
1211
|
+
'',
|
|
1212
|
+
'',
|
|
1213
|
+
`parsing time "${value}" as "${layout}": cannot parse`,
|
|
1214
|
+
),
|
|
1215
|
+
),
|
|
1216
|
+
]
|
|
975
1217
|
}
|
|
976
|
-
return Time.create(date, 0, undefined, loc)
|
|
1218
|
+
return [Time.create(date, 0, undefined, loc), null]
|
|
977
1219
|
}
|
|
978
1220
|
|
|
979
1221
|
if (layout === DateTime || layout === '2006-01-02 15:04:05') {
|
|
980
1222
|
const date = new globalThis.Date(value)
|
|
981
1223
|
if (isNaN(date.getTime())) {
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
1224
|
+
return [
|
|
1225
|
+
new Time(),
|
|
1226
|
+
$.toGoError(
|
|
1227
|
+
new ParseError(
|
|
1228
|
+
layout,
|
|
1229
|
+
value,
|
|
1230
|
+
'',
|
|
1231
|
+
'',
|
|
1232
|
+
`parsing time "${value}" as "${layout}": cannot parse`,
|
|
1233
|
+
),
|
|
1234
|
+
),
|
|
1235
|
+
]
|
|
989
1236
|
}
|
|
990
|
-
return Time.create(date, 0, undefined, loc)
|
|
1237
|
+
return [Time.create(date, 0, undefined, loc), null]
|
|
991
1238
|
}
|
|
992
1239
|
|
|
993
1240
|
// Fallback to standard Date parsing
|
|
994
1241
|
const date = new globalThis.Date(value)
|
|
995
1242
|
if (isNaN(date.getTime())) {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1243
|
+
return [
|
|
1244
|
+
new Time(),
|
|
1245
|
+
$.toGoError(
|
|
1246
|
+
new ParseError(
|
|
1247
|
+
layout,
|
|
1248
|
+
value,
|
|
1249
|
+
'',
|
|
1250
|
+
'',
|
|
1251
|
+
`parsing time "${value}" as "${layout}": cannot parse`,
|
|
1252
|
+
),
|
|
1253
|
+
),
|
|
1254
|
+
]
|
|
1003
1255
|
}
|
|
1004
|
-
return Time.create(date, 0, undefined, loc)
|
|
1256
|
+
return [Time.create(date, 0, undefined, loc), null]
|
|
1005
1257
|
}
|
|
1006
1258
|
|
|
1007
1259
|
// After waits for the duration to elapse and then sends the current time on the returned channel
|
|
1008
1260
|
export function After(d: Duration): ChannelRef<Time> {
|
|
1009
|
-
const ms = d
|
|
1261
|
+
const ms = timeoutMilliseconds(d)
|
|
1010
1262
|
|
|
1011
1263
|
// Create a buffered channel with capacity 1
|
|
1012
1264
|
const channel = makeChannel(1, new Time(), 'both')
|
|
@@ -1035,8 +1287,8 @@ export function NewTicker(d: Duration): Ticker {
|
|
|
1035
1287
|
}
|
|
1036
1288
|
|
|
1037
1289
|
// Tick is a convenience wrapper for NewTicker providing access to the ticking channel only
|
|
1038
|
-
export function Tick(d: Duration):
|
|
1039
|
-
return new Ticker(d).
|
|
1290
|
+
export function Tick(d: Duration): ChannelRef<Time> {
|
|
1291
|
+
return new Ticker(d).C
|
|
1040
1292
|
}
|
|
1041
1293
|
|
|
1042
1294
|
// LoadLocation returns the Location with the given name
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
CategoryAliases,
|
|
7
|
+
Cn,
|
|
8
|
+
Is,
|
|
9
|
+
Range16,
|
|
10
|
+
Range32,
|
|
11
|
+
RangeTable,
|
|
12
|
+
} from './unicode.js'
|
|
13
|
+
|
|
14
|
+
describe('unicode overrides', () => {
|
|
15
|
+
it('accepts generated struct-literal constructor shapes', () => {
|
|
16
|
+
const table = new RangeTable({
|
|
17
|
+
R16: $.arrayToSlice<Range16>([
|
|
18
|
+
new Range16({ Lo: 0x41, Hi: 0x5a, Stride: 1 }),
|
|
19
|
+
]),
|
|
20
|
+
R32: $.arrayToSlice<Range32>([
|
|
21
|
+
new Range32({ Lo: 0x10000, Hi: 0x10002, Stride: 1 }),
|
|
22
|
+
]),
|
|
23
|
+
LatinOffset: 1,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
expect(table.LatinOffset).toBe(1)
|
|
27
|
+
expect(Is(table, 0x41)).toBe(true)
|
|
28
|
+
expect(Is(table, 0x10001)).toBe(true)
|
|
29
|
+
expect(Is(table, 0x61)).toBe(false)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('exports category aliases used by regexp/syntax', () => {
|
|
33
|
+
expect(CategoryAliases.get('digit')).toBe('Nd')
|
|
34
|
+
expect(Cn).toBeInstanceOf(RangeTable)
|
|
35
|
+
})
|
|
36
|
+
})
|