goscript 0.1.3 → 0.1.4

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 (117) hide show
  1. package/cmd/goscript/cmd_compile.go +28 -8
  2. package/cmd/goscript/cmd_compile_test.go +105 -6
  3. package/compiler/build-flags.go +9 -10
  4. package/compiler/gotest/runner_test.go +127 -0
  5. package/compiler/lowering.go +596 -136
  6. package/compiler/lowering_bench_test.go +350 -0
  7. package/compiler/package-graph.go +61 -4
  8. package/compiler/package-graph_test.go +30 -0
  9. package/compiler/semantic-model-types.go +8 -0
  10. package/compiler/semantic-model.go +447 -22
  11. package/compiler/semantic-model_test.go +138 -0
  12. package/compiler/skeleton_test.go +948 -14
  13. package/compiler/typescript-emitter.go +19 -2
  14. package/dist/gs/builtin/builtin.d.ts +2 -2
  15. package/dist/gs/builtin/builtin.js +20 -0
  16. package/dist/gs/builtin/builtin.js.map +1 -1
  17. package/dist/gs/builtin/slice.js +5 -0
  18. package/dist/gs/builtin/slice.js.map +1 -1
  19. package/dist/gs/builtin/type.d.ts +1 -1
  20. package/dist/gs/builtin/type.js +72 -5
  21. package/dist/gs/builtin/type.js.map +1 -1
  22. package/dist/gs/compress/zlib/index.d.ts +3 -3
  23. package/dist/gs/compress/zlib/index.js +88 -26
  24. package/dist/gs/compress/zlib/index.js.map +1 -1
  25. package/dist/gs/crypto/sha1/index.js +2 -5
  26. package/dist/gs/crypto/sha1/index.js.map +1 -1
  27. package/dist/gs/crypto/sha256/index.js +2 -5
  28. package/dist/gs/crypto/sha256/index.js.map +1 -1
  29. package/dist/gs/crypto/sha512/index.js +2 -5
  30. package/dist/gs/crypto/sha512/index.js.map +1 -1
  31. package/dist/gs/embed/index.d.ts +6 -0
  32. package/dist/gs/embed/index.js +210 -5
  33. package/dist/gs/embed/index.js.map +1 -1
  34. package/dist/gs/fmt/fmt.d.ts +3 -3
  35. package/dist/gs/fmt/fmt.js +29 -16
  36. package/dist/gs/fmt/fmt.js.map +1 -1
  37. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +118 -6
  38. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  39. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  40. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  41. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  42. package/dist/gs/io/fs/readdir.js +5 -3
  43. package/dist/gs/io/fs/readdir.js.map +1 -1
  44. package/dist/gs/io/io.d.ts +10 -6
  45. package/dist/gs/io/io.js +87 -42
  46. package/dist/gs/io/io.js.map +1 -1
  47. package/dist/gs/math/bits/index.d.ts +26 -5
  48. package/dist/gs/math/bits/index.js +13 -24
  49. package/dist/gs/math/bits/index.js.map +1 -1
  50. package/dist/gs/net/http/index.d.ts +3 -1
  51. package/dist/gs/net/http/index.js +18 -1
  52. package/dist/gs/net/http/index.js.map +1 -1
  53. package/dist/gs/os/types_js.gs.d.ts +6 -2
  54. package/dist/gs/os/types_js.gs.js +169 -8
  55. package/dist/gs/os/types_js.gs.js.map +1 -1
  56. package/dist/gs/reflect/type.d.ts +1 -0
  57. package/dist/gs/reflect/type.js +80 -51
  58. package/dist/gs/reflect/type.js.map +1 -1
  59. package/dist/gs/strings/reader.d.ts +1 -1
  60. package/dist/gs/strings/reader.js +2 -2
  61. package/dist/gs/strings/reader.js.map +1 -1
  62. package/dist/gs/sync/sync.d.ts +2 -1
  63. package/dist/gs/sync/sync.js +37 -16
  64. package/dist/gs/sync/sync.js.map +1 -1
  65. package/dist/gs/syscall/js/index.js +9 -0
  66. package/dist/gs/syscall/js/index.js.map +1 -1
  67. package/dist/gs/testing/testing.js +8 -6
  68. package/dist/gs/testing/testing.js.map +1 -1
  69. package/gs/builtin/builtin.ts +25 -2
  70. package/gs/builtin/runtime-contract.test.ts +45 -0
  71. package/gs/builtin/slice.ts +7 -0
  72. package/gs/builtin/type.ts +85 -5
  73. package/gs/compress/zlib/index.test.ts +97 -0
  74. package/gs/compress/zlib/index.ts +117 -27
  75. package/gs/compress/zlib/meta.json +4 -1
  76. package/gs/crypto/sha1/index.test.ts +19 -2
  77. package/gs/crypto/sha1/index.ts +3 -6
  78. package/gs/crypto/sha256/index.test.ts +14 -2
  79. package/gs/crypto/sha256/index.ts +3 -6
  80. package/gs/crypto/sha512/index.test.ts +17 -2
  81. package/gs/crypto/sha512/index.ts +3 -6
  82. package/gs/embed/index.test.ts +87 -0
  83. package/gs/embed/index.ts +229 -5
  84. package/gs/fmt/fmt.test.ts +41 -3
  85. package/gs/fmt/fmt.ts +40 -17
  86. package/gs/fmt/meta.json +6 -1
  87. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +8 -1
  88. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +139 -11
  89. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  90. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  91. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  92. package/gs/io/fs/readdir.test.ts +38 -0
  93. package/gs/io/fs/readdir.ts +7 -3
  94. package/gs/io/io.test.ts +77 -6
  95. package/gs/io/io.ts +114 -52
  96. package/gs/io/meta.json +7 -1
  97. package/gs/math/bits/index.ts +52 -28
  98. package/gs/net/http/index.test.ts +16 -0
  99. package/gs/net/http/index.ts +19 -2
  100. package/gs/os/file_unix_js.test.ts +52 -0
  101. package/gs/os/meta.json +4 -0
  102. package/gs/os/readdir.test.ts +56 -0
  103. package/gs/os/types_js.gs.ts +169 -8
  104. package/gs/reflect/deepequal.test.ts +10 -1
  105. package/gs/reflect/type.ts +91 -56
  106. package/gs/reflect/typefor.test.ts +31 -1
  107. package/gs/strings/meta.json +5 -2
  108. package/gs/strings/reader.test.ts +2 -2
  109. package/gs/strings/reader.ts +2 -2
  110. package/gs/sync/meta.json +1 -0
  111. package/gs/sync/sync.test.ts +41 -1
  112. package/gs/sync/sync.ts +41 -16
  113. package/gs/syscall/js/index.test.ts +18 -0
  114. package/gs/syscall/js/index.ts +12 -0
  115. package/gs/testing/testing.test.ts +32 -3
  116. package/gs/testing/testing.ts +13 -10
  117. package/package.json +1 -1
