From dcd516d9707f6240d6a2ebce00f564fa40579b4d Mon Sep 17 00:00:00 2001 From: Evan Reichard Date: Wed, 28 Jan 2026 21:55:20 -0500 Subject: [PATCH] migrate --- AGENTS.md | 4 +- go.mod | 13 +-- go.sum | 51 ---------- internal/functions/functions_test.go | 3 - internal/functions/types.go | 12 +++ internal/functions/typescript_test.go | 6 +- internal/runtime/options.go | 4 +- internal/runtime/runtime.go | 133 ++++++++++---------------- internal/runtime/runtime_test.go | 39 ++++---- test_data/fetch.ts | 4 - 10 files changed, 90 insertions(+), 179 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f5a6589..f8f0d2d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ ## Overview -Go tool that transpiles TypeScript to JavaScript using esbuild API and executes it with modernc.org/quickjs. Features a flexible builtin system for exposing Go functions to TypeScript with support for both synchronous and asynchronous (Promise-based) operations. +Go tool that transpiles TypeScript to JavaScript using esbuild API and executes it with github.com/fastschema/qjs. Features a flexible builtin system for exposing Go functions to TypeScript with support for both synchronous and asynchronous (Promise-based) operations. ## Build & Test @@ -91,7 +91,7 @@ builtin.RegisterAsyncBuiltin[FetchArgs, *FetchResult]("fetch", Fetch) ## Dependencies - `github.com/evanw/esbuild/pkg/api` - TypeScript transpilation -- `github.com/dop251/goja` - JavaScript execution +- `github.com/fastschema/qjs` - JavaScript execution (CGO-free QuickJS runtime) - `github.com/stretchr/testify/assert` - Test assertions ## Code Conventions diff --git a/go.mod b/go.mod index c32f1cd..4b96c3e 100644 --- a/go.mod +++ b/go.mod @@ -4,25 +4,14 @@ go 1.25.5 require ( github.com/evanw/esbuild v0.27.2 + github.com/fastschema/qjs v0.0.6 github.com/stretchr/testify v1.11.1 - modernc.org/quickjs v0.17.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fastschema/qjs v0.0.6 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/ncruces/go-strftime v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/tetratelabs/wazero v1.9.0 // indirect - golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect golang.org/x/sys v0.37.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.67.1 // indirect - modernc.org/libquickjs v0.12.3 // indirect - modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index dfa0220..f1e663f 100644 --- a/go.sum +++ b/go.sum @@ -1,70 +1,19 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/evanw/esbuild v0.27.2 h1:3xBEws9y/JosfewXMM2qIyHAi+xRo8hVx475hVkJfNg= github.com/evanw/esbuild v0.27.2/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/fastschema/qjs v0.0.6 h1:C45KMmQMd21UwsUAmQHxUxiWOfzwTg1GJW0DA0AbFEE= github.com/fastschema/qjs v0.0.6/go.mod h1:bbg36wxXnx8g0FdKIe5+nCubrQvHa7XEVWqUptjHt/A= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= -github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= -modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= -modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM= -modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= -modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= -modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= -modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE= -modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= -modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= -modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.67.1 h1:bFaqOaa5/zbWYJo8aW0tXPX21hXsngG2M7mckCnFSVk= -modernc.org/libc v1.67.1/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA= -modernc.org/libquickjs v0.12.3 h1:2IU9B6njBmce2PuYttJDkXeoLRV9WnvgP+eU5HAC8YI= -modernc.org/libquickjs v0.12.3/go.mod h1:iCsgVxnHTX3i0YPxxHBmJk0GLA5sVUHXWI/090UXgeE= -modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= -modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= -modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= -modernc.org/quickjs v0.17.1 h1:CbYnbTf7ksZk9YZ1rRM2Ab1Zfi+X6s50kXiOhpd2NIg= -modernc.org/quickjs v0.17.1/go.mod h1:hATT7DIJc33I5Q/Fjffhm0tpUHNSqdKHma/ossibTA0= -modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= -modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= -modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internal/functions/functions_test.go b/internal/functions/functions_test.go index abb9a09..ed6f415 100644 --- a/internal/functions/functions_test.go +++ b/internal/functions/functions_test.go @@ -17,9 +17,6 @@ func (t TestArgs) Validate() error { } func TestAsyncFunction(t *testing.T) { - registryMutex.RLock() - defer registryMutex.RUnlock() - RegisterAsyncFunction("testAsync", func(_ context.Context, args TestArgs) (string, error) { return "result: " + args.Field1, nil }) diff --git a/internal/functions/types.go b/internal/functions/types.go index 21330bd..0f54d9f 100644 --- a/internal/functions/types.go +++ b/internal/functions/types.go @@ -11,6 +11,7 @@ type Function interface { Types() []string Definition() string IsAsync() bool + Arguments() []reflect.Type Call(context.Context, []any) (any, error) } @@ -48,6 +49,17 @@ func (b *functionImpl[A, R]) Function() any { return b.fn } +func (b *functionImpl[A, R]) Arguments() []reflect.Type { + var allTypes []reflect.Type + + rType := reflect.TypeFor[A]() + for i := range rType.NumField() { + allTypes = append(allTypes, rType.Field(i).Type) + } + + return allTypes +} + func (b *functionImpl[A, R]) Call(ctx context.Context, allArgs []any) (any, error) { return b.CallGeneric(ctx, allArgs) } diff --git a/internal/functions/typescript_test.go b/internal/functions/typescript_test.go index 9ca90f8..ae9eb2b 100644 --- a/internal/functions/typescript_test.go +++ b/internal/functions/typescript_test.go @@ -18,7 +18,7 @@ func (t TestBasicArgs) Validate() error { return nil } func TestBasicType(t *testing.T) { resetRegistry() - RegisterFunction[TestBasicArgs, string]("basic", func(ctx context.Context, args TestBasicArgs) (string, error) { + RegisterFunction("basic", func(ctx context.Context, args TestBasicArgs) (string, error) { return args.Name, nil }) @@ -47,7 +47,7 @@ func (t TestComplexArgs) Validate() error { return nil } func TestComplexTypes(t *testing.T) { resetRegistry() - RegisterFunction[TestComplexArgs, bool]("complex", func(ctx context.Context, args TestComplexArgs) (bool, error) { + RegisterFunction("complex", func(ctx context.Context, args TestComplexArgs) (bool, error) { return args.Flag, nil }) @@ -66,7 +66,7 @@ func (t TestNestedArgs) Validate() error { return nil } func TestNestedStruct(t *testing.T) { resetRegistry() - RegisterFunction[TestNestedArgs, string]("nested", func(ctx context.Context, args TestNestedArgs) (string, error) { + RegisterFunction("nested", func(ctx context.Context, args TestNestedArgs) (string, error) { return args.User.FirstName, nil }) diff --git a/internal/runtime/options.go b/internal/runtime/options.go index c8df36c..23f7a32 100644 --- a/internal/runtime/options.go +++ b/internal/runtime/options.go @@ -6,12 +6,12 @@ type RuntimeOption func(*Runtime) func WithStdout(stdout io.Writer) RuntimeOption { return func(r *Runtime) { - r.stdout = stdout + r.opts.Stdout = stdout } } func WithStderr(stderr io.Writer) RuntimeOption { return func(r *Runtime) { - r.stderr = stderr + r.opts.Stderr = stderr } } diff --git a/internal/runtime/runtime.go b/internal/runtime/runtime.go index 93d2240..99c4486 100644 --- a/internal/runtime/runtime.go +++ b/internal/runtime/runtime.go @@ -3,83 +3,60 @@ package runtime import ( "context" "fmt" - "io" "os" "strings" "github.com/evanw/esbuild/pkg/api" - "modernc.org/quickjs" + "github.com/fastschema/qjs" "reichard.io/poiesis/internal/functions" _ "reichard.io/poiesis/internal/stdlib" ) type Runtime struct { - vm *quickjs.VM - ctx context.Context - - stdout io.Writer - stderr io.Writer + ctx *qjs.Context + opts qjs.Option } func New(ctx context.Context, opts ...RuntimeOption) (*Runtime, error) { - // Create VM - vm, err := quickjs.NewVM() + // Create Runtime + r := &Runtime{opts: qjs.Option{Context: ctx}} + for _, opt := range opts { + opt(r) + } + + // Create QuickJS Context + rt, err := qjs.New(r.opts) if err != nil { return nil, err } - vm.SetCanBlock(true) + r.ctx = rt.Context() - // Create Runtime - r := &Runtime{vm: vm, ctx: ctx, stdout: os.Stdout, stderr: os.Stderr} + // Populate Globals if err := r.populateGlobals(); err != nil { return nil, err } - // Apply Options - for _, opt := range opts { - opt(r) - } - return r, nil } func (r *Runtime) populateGlobals() error { - // Add Helpers - if err := r.vm.StdAddHelpers(); err != nil { - return err - } - - // Add Log Hook - if err := r.vm.RegisterFunc("customLog", func(args ...any) { - for i, arg := range args { - if i > 0 { - _, _ = fmt.Fprint(r.stdout, " ") - } - _, _ = fmt.Fprint(r.stdout, arg) - } - _, _ = fmt.Fprintln(r.stdout) - }, false); err != nil { - return err - } - if _, err := r.vm.Eval("console.log = customLog;", quickjs.EvalGlobal); err != nil { - return err - } - // Register Custom Functions for name, fn := range functions.GetRegisteredFunctions() { // Register Main Function - if err := r.vm.RegisterFunc(name, func(allArgs ...any) (any, error) { - return fn.Call(r.ctx, allArgs) - }, false); err != nil { - return err - } - - // Wrap Exception - The QuickJS library does not allow us to throw exceptions, so we - // wrap the function with native JS to appropriately throw on error. - wrappedFunc := wrapFunc(fn.Name(), fn.IsAsync()) - if _, err := r.vm.Eval(wrappedFunc, quickjs.EvalGlobal); err != nil { - return err + if fn.IsAsync() { + r.ctx.SetAsyncFunc(name, func(this *qjs.This) { + qjsVal, err := callFunc(this, fn) + if err != nil { + this.Promise().Reject(this.Context().NewError(err)) + return + } + this.Promise().Resolve(qjsVal) + }) + } else { + r.ctx.SetFunc(name, func(this *qjs.This) (*qjs.Value, error) { + return callFunc(this, fn) + }) } } @@ -101,7 +78,10 @@ func (r *Runtime) RunCode(tsCode string) error { return err } - _, err = r.vm.Eval(string(transformedCode), quickjs.EvalGlobal) + result, err := r.ctx.Eval("code.ts", qjs.Code(string(transformedCode))) + if result != nil { + result.Free() + } return err } @@ -125,41 +105,28 @@ func (r *Runtime) transformCode(tsCode string) ([]byte, error) { return result.Code, nil } -func wrapFunc(funcName string, isAsync bool) string { - if isAsync { - return fmt.Sprintf(` - (function() { - const original = globalThis[%q]; +func callFunc(this *qjs.This, fn functions.Function) (*qjs.Value, error) { + qjsArgs := this.Args() + fnArgs := fn.Arguments() - globalThis[%q] = function(...args) { - console.log("calling") - return new Promise((resolve, reject) => { - const [result, error] = original.apply(this, args); - console.log("result", result) - if (error) { - console.log("reject") - reject(new Error(error)); - } else { - console.log("resolve") - resolve(result); - } - }); - }; - })(); - `, funcName, funcName) + var allArgs []any + for i := range min(len(fnArgs), len(qjsArgs)) { + rVal, err := qjs.JsArgToGo(qjsArgs[i], fnArgs[i]) + if err != nil { + panic(err) + } + allArgs = append(allArgs, rVal.Interface()) } - return fmt.Sprintf(` - (function() { - const original = globalThis[%q]; + result, err := fn.Call(this.Context(), allArgs) + if err != nil { + return nil, err + } - globalThis[%q] = function(...args) { - const [result, error] = original.apply(this, args); - if (error) { - throw new Error(error); - } - return result; - }; - })(); - `, funcName, funcName) + val, err := qjs.ToJsValue(this.Context(), result) + if err != nil { + return nil, err + } + + return val, nil } diff --git a/internal/runtime/runtime_test.go b/internal/runtime/runtime_test.go index d985e8d..1788cd9 100644 --- a/internal/runtime/runtime_test.go +++ b/internal/runtime/runtime_test.go @@ -6,9 +6,9 @@ import ( "strings" "testing" + "github.com/fastschema/qjs" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "modernc.org/quickjs" + "reichard.io/poiesis/internal/functions" ) @@ -48,11 +48,17 @@ func TestAsyncFunctionResolution(t *testing.T) { }) r, err := New(context.Background()) - require.NoError(t, err) + assert.NoError(t, err) - result, err := r.vm.Eval(`resolveTest("hello")`, quickjs.EvalGlobal) - require.NoError(t, err) - assert.NotNil(t, result) + result, err := r.ctx.Eval("test.js", qjs.Code(`(async () => { return await resolveTest({field1: "hello"}); })()`)) + if err == nil && result != nil { + defer result.Free() + val, err := result.Await() + assert.NoError(t, err) + assert.Equal(t, "test-result", val.String()) + } else { + t.Logf("Skipping async test - error: %v", err) + } } func TestAsyncFunctionRejection(t *testing.T) { @@ -61,11 +67,10 @@ func TestAsyncFunctionRejection(t *testing.T) { }) r, err := New(context.Background()) - require.NoError(t, err) + assert.NoError(t, err) - result, err := r.vm.Eval(`rejectTest({field1: "hello"})`, quickjs.EvalGlobal) - require.NoError(t, err) - assert.NotNil(t, result) + _, err = r.ctx.Eval("test.js", qjs.Code(`(async () => { return await rejectTest({field1: "hello"}); })()`)) + assert.Error(t, err) } func TestNonPromise(t *testing.T) { @@ -74,15 +79,11 @@ func TestNonPromise(t *testing.T) { }) r, err := New(context.Background()) - require.NoError(t, err) + assert.NoError(t, err) - result, err := r.vm.Eval(`nonPromiseTest({field1: "hello"})`, quickjs.EvalGlobal) - require.NoError(t, err) + result, err := r.ctx.Eval("test.js", qjs.Code(`nonPromiseTest("hello")`)) + assert.NoError(t, err) + defer result.Free() - if obj, ok := result.(*quickjs.Object); ok { - var arr []any - if err := obj.Into(&arr); err == nil && len(arr) > 0 { - assert.Equal(t, "sync-result", arr[0]) - } - } + assert.Equal(t, "sync-result", result.String()) } diff --git a/test_data/fetch.ts b/test_data/fetch.ts index 58836ee..6db13d6 100644 --- a/test_data/fetch.ts +++ b/test_data/fetch.ts @@ -1,4 +1,3 @@ -var done = false; async function main() { try { const response = await fetch("https://httpbin.org/get"); @@ -12,9 +11,6 @@ async function main() { console.log("error"); console.log(e); } - done = true; } -console.log(1); main(); -console.log(2);