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.
Files changed (136) hide show
  1. package/compiler/gotest/testdata/browserapi/browserapi_test.go +36 -0
  2. package/compiler/lowering.go +223 -9
  3. package/compiler/override-registry_test.go +50 -0
  4. package/compiler/protobuf-ts-binding.go +154 -6
  5. package/compiler/protobuf-ts-binding_test.go +7 -2
  6. package/compiler/runtime-contract.go +2 -0
  7. package/compiler/runtime-contract_test.go +1 -0
  8. package/compiler/semantic-model.go +16 -0
  9. package/compiler/semantic-model_test.go +38 -0
  10. package/compiler/skeleton_test.go +473 -15
  11. package/compiler/typescript-emitter.go +4 -0
  12. package/dist/gs/builtin/builtin.js +7 -9
  13. package/dist/gs/builtin/builtin.js.map +1 -1
  14. package/dist/gs/builtin/defer.js +2 -2
  15. package/dist/gs/builtin/hostio.js +5 -5
  16. package/dist/gs/builtin/hostio.js.map +1 -1
  17. package/dist/gs/builtin/map.js +2 -1
  18. package/dist/gs/builtin/map.js.map +1 -1
  19. package/dist/gs/builtin/slice.d.ts +3 -0
  20. package/dist/gs/builtin/slice.js +39 -0
  21. package/dist/gs/builtin/slice.js.map +1 -1
  22. package/dist/gs/builtin/type.js +49 -0
  23. package/dist/gs/builtin/type.js.map +1 -1
  24. package/dist/gs/compress/zlib/index.js +5 -2
  25. package/dist/gs/compress/zlib/index.js.map +1 -1
  26. package/dist/gs/crypto/ecdh/index.js +27 -8
  27. package/dist/gs/crypto/ecdh/index.js.map +1 -1
  28. package/dist/gs/crypto/ed25519/index.js +3 -3
  29. package/dist/gs/crypto/ed25519/index.js.map +1 -1
  30. package/dist/gs/crypto/rand/index.js +6 -3
  31. package/dist/gs/crypto/rand/index.js.map +1 -1
  32. package/dist/gs/embed/index.js +9 -3
  33. package/dist/gs/embed/index.js.map +1 -1
  34. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -0
  35. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +33 -0
  36. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  37. package/dist/gs/github.com/mr-tron/base58/base58/index.js +4 -1
  38. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -1
  39. package/dist/gs/golang.org/x/crypto/scrypt/index.d.ts +2 -0
  40. package/dist/gs/golang.org/x/crypto/scrypt/index.js +39 -0
  41. package/dist/gs/golang.org/x/crypto/scrypt/index.js.map +1 -0
  42. package/dist/gs/hash/fnv/index.js +13 -5
  43. package/dist/gs/hash/fnv/index.js.map +1 -1
  44. package/dist/gs/io/fs/glob.d.ts +3 -3
  45. package/dist/gs/io/fs/glob.js +8 -8
  46. package/dist/gs/io/fs/glob.js.map +1 -1
  47. package/dist/gs/io/fs/readdir.d.ts +2 -2
  48. package/dist/gs/io/fs/readdir.js +13 -74
  49. package/dist/gs/io/fs/readdir.js.map +1 -1
  50. package/dist/gs/io/fs/sub.js +4 -4
  51. package/dist/gs/io/fs/sub.js.map +1 -1
  52. package/dist/gs/io/fs/walk.js +1 -1
  53. package/dist/gs/io/fs/walk.js.map +1 -1
  54. package/dist/gs/maps/iter.js.map +1 -1
  55. package/dist/gs/maps/maps.js.map +1 -1
  56. package/dist/gs/mime/index.js +5 -2
  57. package/dist/gs/mime/index.js.map +1 -1
  58. package/dist/gs/net/http/httptest/index.js +6 -3
  59. package/dist/gs/net/http/httptest/index.js.map +1 -1
  60. package/dist/gs/net/http/index.d.ts +16 -4
  61. package/dist/gs/net/http/index.js +236 -40
  62. package/dist/gs/net/http/index.js.map +1 -1
  63. package/dist/gs/net/http/pprof/index.js.map +1 -1
  64. package/dist/gs/reflect/iter.js +1 -1
  65. package/dist/gs/reflect/iter.js.map +1 -1
  66. package/dist/gs/reflect/type.d.ts +2 -0
  67. package/dist/gs/reflect/type.js +53 -21
  68. package/dist/gs/reflect/type.js.map +1 -1
  69. package/dist/gs/runtime/pprof/index.js.map +1 -1
  70. package/dist/gs/runtime/runtime.js +2 -2
  71. package/dist/gs/runtime/runtime.js.map +1 -1
  72. package/dist/gs/runtime/trace/index.js.map +1 -1
  73. package/dist/gs/slices/slices.d.ts +1 -1
  74. package/dist/gs/slices/slices.js +37 -4
  75. package/dist/gs/slices/slices.js.map +1 -1
  76. package/gs/builtin/builtin.ts +11 -14
  77. package/gs/builtin/defer.ts +2 -2
  78. package/gs/builtin/hostio.ts +5 -5
  79. package/gs/builtin/map.ts +4 -1
  80. package/gs/builtin/slice.test.ts +14 -0
  81. package/gs/builtin/slice.ts +64 -0
  82. package/gs/builtin/type.ts +72 -0
  83. package/gs/bytes/bytes.test.ts +14 -13
  84. package/gs/compress/zlib/index.test.ts +19 -5
  85. package/gs/compress/zlib/index.ts +16 -7
  86. package/gs/context/context.test.ts +3 -1
  87. package/gs/crypto/ecdh/index.test.ts +6 -2
  88. package/gs/crypto/ecdh/index.ts +49 -12
  89. package/gs/crypto/ed25519/index.ts +20 -7
  90. package/gs/crypto/rand/index.ts +6 -3
  91. package/gs/embed/index.test.ts +3 -3
  92. package/gs/embed/index.ts +9 -3
  93. package/gs/fmt/fmt.test.ts +29 -4
  94. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +126 -0
  95. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +46 -0
  96. package/gs/github.com/mr-tron/base58/base58/index.ts +9 -3
  97. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +2 -8
  98. package/gs/golang.org/x/crypto/scrypt/index.test.ts +81 -0
  99. package/gs/golang.org/x/crypto/scrypt/index.ts +54 -0
  100. package/gs/golang.org/x/crypto/scrypt/meta.json +5 -0
  101. package/gs/hash/fnv/index.test.ts +1 -8
  102. package/gs/hash/fnv/index.ts +27 -10
  103. package/gs/io/fs/glob.ts +13 -10
  104. package/gs/io/fs/meta.json +2 -0
  105. package/gs/io/fs/readdir.test.ts +63 -2
  106. package/gs/io/fs/readdir.ts +33 -30
  107. package/gs/io/fs/sub.ts +4 -4
  108. package/gs/io/fs/walk.ts +1 -1
  109. package/gs/maps/iter.ts +9 -9
  110. package/gs/maps/maps.ts +4 -4
  111. package/gs/math/bits/index.test.ts +10 -1
  112. package/gs/mime/index.test.ts +33 -15
  113. package/gs/mime/index.ts +9 -2
  114. package/gs/net/http/httptest/index.test.ts +17 -3
  115. package/gs/net/http/httptest/index.ts +8 -3
  116. package/gs/net/http/index.test.ts +645 -123
  117. package/gs/net/http/index.ts +548 -113
  118. package/gs/net/http/pprof/index.ts +24 -6
  119. package/gs/os/file_unix_js.test.ts +22 -0
  120. package/gs/reflect/iter.ts +4 -2
  121. package/gs/reflect/map.test.ts +56 -1
  122. package/gs/reflect/type.ts +76 -37
  123. package/gs/runtime/pprof/index.test.ts +7 -1
  124. package/gs/runtime/pprof/index.ts +5 -1
  125. package/gs/runtime/runtime.test.ts +7 -0
  126. package/gs/runtime/runtime.ts +2 -4
  127. package/gs/runtime/trace/index.test.ts +9 -1
  128. package/gs/runtime/trace/index.ts +5 -1
  129. package/gs/slices/meta.json +3 -0
  130. package/gs/slices/slices.test.ts +59 -21
  131. package/gs/slices/slices.ts +61 -20
  132. package/gs/strconv/complex.test.ts +17 -3
  133. package/gs/sync/atomic/doc_64.test.ts +2 -9
  134. package/gs/sync/sync.test.ts +18 -8
  135. package/gs/syscall/js/index.test.ts +9 -4
  136. 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