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/README.md
CHANGED
|
@@ -1,106 +1,154 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
>
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>GoScript</h1>
|
|
3
|
+
|
|
4
|
+
<h3>Readable TypeScript output for Go packages</h3>
|
|
5
|
+
|
|
6
|
+
<p>
|
|
7
|
+
Compile Go packages into TypeScript modules for shared application logic.<br/>
|
|
8
|
+
Built for Bun, modern bundlers, browser demos, and package-level workflows.<br/>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p>
|
|
12
|
+
<a href="https://godoc.org/github.com/aperturerobotics/goscript">
|
|
13
|
+
<img src="https://godoc.org/github.com/aperturerobotics/goscript?status.svg" alt="GoDoc" />
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://goreportcard.com/report/github.com/aperturerobotics/goscript">
|
|
16
|
+
<img src="https://goreportcard.com/badge/github.com/aperturerobotics/goscript" alt="Go Report Card" />
|
|
17
|
+
</a>
|
|
18
|
+
<a href="https://deepwiki.com/aperturerobotics/goscript">
|
|
19
|
+
<img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki" />
|
|
20
|
+
</a>
|
|
21
|
+
</p>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
## Overview
|
|
25
|
+
|
|
26
|
+
**GoScript** is an experimental Go-to-TypeScript compiler.
|
|
27
|
+
|
|
28
|
+
GoScript compiles Go packages from inside a Go module and writes deterministic
|
|
29
|
+
TypeScript packages under `@goscript/<go-package>/`. The compiler keeps package
|
|
30
|
+
loading, semantic modeling, lowering, TypeScript emission, runtime helpers, and
|
|
31
|
+
handwritten override packages as explicit pipeline stages so generated output is
|
|
32
|
+
readable and semantic decisions have one owner.
|
|
33
|
+
|
|
34
|
+
> "Right now goscript looks pretty cool if [your] problem is 'I want this
|
|
35
|
+
> self-sufficient algorithm [to] be available in Go and JS runtimes.'"
|
|
15
36
|
>
|
|
16
|
-
>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
37
|
+
> - [nevkontakte](https://gophers.slack.com/archives/C039C0R2T/p1745870396945719),
|
|
38
|
+
> developer of [GopherJS](https://github.com/gopherjs/gopherjs)
|
|
39
|
+
|
|
40
|
+
That contrast is the project shape. GopherJS aims to make any valid Go program
|
|
41
|
+
run in a browser. GoScript starts from the narrower but common product need:
|
|
42
|
+
move self-contained Go logic into TypeScript projects without maintaining a
|
|
43
|
+
second implementation.
|
|
44
|
+
|
|
45
|
+
### Why GoScript?
|
|
46
|
+
|
|
47
|
+
Use GoScript when you want to share Go algorithms, data structures, validation
|
|
48
|
+
logic, or selected runtime code with TypeScript and browser environments without
|
|
49
|
+
maintaining a second implementation by hand. The first supported target is a
|
|
50
|
+
useful, well-defined subset of Go that produces readable TypeScript and avoids
|
|
51
|
+
unsafe-heavy runtime behavior. The long-term goal is to expand that subset until
|
|
52
|
+
ordinary Go programs can run through GoScript, but that is not the first
|
|
53
|
+
compatibility bar.
|
|
54
|
+
|
|
55
|
+
Good fits today include:
|
|
56
|
+
|
|
57
|
+
- Sharing validation, formatting, parsing, and business rules between Go services and TypeScript applications
|
|
58
|
+
- Publishing TypeScript packages from Go data structures and algorithms
|
|
59
|
+
- Running selected Go runtime code in Bun, browser demos, and modern bundlers
|
|
60
|
+
- Building package-level test workflows that exercise generated TypeScript instead of handwritten ports
|
|
61
|
+
|
|
62
|
+
GoScript is not currently a drop-in browser runtime for every valid Go program.
|
|
63
|
+
The project prioritizes clear generated TypeScript, explicit runtime contracts,
|
|
64
|
+
and focused support for Go language features that can be modeled cleanly in
|
|
65
|
+
TypeScript.
|
|
66
|
+
|
|
67
|
+
Useful docs:
|
|
68
|
+
|
|
69
|
+
- [Architecture explainer](./docs/explainer.md)
|
|
70
|
+
- [Compiler design](./design/DESIGN.md)
|
|
71
|
+
- [Compliance tests](./tests/README.md)
|
|
72
|
+
- [Runtime packages](./gs/README.md)
|
|
73
|
+
|
|
74
|
+
## Current Surface
|
|
75
|
+
|
|
76
|
+
### Works Today
|
|
77
|
+
|
|
78
|
+
The package compiler currently supports:
|
|
79
|
+
|
|
80
|
+
- Go package loading through `go/packages` with `GOOS=js` and `GOARCH=wasm`
|
|
81
|
+
- Go build tags through CLI build flags, including `goscript`-selected code paths
|
|
82
|
+
- Structs, methods, interfaces, type assertions, typed nils, and value copying
|
|
83
|
+
- Pointers and address-taken variables through the `VarRef` runtime model
|
|
84
|
+
- Arrays, slices, maps, strings, named types, complex values, and selected builtins
|
|
85
|
+
- Generics through generated type-argument dictionaries for supported call,
|
|
86
|
+
method, and descriptor shapes
|
|
87
|
+
- Goroutines, channels, `select`, `defer`, async calls, async function values,
|
|
88
|
+
async callbacks, async interfaces, and async package tests
|
|
89
|
+
- Package initialization, cross-file imports, package indexes, dependency
|
|
90
|
+
output, and package-scoped test graph variants
|
|
91
|
+
- Handwritten `gs/` runtime and standard-library override packages for the
|
|
92
|
+
browser/WASM-oriented subset
|
|
93
|
+
- `goscript test`, which compiles selected Go package tests to TypeScript,
|
|
94
|
+
typechecks the generated workspace, runs it with Bun, and reports package
|
|
95
|
+
failures with owner classifications
|
|
96
|
+
- Browser/WASM compilation for import-free single-file demos
|
|
97
|
+
|
|
98
|
+
### Intentional Limits
|
|
99
|
+
|
|
100
|
+
- CLI, Go API, and Node API inputs are package patterns, not direct `main.go` files.
|
|
101
|
+
- Browser source compilation is import-free only. Imported code should use the package workflow.
|
|
102
|
+
- `unsafe`, pointer arithmetic, cgo, and arbitrary Go runtime behavior are not
|
|
103
|
+
part of the first supported target.
|
|
104
|
+
- JavaScript `number` is used for numeric output, so it does not preserve every Go integer edge case.
|
|
105
|
+
- Standard-library coverage is practical and override-driven, not complete.
|
|
106
|
+
- Package-test execution intentionally supports a growing GoScript-compatible
|
|
107
|
+
subset of `testing`, not the complete `go test` flag surface.
|
|
108
|
+
|
|
109
|
+
## Getting Started
|
|
110
|
+
|
|
111
|
+
Install Bun for TypeScript tests, examples, and website builds:
|
|
65
112
|
|
|
66
113
|
```bash
|
|
67
|
-
# Install Bun
|
|
68
114
|
curl -fsSL https://bun.sh/install | bash
|
|
69
115
|
```
|
|
70
116
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
**Option 1: Go Install**
|
|
117
|
+
Install the CLI:
|
|
74
118
|
|
|
75
119
|
```bash
|
|
76
120
|
go install github.com/aperturerobotics/goscript/cmd/goscript@latest
|
|
77
121
|
```
|
|
78
122
|
|
|
79
|
-
|
|
123
|
+
Compile a Go package from a module directory:
|
|
80
124
|
|
|
81
125
|
```bash
|
|
82
|
-
|
|
126
|
+
goscript compile --package . --output ./output
|
|
83
127
|
```
|
|
84
128
|
|
|
85
|
-
|
|
129
|
+
The output tree looks like this:
|
|
86
130
|
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
goscript
|
|
131
|
+
```text
|
|
132
|
+
output/
|
|
133
|
+
└── @goscript/
|
|
134
|
+
├── builtin/
|
|
135
|
+
└── example.com/my/module/
|
|
136
|
+
├── index.ts
|
|
137
|
+
└── main.gs.ts
|
|
90
138
|
```
|
|
91
139
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
written.
|
|
96
|
-
|
|
97
|
-
## 📦 Using Generated Code in Your Project
|
|
140
|
+
For a generated `package main`, GoScript emits a main-script guard so the module
|
|
141
|
+
can run directly in Bun or a bundler that resolves `@goscript/*` imports. See
|
|
142
|
+
[example/simple](./example/simple) for the smallest compile-and-run workflow.
|
|
98
143
|
|
|
99
|
-
|
|
144
|
+
## TypeScript Projects
|
|
100
145
|
|
|
101
|
-
|
|
146
|
+
Generated package indexes re-export generated files such as `./main.gs.ts`, and
|
|
147
|
+
some package-local imports also use explicit `.ts` specifiers. Your TypeScript
|
|
148
|
+
project needs to allow those imports and map `@goscript/*` to the generated
|
|
149
|
+
output root.
|
|
102
150
|
|
|
103
|
-
|
|
151
|
+
Use this shape as the starting point:
|
|
104
152
|
|
|
105
153
|
```json
|
|
106
154
|
{
|
|
@@ -108,11 +156,13 @@ Create or update your `tsconfig.json` with these settings:
|
|
|
108
156
|
"target": "ES2022",
|
|
109
157
|
"module": "ESNext",
|
|
110
158
|
"moduleResolution": "bundler",
|
|
111
|
-
"lib": ["ES2022", "esnext.disposable", "
|
|
112
|
-
"baseUrl": "
|
|
159
|
+
"lib": ["ES2022", "esnext.disposable", "DOM"],
|
|
160
|
+
"baseUrl": ".",
|
|
113
161
|
"paths": {
|
|
114
|
-
"@goscript/*": ["./
|
|
162
|
+
"@goscript/*": ["./output/@goscript/*"]
|
|
115
163
|
},
|
|
164
|
+
"allowImportingTsExtensions": true,
|
|
165
|
+
"rewriteRelativeImportExtensions": true,
|
|
116
166
|
"allowSyntheticDefaultImports": true,
|
|
117
167
|
"esModuleInterop": true,
|
|
118
168
|
"skipLibCheck": true,
|
|
@@ -121,237 +171,199 @@ Create or update your `tsconfig.json` with these settings:
|
|
|
121
171
|
}
|
|
122
172
|
```
|
|
123
173
|
|
|
124
|
-
|
|
174
|
+
The important settings are:
|
|
125
175
|
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
176
|
+
- `moduleResolution: "bundler"` so `@goscript/*` package imports resolve like a modern app build.
|
|
177
|
+
- `allowImportingTsExtensions: true` because generated indexes and same-package imports can reference `.ts` files directly.
|
|
178
|
+
- `rewriteRelativeImportExtensions: true` if TypeScript is emitting JavaScript instead of only typechecking.
|
|
179
|
+
- `paths` pointing at the generated `@goscript/` tree.
|
|
130
180
|
|
|
131
|
-
|
|
181
|
+
If your bundler owns JavaScript emission and TypeScript only typechecks, adding
|
|
182
|
+
`"noEmit": true` is also a good fit.
|
|
132
183
|
|
|
133
|
-
|
|
134
|
-
generated module can be executed directly by a TypeScript runtime or bundler
|
|
135
|
-
that resolves `@goscript/*` imports. The `example/simple` package shows the
|
|
136
|
-
supported compile-and-run workflow.
|
|
137
|
-
|
|
138
|
-
## 🛠️ Integration & Usage
|
|
139
|
-
|
|
140
|
-
### Command Line
|
|
184
|
+
## Command Line
|
|
141
185
|
|
|
142
186
|
```bash
|
|
143
|
-
goscript compile
|
|
187
|
+
goscript compile \
|
|
188
|
+
--package ./my-go-package \
|
|
189
|
+
--output ./output
|
|
144
190
|
```
|
|
145
191
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
- `--package <path>` - Go package pattern to compile
|
|
149
|
-
- `--output <dir>` - Output directory for TypeScript files
|
|
150
|
-
- `--dir <dir>` - Working directory for module/package loading
|
|
151
|
-
- `--build-flags <flag>` - Go package loader build flag, repeatable
|
|
192
|
+
Common options:
|
|
152
193
|
|
|
153
|
-
|
|
194
|
+
- `--package <pattern>`: Go package pattern to compile. Repeat for multiple packages.
|
|
195
|
+
- `--output <dir>`: output directory for the generated TypeScript tree.
|
|
196
|
+
- `--dir <dir>`: working directory for module/package loading.
|
|
197
|
+
- `--build-flags <flag>`: Go build flag, repeatable.
|
|
198
|
+
- `--all-dependencies`: compile dependency packages instead of only requested packages.
|
|
199
|
+
- `--disable-emit-builtin`: skip copying handwritten `gs/` runtime packages.
|
|
154
200
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
```go
|
|
158
|
-
import "github.com/aperturerobotics/goscript/compiler"
|
|
201
|
+
Run Go package tests through GoScript:
|
|
159
202
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
_, err = comp.CompilePackages(ctx, "your/package/path")
|
|
203
|
+
```bash
|
|
204
|
+
goscript test --tags goscript ./...
|
|
163
205
|
```
|
|
164
206
|
|
|
165
|
-
|
|
207
|
+
`goscript test` loads package test variants, compiles each selected package
|
|
208
|
+
through the normal GoScript pipeline, writes a TypeScript test runner, typechecks
|
|
209
|
+
the generated workspace, and runs it with Bun. Useful options:
|
|
166
210
|
|
|
167
|
-
|
|
168
|
-
|
|
211
|
+
- `--tags <tags>`: comma-separated Go build tags.
|
|
212
|
+
- `--run <regexp>`: run only matching Go test names.
|
|
213
|
+
- `--count <n>`: run selected tests multiple times.
|
|
214
|
+
- `--timeout <duration>`: maximum package-test runtime.
|
|
215
|
+
- `--workdir <dir>`: generated test workspace directory.
|
|
216
|
+
- `--output <dir>`: generated TypeScript output root.
|
|
169
217
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
output: './dist',
|
|
173
|
-
})
|
|
174
|
-
```
|
|
218
|
+
The output is shaped like `go test` where possible and adds an `owner=...`
|
|
219
|
+
classification for failures that occur before the generated tests run.
|
|
175
220
|
|
|
176
|
-
|
|
221
|
+
## APIs
|
|
177
222
|
|
|
178
|
-
|
|
223
|
+
Go API:
|
|
179
224
|
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
function CalculatorApp() {
|
|
184
|
-
const [calc] = useState(() => NewCalculator())
|
|
185
|
-
|
|
186
|
-
const handleAdd = () => {
|
|
187
|
-
const result = calc.Add(5, 3)
|
|
188
|
-
setResult(result)
|
|
189
|
-
}
|
|
225
|
+
```go
|
|
226
|
+
package main
|
|
190
227
|
|
|
191
|
-
|
|
228
|
+
import (
|
|
229
|
+
"context"
|
|
230
|
+
|
|
231
|
+
"github.com/aperturerobotics/goscript/compiler"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
func main() {
|
|
235
|
+
comp, err := compiler.NewCompiler(&compiler.Config{
|
|
236
|
+
Dir: ".",
|
|
237
|
+
OutputPath: "./output",
|
|
238
|
+
}, nil, nil)
|
|
239
|
+
if err != nil {
|
|
240
|
+
panic(err)
|
|
241
|
+
}
|
|
242
|
+
if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
|
|
243
|
+
panic(err)
|
|
244
|
+
}
|
|
192
245
|
}
|
|
193
246
|
```
|
|
194
247
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
```vue
|
|
198
|
-
<script setup lang="ts">
|
|
199
|
-
import { NewUser, FindUserByEmail } from '@goscript/myapp/user'
|
|
248
|
+
Node/Bun API:
|
|
200
249
|
|
|
201
|
-
|
|
250
|
+
```ts
|
|
251
|
+
import { compile } from 'goscript'
|
|
202
252
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
253
|
+
await compile({
|
|
254
|
+
pkg: '.',
|
|
255
|
+
output: './output',
|
|
256
|
+
dir: process.cwd(),
|
|
257
|
+
})
|
|
207
258
|
```
|
|
208
259
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
See the [example/app](./example/app) for a full todo list application using GoScript with tRPC, Drizzle ORM, and React, or [example/simple](./example/simple) for a comprehensive demo of language features.
|
|
212
|
-
|
|
213
|
-
### Example: User Management
|
|
214
|
-
|
|
215
|
-
**Go Code** (`user.go`):
|
|
260
|
+
WASM adapter package:
|
|
216
261
|
|
|
217
262
|
```go
|
|
218
263
|
package main
|
|
219
264
|
|
|
220
|
-
|
|
221
|
-
ID int `json:"id"`
|
|
222
|
-
Name string `json:"name"`
|
|
223
|
-
Email string `json:"email"`
|
|
224
|
-
}
|
|
265
|
+
import "github.com/aperturerobotics/goscript/compiler/wasm"
|
|
225
266
|
|
|
226
|
-
func (
|
|
227
|
-
|
|
228
|
-
|
|
267
|
+
func main() {
|
|
268
|
+
ts, err := wasm.CompileSource(`
|
|
269
|
+
package main
|
|
229
270
|
|
|
230
|
-
func
|
|
231
|
-
|
|
271
|
+
func main() {
|
|
272
|
+
println("hello from GoScript")
|
|
232
273
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return nil
|
|
274
|
+
`, "main")
|
|
275
|
+
if err != nil {
|
|
276
|
+
panic(err)
|
|
277
|
+
}
|
|
278
|
+
_ = ts
|
|
241
279
|
}
|
|
242
280
|
```
|
|
243
281
|
|
|
244
|
-
|
|
282
|
+
The website compiles this package into the browser build. Browser source
|
|
283
|
+
compilation accepts import-free single-file demos. Package imports return a
|
|
284
|
+
structured diagnostic; compile imported code with the package workflow.
|
|
245
285
|
|
|
246
|
-
|
|
247
|
-
|
|
286
|
+
## Architecture
|
|
287
|
+
|
|
288
|
+
GoScript v2 uses a linear compiler pipeline:
|
|
289
|
+
|
|
290
|
+
```text
|
|
291
|
+
public adapter
|
|
292
|
+
-> compile request
|
|
293
|
+
-> package graph
|
|
294
|
+
-> semantic model
|
|
295
|
+
-> lowered program
|
|
296
|
+
-> TypeScript emitter
|
|
297
|
+
-> runtime/override package copy
|
|
248
298
|
```
|
|
249
299
|
|
|
250
|
-
|
|
300
|
+
Each step owns one durable rule boundary:
|
|
251
301
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
302
|
+
- `CompileRequestOwner` validates adapter input, module roots, output paths, and build flags.
|
|
303
|
+
- `PackageGraphOwner` loads Go packages and records dependency edges.
|
|
304
|
+
- `SemanticModelOwner` computes type, value, import, addressability, interface, and async facts.
|
|
305
|
+
- `LoweringOwner` turns Go syntax plus semantic facts into compiler-owned IR.
|
|
306
|
+
- `TypeScriptEmitOwner` renders deterministic, semicolon-free TypeScript from IR only.
|
|
307
|
+
- `RuntimeContractOwner` owns generated helper names and `@goscript/builtin` import policy.
|
|
308
|
+
- `OverrideRegistryOwner` discovers and copies handwritten runtime and standard-library packages.
|
|
257
309
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return u.Name !== '' && u.Email !== ''
|
|
261
|
-
}
|
|
310
|
+
This keeps semantic decisions out of the text emitter and makes generated output
|
|
311
|
+
changes easier to trace back to the owner that made the decision.
|
|
262
312
|
|
|
263
|
-
|
|
264
|
-
if (init) Object.assign(this, init)
|
|
265
|
-
}
|
|
266
|
-
}
|
|
313
|
+
## Running from Source
|
|
267
314
|
|
|
268
|
-
|
|
269
|
-
return new User({ ID: id, Name: name, Email: email })
|
|
270
|
-
}
|
|
315
|
+
Install dependencies:
|
|
271
316
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (user.Email === email) {
|
|
275
|
-
return user
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return null
|
|
279
|
-
}
|
|
317
|
+
```bash
|
|
318
|
+
bun install
|
|
280
319
|
```
|
|
281
320
|
|
|
282
|
-
|
|
321
|
+
Run the core checks:
|
|
283
322
|
|
|
284
|
-
```
|
|
285
|
-
|
|
323
|
+
```bash
|
|
324
|
+
bun run test
|
|
325
|
+
bun run lint
|
|
326
|
+
bun run build
|
|
327
|
+
```
|
|
286
328
|
|
|
287
|
-
|
|
288
|
-
const users = [
|
|
289
|
-
NewUser(1, 'Alice', 'alice@example.com'),
|
|
290
|
-
NewUser(2, 'Bob', 'bob@example.com'),
|
|
291
|
-
]
|
|
329
|
+
Run the simple package example:
|
|
292
330
|
|
|
293
|
-
|
|
294
|
-
|
|
331
|
+
```bash
|
|
332
|
+
bun run example
|
|
295
333
|
```
|
|
296
334
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
**Go Code:**
|
|
335
|
+
Build the static website and browser demo assets:
|
|
300
336
|
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
results := make(chan string, len(messages))
|
|
304
|
-
|
|
305
|
-
for _, msg := range messages {
|
|
306
|
-
go func(m string) {
|
|
307
|
-
// Simulate processing
|
|
308
|
-
processed := "✓ " + m
|
|
309
|
-
results <- processed
|
|
310
|
-
}(msg)
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
return results
|
|
314
|
-
}
|
|
337
|
+
```bash
|
|
338
|
+
bun run website:build
|
|
315
339
|
```
|
|
316
340
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
export function ProcessMessages(messages: string[]): $.Channel<string> {
|
|
321
|
-
let results = $.makeChannel<string>(messages.length, '')
|
|
341
|
+
The website playground can compile and run import-free single-file demos in the
|
|
342
|
+
browser. Compliance examples and imported-package examples are precompiled by the
|
|
343
|
+
website build.
|
|
322
344
|
|
|
323
|
-
|
|
324
|
-
queueMicrotask(async (m: string) => {
|
|
325
|
-
let processed = '✓ ' + m
|
|
326
|
-
await results.send(processed)
|
|
327
|
-
})(msg)
|
|
328
|
-
}
|
|
345
|
+
## Examples
|
|
329
346
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
347
|
+
- [example/simple](./example/simple): smallest package compile-and-run workflow.
|
|
348
|
+
- [example/app](./example/app): full-stack application example using generated TypeScript.
|
|
349
|
+
- [tests/tests](./tests/tests): inherited compliance fixtures and generated output snapshots.
|
|
333
350
|
|
|
334
|
-
|
|
351
|
+
## Contributing
|
|
335
352
|
|
|
336
|
-
|
|
337
|
-
|
|
353
|
+
GoScript is experimental. Small compatibility shims are usually the wrong fix;
|
|
354
|
+
prefer adding focused compiler or compliance tests that name the missing semantic
|
|
355
|
+
owner, then implement the owner-level behavior.
|
|
338
356
|
|
|
339
|
-
|
|
340
|
-
const channel = ProcessMessages(['hello', 'world', 'goscript'])
|
|
357
|
+
Use the repo scripts rather than direct package-manager commands:
|
|
341
358
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
-
}
|
|
359
|
+
```bash
|
|
360
|
+
bun run test
|
|
361
|
+
bun run lint
|
|
362
|
+
bun run build
|
|
348
363
|
```
|
|
349
364
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
- Try GoScript on your code and [report issues](https://github.com/aperturerobotics/goscript/issues)
|
|
353
|
-
- Check the [compliance tests](./tests/README.md) for current progress
|
|
354
|
-
- Contribute test cases for edge cases you discover
|
|
365
|
+
Please open issues for unsupported Go shapes, runtime gaps, and standard-library
|
|
366
|
+
override gaps.
|
|
355
367
|
|
|
356
368
|
## License
|
|
357
369
|
|