@@ -314,6 +314,144 @@ func TestSemanticModelPropagatesCascadedAsyncInterfaceMethods(t *testing.T) {
314
314
  }
315
315
  }
316
316
 
317
+ func TestSemanticModelPropagatesAsyncToOverrideInterfaceMethods(t *testing.T) {
318
+ moduleDir := writePackageGraphFixture(t, map[string]string{
319
+ "go.mod": "module example.test/overrideiface\n\ngo 1.25.3\n",
320
+ "main.go": strings.Join([]string{
321
+ "package overrideiface",
322
+ "import (",
323
+ " \"io\"",
324
+ " \"sync\"",
325
+ ")",
326
+ "type asyncWriter struct { mu sync.Mutex }",
327
+ "func (w *asyncWriter) Write(p []byte) (int, error) {",
328
+ " w.mu.Lock()",
329
+ " defer w.mu.Unlock()",
330
+ " return len(p), nil",
331
+ "}",
332
+ "func Use(w io.Writer) {",
333
+ " _, _ = w.Write(nil)",
334
+ "}",
335
+ "func main() { Use(&asyncWriter{}) }",
336
+ "",
337
+ }, "\n"),
338
+ })
339
+ graph := loadPackageGraph(t, &CompileRequest{
340
+ Patterns: []string{"."},
341
+ Dir: moduleDir,
342
+ OutputPath: filepath.Join(t.TempDir(), "out"),
343
+ DependencyMode: DependencyModeAll,
344
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
345
+ })
346
+ model := buildSemanticModel(t, graph)
347
+
348
+ for _, name := range []string{"Write", "Use", "main"} {
349
+ fn := requireDefinedFunc(t, graph, "example.test/overrideiface", name)
350
+ if !model.functions[fn].async {
351
+ t.Fatalf("expected %s to be async, got %#v", name, model.functions[fn])
352
+ }
353
+ }
354
+ found := false
355
+ for _, implementation := range model.interfaceImplementations {
356
+ if implementation.typ != nil && implementation.typ.Obj().Name() == "asyncWriter" &&
357
+ implementation.iface != nil && implementation.iface.Obj().Pkg().Path() == "io" &&
358
+ implementation.iface.Obj().Name() == "Writer" &&
359
+ implementation.pointer && implementation.asyncMethods["Write"] {
360
+ found = true
361
+ break
362
+ }
363
+ }
364
+ if !found {
365
+ t.Fatalf("missing async *asyncWriter -> io.Writer implementation: %#v", model.interfaceImplementations)
366
+ }
367
+ }
368
+
369
+ func TestSemanticModelPropagatesAsyncToAnonymousInterfaceMethods(t *testing.T) {
370
+ moduleDir := writePackageGraphFixture(t, map[string]string{
371
+ "go.mod": "module example.test/anonymousiface\n\ngo 1.25.3\n",
372
+ "main.go": strings.Join([]string{
373
+ "package anonymousiface",
374
+ "import \"context\"",
375
+ "type Snapshot int",
376
+ "type Watcher struct { ch chan Snapshot }",
377
+ "func (w *Watcher) WaitValueChange(ctx context.Context, old Snapshot, errCh <-chan error) (Snapshot, error) {",
378
+ " select {",
379
+ " case v := <-w.ch:",
380
+ " return v, nil",
381
+ " case err := <-errCh:",
382
+ " return old, err",
383
+ " case <-ctx.Done():",
384
+ " return old, ctx.Err()",
385
+ " }",
386
+ "}",
387
+ "func Use(ctx context.Context, w interface {",
388
+ " WaitValueChange(context.Context, Snapshot, <-chan error) (Snapshot, error)",
389
+ "}, old Snapshot) (Snapshot, error) {",
390
+ " return w.WaitValueChange(ctx, old, nil)",
391
+ "}",
392
+ "",
393
+ }, "\n"),
394
+ })
395
+ graph := loadPackageGraph(t, &CompileRequest{
396
+ Patterns: []string{"."},
397
+ Dir: moduleDir,
398
+ OutputPath: filepath.Join(t.TempDir(), "out"),
399
+ DependencyMode: DependencyModeAll,
400
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
401
+ })
402
+ model := buildSemanticModel(t, graph)
403
+
404
+ fn := requireDefinedFunc(t, graph, "example.test/anonymousiface", "Use")
405
+ if !model.functions[fn].async {
406
+ t.Fatalf("expected Use to be async, got %#v", model.functions[fn])
407
+ }
408
+ }
409
+
410
+ func TestSemanticModelPropagatesAsyncThroughInstantiatedNamedInterface(t *testing.T) {
411
+ moduleDir := writePackageGraphFixture(t, map[string]string{
412
+ "go.mod": "module example.test/instantiatediface\n\ngo 1.25.3\n",
413
+ "main.go": strings.Join([]string{
414
+ "package instantiatediface",
415
+ "import \"context\"",
416
+ "type Snapshot int",
417
+ "type Watchable[T any] interface {",
418
+ " WaitValueChange(context.Context, T, <-chan error) (T, error)",
419
+ "}",
420
+ "type Container[T any] struct { ch chan T }",
421
+ "func (c *Container[T]) WaitValueChange(ctx context.Context, old T, errCh <-chan error) (T, error) {",
422
+ " select {",
423
+ " case v := <-c.ch:",
424
+ " return v, nil",
425
+ " case err := <-errCh:",
426
+ " return old, err",
427
+ " case <-ctx.Done():",
428
+ " return old, ctx.Err()",
429
+ " }",
430
+ "}",
431
+ "func Bind(w Watchable[Snapshot]) {}",
432
+ "func Use(ctx context.Context, w interface {",
433
+ " WaitValueChange(context.Context, Snapshot, <-chan error) (Snapshot, error)",
434
+ "}, old Snapshot) (Snapshot, error) {",
435
+ " return w.WaitValueChange(ctx, old, nil)",
436
+ "}",
437
+ "",
438
+ }, "\n"),
439
+ })
440
+ graph := loadPackageGraph(t, &CompileRequest{
441
+ Patterns: []string{"."},
442
+ Dir: moduleDir,
443
+ OutputPath: filepath.Join(t.TempDir(), "out"),
444
+ DependencyMode: DependencyModeAll,
445
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
446
+ })
447
+ model := buildSemanticModel(t, graph)
448
+
449
+ fn := requireDefinedFunc(t, graph, "example.test/instantiatediface", "Use")
450
+ if !model.functions[fn].async {
451
+ t.Fatalf("expected Use to be async, got %#v", model.functions[fn])
452
+ }
453
+ }
454
+
317
455
  func TestSemanticModelIndexesFunctionsByFullName(t *testing.T) {
318
456
  model := newSemanticModel()
319
457
  semPkg := &semanticPackage{}