goscript 0.2.2 → 0.2.3
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/compiler/gotest/testdata/browserapi/browserapi_test.go +36 -0
- package/compiler/lowering.go +223 -9
- package/compiler/override-registry_test.go +50 -0
- package/compiler/protobuf-ts-binding.go +154 -6
- package/compiler/protobuf-ts-binding_test.go +7 -2
- package/compiler/runtime-contract.go +2 -0
- package/compiler/runtime-contract_test.go +1 -0
- package/compiler/semantic-model.go +16 -0
- package/compiler/semantic-model_test.go +38 -0
- package/compiler/skeleton_test.go +473 -15
- package/compiler/typescript-emitter.go +4 -0
- package/dist/gs/builtin/builtin.js +7 -9
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/defer.js +2 -2
- package/dist/gs/builtin/hostio.js +5 -5
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +2 -1
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +3 -0
- package/dist/gs/builtin/slice.js +39 -0
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.js +49 -0
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/compress/zlib/index.js +5 -2
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.js +27 -8
- package/dist/gs/crypto/ecdh/index.js.map +1 -1
- package/dist/gs/crypto/ed25519/index.js +3 -3
- package/dist/gs/crypto/ed25519/index.js.map +1 -1
- package/dist/gs/crypto/rand/index.js +6 -3
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/embed/index.js +9 -3
- package/dist/gs/embed/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +33 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +4 -1
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -1
- package/dist/gs/golang.org/x/crypto/scrypt/index.d.ts +2 -0
- package/dist/gs/golang.org/x/crypto/scrypt/index.js +39 -0
- package/dist/gs/golang.org/x/crypto/scrypt/index.js.map +1 -0
- package/dist/gs/hash/fnv/index.js +13 -5
- package/dist/gs/hash/fnv/index.js.map +1 -1
- package/dist/gs/io/fs/glob.d.ts +3 -3
- package/dist/gs/io/fs/glob.js +8 -8
- package/dist/gs/io/fs/glob.js.map +1 -1
- package/dist/gs/io/fs/readdir.d.ts +2 -2
- package/dist/gs/io/fs/readdir.js +13 -74
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +4 -4
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/fs/walk.js +1 -1
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/mime/index.js +5 -2
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.js +6 -3
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +16 -4
- package/dist/gs/net/http/index.js +236 -40
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/net/http/pprof/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +1 -1
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +2 -0
- package/dist/gs/reflect/type.js +53 -21
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +2 -2
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/slices/slices.d.ts +1 -1
- package/dist/gs/slices/slices.js +37 -4
- package/dist/gs/slices/slices.js.map +1 -1
- package/gs/builtin/builtin.ts +11 -14
- package/gs/builtin/defer.ts +2 -2
- package/gs/builtin/hostio.ts +5 -5
- package/gs/builtin/map.ts +4 -1
- package/gs/builtin/slice.test.ts +14 -0
- package/gs/builtin/slice.ts +64 -0
- package/gs/builtin/type.ts +72 -0
- package/gs/bytes/bytes.test.ts +14 -13
- package/gs/compress/zlib/index.test.ts +19 -5
- package/gs/compress/zlib/index.ts +16 -7
- package/gs/context/context.test.ts +3 -1
- package/gs/crypto/ecdh/index.test.ts +6 -2
- package/gs/crypto/ecdh/index.ts +49 -12
- package/gs/crypto/ed25519/index.ts +20 -7
- package/gs/crypto/rand/index.ts +6 -3
- package/gs/embed/index.test.ts +3 -3
- package/gs/embed/index.ts +9 -3
- package/gs/fmt/fmt.test.ts +29 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +126 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +46 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +9 -3
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +2 -8
- package/gs/golang.org/x/crypto/scrypt/index.test.ts +81 -0
- package/gs/golang.org/x/crypto/scrypt/index.ts +54 -0
- package/gs/golang.org/x/crypto/scrypt/meta.json +5 -0
- package/gs/hash/fnv/index.test.ts +1 -8
- package/gs/hash/fnv/index.ts +27 -10
- package/gs/io/fs/glob.ts +13 -10
- package/gs/io/fs/meta.json +2 -0
- package/gs/io/fs/readdir.test.ts +63 -2
- package/gs/io/fs/readdir.ts +33 -30
- package/gs/io/fs/sub.ts +4 -4
- package/gs/io/fs/walk.ts +1 -1
- package/gs/maps/iter.ts +9 -9
- package/gs/maps/maps.ts +4 -4
- package/gs/math/bits/index.test.ts +10 -1
- package/gs/mime/index.test.ts +33 -15
- package/gs/mime/index.ts +9 -2
- package/gs/net/http/httptest/index.test.ts +17 -3
- package/gs/net/http/httptest/index.ts +8 -3
- package/gs/net/http/index.test.ts +645 -123
- package/gs/net/http/index.ts +548 -113
- package/gs/net/http/pprof/index.ts +24 -6
- package/gs/os/file_unix_js.test.ts +22 -0
- package/gs/reflect/iter.ts +4 -2
- package/gs/reflect/map.test.ts +56 -1
- package/gs/reflect/type.ts +76 -37
- package/gs/runtime/pprof/index.test.ts +7 -1
- package/gs/runtime/pprof/index.ts +5 -1
- package/gs/runtime/runtime.test.ts +7 -0
- package/gs/runtime/runtime.ts +2 -4
- package/gs/runtime/trace/index.test.ts +9 -1
- package/gs/runtime/trace/index.ts +5 -1
- package/gs/slices/meta.json +3 -0
- package/gs/slices/slices.test.ts +59 -21
- package/gs/slices/slices.ts +61 -20
- package/gs/strconv/complex.test.ts +17 -3
- package/gs/sync/atomic/doc_64.test.ts +2 -9
- package/gs/sync/sync.test.ts +18 -8
- package/gs/syscall/js/index.test.ts +9 -4
- package/package.json +5 -4
|
@@ -204,7 +204,11 @@ func TestProtobufTypeScriptBindingEmitsMetadataForPreservedOneofFiles(t *testing
|
|
|
204
204
|
"type Wrapper_StringValue struct {\n"+
|
|
205
205
|
"\tStringValue string `protobuf:\"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof\"`\n"+
|
|
206
206
|
"}\n\n"+
|
|
207
|
-
"func (*Wrapper_StringValue) isWrapper_Choice() {}\n"
|
|
207
|
+
"func (*Wrapper_StringValue) isWrapper_Choice() {}\n\n"+
|
|
208
|
+
"type Wrapper_InnerValue struct {\n"+
|
|
209
|
+
"\tInnerValue *Inner `protobuf:\"bytes,3,opt,name=inner_value,json=innerValue,proto3,oneof\"`\n"+
|
|
210
|
+
"}\n\n"+
|
|
211
|
+
"func (*Wrapper_InnerValue) isWrapper_Choice() {}\n")
|
|
208
212
|
writeTestFile(t, dir, "foo.pb.ts", `export interface Inner {
|
|
209
213
|
name?: string
|
|
210
214
|
}
|
|
@@ -231,7 +235,8 @@ export const Wrapper = {} as any
|
|
|
231
235
|
binding := readTestFile(t, filepath.Join(out, "@goscript", "example.test", "oneofpb", "foo.pb.ts"))
|
|
232
236
|
if !strings.Contains(binding, `import * as __protobuf_ts`) ||
|
|
233
237
|
!strings.Contains(binding, `(Wrapper as any).__protobufTypeScriptMessage = __protobuf_ts.Wrapper;`) ||
|
|
234
|
-
!strings.Contains(binding, `(Wrapper as any).__protobufTypeScriptFields = {"inner": Inner};`)
|
|
238
|
+
!strings.Contains(binding, `(Wrapper as any).__protobufTypeScriptFields = {"inner": Inner, "innerValue": Inner};`) ||
|
|
239
|
+
!strings.Contains(binding, `(Wrapper as any).__protobufTypeScriptOneofFields = {"choice": {"innerValue": Wrapper_InnerValue, "stringValue": Wrapper_StringValue}};`) {
|
|
235
240
|
t.Fatalf("oneof-preserved protobuf file should still expose TypeScript metadata, got:\n%s", binding)
|
|
236
241
|
}
|
|
237
242
|
if strings.Contains(binding, `__protobuf_ts.Wrapper_StringValue`) {
|
|
@@ -88,6 +88,7 @@ const (
|
|
|
88
88
|
RuntimeHelperSliceToArray RuntimeHelper = "slice.sliceToArray"
|
|
89
89
|
RuntimeHelperSliceToArrayPointer RuntimeHelper = "slice.sliceToArrayPointer"
|
|
90
90
|
RuntimeHelperAppend RuntimeHelper = "slice.append"
|
|
91
|
+
RuntimeHelperAppendSlice RuntimeHelper = "slice.appendSlice"
|
|
91
92
|
RuntimeHelperCopy RuntimeHelper = "slice.copy"
|
|
92
93
|
RuntimeHelperAsArray RuntimeHelper = "slice.asArray"
|
|
93
94
|
RuntimeHelperStringToRunes RuntimeHelper = "slice.stringToRunes"
|
|
@@ -318,6 +319,7 @@ func runtimeHelperContracts() []RuntimeHelperContract {
|
|
|
318
319
|
runtimeHelper(RuntimeHelperSliceToArray, "sliceToArray", RuntimeHelperCategorySlice),
|
|
319
320
|
runtimeHelper(RuntimeHelperSliceToArrayPointer, "sliceToArrayPointer", RuntimeHelperCategorySlice),
|
|
320
321
|
runtimeHelper(RuntimeHelperAppend, "append", RuntimeHelperCategorySlice),
|
|
322
|
+
runtimeHelper(RuntimeHelperAppendSlice, "appendSlice", RuntimeHelperCategorySlice),
|
|
321
323
|
runtimeHelper(RuntimeHelperCopy, "copy", RuntimeHelperCategorySlice),
|
|
322
324
|
runtimeHelper(RuntimeHelperAsArray, "asArray", RuntimeHelperCategorySlice),
|
|
323
325
|
runtimeHelper(RuntimeHelperStringToRunes, "stringToRunes", RuntimeHelperCategorySlice),
|
|
@@ -24,6 +24,7 @@ func TestRuntimeContractOwnsBuiltinImportAndHelpers(t *testing.T) {
|
|
|
24
24
|
RuntimeHelperPointerValue: RuntimeHelperCategoryValue,
|
|
25
25
|
RuntimeHelperMakeSlice: RuntimeHelperCategorySlice,
|
|
26
26
|
RuntimeHelperAppend: RuntimeHelperCategorySlice,
|
|
27
|
+
RuntimeHelperAppendSlice: RuntimeHelperCategorySlice,
|
|
27
28
|
RuntimeHelperIndexAddress: RuntimeHelperCategorySlice,
|
|
28
29
|
RuntimeHelperIndexByteAddress: RuntimeHelperCategorySlice,
|
|
29
30
|
RuntimeHelperUnsafePointerRef: RuntimeHelperCategorySlice,
|
|
@@ -769,6 +769,9 @@ func (o *SemanticModelOwner) collectFunctionFacts(
|
|
|
769
769
|
if callUsesFunctionIdentifier(pkg, typed.Fun) {
|
|
770
770
|
markFunctionAsync(semFn, "function-identifier-call")
|
|
771
771
|
}
|
|
772
|
+
if callUsesInterfaceMethod(pkg, typed.Fun) {
|
|
773
|
+
markFunctionAsync(semFn, "interface-method-call")
|
|
774
|
+
}
|
|
772
775
|
if overrideFacts.IsMethodAsync(overrideCallPackage(pkg, typed.Fun), overrideCallMethod(pkg, typed.Fun)) {
|
|
773
776
|
markFunctionAsync(semFn, "override")
|
|
774
777
|
}
|
|
@@ -815,6 +818,9 @@ func recordImmediateFuncLitAsyncFacts(
|
|
|
815
818
|
if callUsesFunctionIdentifier(pkg, typed.Fun) {
|
|
816
819
|
markFunctionAsync(semFn, "async-function-literal-call")
|
|
817
820
|
}
|
|
821
|
+
if callUsesInterfaceMethod(pkg, typed.Fun) {
|
|
822
|
+
markFunctionAsync(semFn, "async-function-literal-call")
|
|
823
|
+
}
|
|
818
824
|
if called != nil {
|
|
819
825
|
calledFn := semanticFunctionFor(model, called)
|
|
820
826
|
if calledFn != nil && calledFn.async {
|
|
@@ -1156,6 +1162,10 @@ func exprMayNeedAwait(model *SemanticModel, pkg *packages.Package, expr ast.Expr
|
|
|
1156
1162
|
needsAwait = true
|
|
1157
1163
|
return false
|
|
1158
1164
|
}
|
|
1165
|
+
if callUsesInterfaceMethod(pkg, typed.Fun) {
|
|
1166
|
+
needsAwait = true
|
|
1167
|
+
return false
|
|
1168
|
+
}
|
|
1159
1169
|
if called := calledFunction(pkg, typed.Fun); called != nil {
|
|
1160
1170
|
semFn := semanticFunctionFor(model, called)
|
|
1161
1171
|
if semFn != nil && semFn.async {
|
|
@@ -1672,6 +1682,9 @@ func (o *SemanticModelOwner) applyInterfaceAsyncMethods(
|
|
|
1672
1682
|
}
|
|
1673
1683
|
for methodName, ifaceMethod := range graphEntry.ifaceMethods {
|
|
1674
1684
|
implMethod := graphEntry.implMethods[methodName]
|
|
1685
|
+
if isSyncErrorMethodFunc(ifaceMethod) || isSyncErrorMethodFunc(implMethod) {
|
|
1686
|
+
continue
|
|
1687
|
+
}
|
|
1675
1688
|
implFn := semanticFunctionFor(model, implMethod)
|
|
1676
1689
|
if implFn != nil && implFn.async {
|
|
1677
1690
|
model.markInterfaceMethodAsync(ifaceMethod)
|
|
@@ -1697,6 +1710,9 @@ func (o *SemanticModelOwner) applyAnonymousInterfaceAsyncMethods(
|
|
|
1697
1710
|
}
|
|
1698
1711
|
for methodName, ifaceMethod := range graphEntry.ifaceMethods {
|
|
1699
1712
|
implMethod := graphEntry.implMethods[methodName]
|
|
1713
|
+
if isSyncErrorMethodFunc(ifaceMethod) || isSyncErrorMethodFunc(implMethod) {
|
|
1714
|
+
continue
|
|
1715
|
+
}
|
|
1700
1716
|
if model.functionAsync(implMethod) {
|
|
1701
1717
|
model.markInterfaceMethodAsync(ifaceMethod)
|
|
1702
1718
|
}
|
|
@@ -604,6 +604,44 @@ func TestSemanticModelMarksFunctionIdentifierCallAsync(t *testing.T) {
|
|
|
604
604
|
}
|
|
605
605
|
}
|
|
606
606
|
|
|
607
|
+
func TestSemanticModelMarksInterfaceMethodCallAsync(t *testing.T) {
|
|
608
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
609
|
+
"go.mod": "module example.test/interfacecall\n\ngo 1.25.3\n",
|
|
610
|
+
"iface/controller.go": strings.Join([]string{
|
|
611
|
+
"package iface",
|
|
612
|
+
"import \"context\"",
|
|
613
|
+
"type Controller interface {",
|
|
614
|
+
" Execute(context.Context) error",
|
|
615
|
+
"}",
|
|
616
|
+
"",
|
|
617
|
+
}, "\n"),
|
|
618
|
+
"controller.go": strings.Join([]string{
|
|
619
|
+
"package interfacecall",
|
|
620
|
+
"import (",
|
|
621
|
+
" \"context\"",
|
|
622
|
+
" \"example.test/interfacecall/iface\"",
|
|
623
|
+
")",
|
|
624
|
+
"func Run(ctx context.Context, c iface.Controller) error {",
|
|
625
|
+
" return c.Execute(ctx)",
|
|
626
|
+
"}",
|
|
627
|
+
"",
|
|
628
|
+
}, "\n"),
|
|
629
|
+
})
|
|
630
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
631
|
+
Patterns: []string{".", "./iface"},
|
|
632
|
+
Dir: moduleDir,
|
|
633
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
634
|
+
DependencyMode: DependencyModeAll,
|
|
635
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
636
|
+
})
|
|
637
|
+
model := buildSemanticModel(t, graph)
|
|
638
|
+
run := requireDefinedFunc(t, graph, "example.test/interfacecall", "Run")
|
|
639
|
+
semFn := model.functions[run]
|
|
640
|
+
if semFn == nil || !semFn.async {
|
|
641
|
+
t.Fatalf("expected Run to be async after calling interface method, got %#v", semFn)
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
607
645
|
func buildSemanticModel(t *testing.T, graph *PackageGraph) *SemanticModel {
|
|
608
646
|
t.Helper()
|
|
609
647
|
|