ramune

package module
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 30, 2026 License: MIT Imports: 59 Imported by: 0

README

Ramune

Ramune

A JavaScript/TypeScript runtime and embeddable JS engine for Go. Dual backend: JavaScriptCore (JIT, macOS/Linux) via purego and QuickJS (pure Go, cross-platform incl. Windows) via modernc.org/quickjs — no Cgo required for either. Type checker and formatter (typescript-go), linter (rslint), bundler (esbuild), and all Node.js polyfills are built in with zero external tool dependencies.

Named after Ramune, a Japanese carbonated soft drink served in a Codd-neck bottle.

ramune run server.ts          # Run TypeScript
ramune test                   # Run tests
ramune check app.ts           # Type-check
ramune fmt .                  # Format
ramune lint .                 # Lint
ramune compile app.ts -o app  # Compile to standalone binary
ramune transpile main.ts -o out  # Transpile TS to Go source
ramune typegen go:fmt go:net/http -o go.d.ts  # Generate .d.ts for Go packages
ramune skills install         # Install Agent Skills for AI agents

What is Ramune?

Ramune is two things:

  1. A JS/TS runtime like Bun or Deno, but built in Go
  2. An embeddable JS engine for Go applications

Two backends, same API:

JSC (default) QuickJS (-tags quickjs)
Engine Apple JavaScriptCore via purego modernc.org/quickjs (pure Go)
JIT Yes No
Platforms macOS, Linux macOS, Linux, Windows, FreeBSD
System deps macOS: none. Linux: libjavascriptcoregtk None
Best for Performance, HTTP servers Embedding, scripting, portability

Both are pure Go builds — no C compiler, no Cgo, just go build.

Install

macOS

JavaScriptCore is built into macOS — no extra dependencies.

go install github.com/i2y/ramune/cmd/ramune@latest
ramune setup-jit   # enable JIT (~10x faster, recommended)
Linux
sudo apt install libjavascriptcoregtk-4.1-dev   # JSC runtime (required)
go install github.com/i2y/ramune/cmd/ramune@latest

Multi-runtime (RuntimePool, worker_threads) works out of the box on x86_64. On arm64, gcc is required for cgo signal forwarding (apt install gcc).

Windows / Zero-dependency (QuickJS backend)
go install -tags quickjs github.com/i2y/ramune/cmd/ramune@latest

The QuickJS backend uses modernc.org/quickjs (pure Go, ES2023). No shared libraries needed — works on Windows, macOS, Linux, and FreeBSD. Trade-off: no JIT, so CPU-bound code is slower (see Performance).

Smaller binary
go install -tags nosqlite -ldflags="-s -w" github.com/i2y/ramune/cmd/ramune@latest

-tags nosqlite excludes bun:sqlite. -ldflags="-s -w" strips debug info. Combine with -tags quickjs,nosqlite for the smallest possible binary.

Quick Start

Run JavaScript/TypeScript
ramune run app.ts
ramune run -p lodash -p dayjs app.ts   # with npm packages
ramune run                              # reads package.json
ramune run -w server.ts                 # watch mode
ramune run --workers 4 server.ts        # multi-worker HTTP server
ramune run --env-file .env.prod app.ts  # load env file
ramune run dev                          # run package.json script
Evaluate Expressions
ramune eval "1 + 2"
ramune eval "require('crypto').randomUUID()"
ramune eval "const x: number = 42; x"   # TypeScript works
REPL
ramune repl

Packages from package.json are automatically available:

ramune add lodash
ramune repl
> lodash.chunk([1,2,3,4,5,6], 2)
[[1,2],[3,4],[5,6]]

Features: history, tab completion, TypeScript, colors, multiline.

Test Runner
ramune test

Finds *.test.ts, *.spec.js, etc. Jest/Bun-compatible API:

describe("math", () => {
  test("addition", () => {
    expect(1 + 2).toBe(3);
  });
});

Mocking is supported via jest.fn() and jest.spyOn():

test("mock", () => {
  const fn = jest.fn().mockReturnValue(42);
  expect(fn()).toBe(42);
  expect(fn).toHaveBeenCalledTimes(1);
});
Compile to Standalone Binary
ramune compile server.ts -o myserver --http --minify
./myserver    # self-contained binary with embedded JS

The compiled binary embeds the bundled JS via go:embed. On macOS, it is automatically codesigned with the JIT entitlement.

Options: --http (Ramune.serve event loop), --minify (esbuild minification). Output binary is ~21MB (linter/formatter/checker are not included — only the runtime).

Note: The compiled binary loads JavaScriptCore dynamically at runtime. The target machine must have JSC available (macOS: built-in, Linux: libjavascriptcoregtk). Use -tags quickjs for cross-platform builds.

Native Extension Modules

Compile performance-critical TypeScript functions to native Go code and call them from JavaScript at full compiled speed:

ramune compile app.js --native math.ts -o myapp

The --native flag transpiles TypeScript to Go, making exported functions available via require('native:modulename'):

// math.ts — transpiled to Go
export function fibonacci(n: number): number {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}
// app.js — runs in JS, calls native Go code
const { fibonacci } = require('native:math');
console.log(fibonacci(35)); // runs as compiled Go, not interpreted JS

Multiple native files and inter-file imports are supported:

ramune compile app.js --native math.ts --native geometry.ts -o myapp

Native functions support rich type interop — structs, typed arrays, and class-like instances with live properties:

// counter.ts
export class Counter {
  count: number = 0;
  name: string;
  constructor(name: string) { this.name = name; }
  increment(): number { return ++this.count; }
}
export function newCounter(name: string): Counter {
  return new Counter(name);
}
const { newCounter } = require('native:counter');
const c = newCounter("hits");
c.increment();
c.increment();
console.log(c.count); // 2 — live property, reads Go struct field
c.count = 100;        // setter, writes Go struct field
c.increment();
console.log(c.count); // 101
Transpile TypeScript to Go (Experimental)

Note: The TypeScript-to-Go transpiler is experimental and under active development. Generated code may require manual adjustments for complex codebases.

Transpile TypeScript source code directly to Go:

ramune transpile main.ts -o out/                     # single file
ramune transpile main.ts utils.ts -o out/ --module myapp  # multi-file project
ramune transpile main.ts --compile -o myapp           # transpile + build binary

The transpiler converts TypeScript types, classes, interfaces, generics, async/await, and more to idiomatic Go. See TypeScript-to-Go Transpiler for supported features and limitations.

Type Checking
ramune check app.ts              # check files
ramune check src/                # check directory
ramune run --check app.ts        # check then run

Uses typescript-go (TypeScript 7.0-dev, backward-compatible with TS 5.x) built into Ramune — no external tools required.

Format & Lint
ramune fmt .                     # format all JS/TS files
ramune fmt --check .             # check formatting (CI)
ramune lint .                    # lint all JS/TS files
ramune lint --fix .              # lint with auto-fix

The formatter uses typescript-go's built-in formatter. The linter uses rslint (Go-based, 20-40x faster than ESLint). Both are built into Ramune — no external tools required.

If rslint.json or rslint.jsonc exists, ramune lint uses that configuration. Otherwise, all recommended rules are enabled by default.

Note: TypeScript transpilation (ramune run app.ts) uses esbuild which is also built into Ramune.

Package Manager
ramune init                      # create package.json
ramune add lodash dayjs          # add dependencies
ramune remove lodash             # remove
ramune install                   # install all
Build (esbuild)
ramune build app.ts --outdir=dist --bundle --minify
Permissions (Sandbox)
ramune run app.ts                              # default: all allowed
ramune run --sandbox app.ts                    # deny all
ramune run --sandbox --allow-read=/tmp app.ts  # selective access

Flags: --allow-read, --allow-write, --allow-net, --allow-env, --allow-run.

Environment Variables

.env and .env.local files are automatically loaded (like Bun/Deno). Use --env-file to specify a custom file:

ramune run --env-file .env.production app.ts
Package.json Scripts

Run scripts defined in package.json:

ramune run dev     # runs "scripts.dev" from package.json
ramune run build   # runs "scripts.build"

Embed in Go

Ramune is also a Go library. Embed JavaScript in your Go application and expose any Go library to JS — database drivers, image processing, gRPC clients, ML inference, etc.

package main

import (
    "fmt"
    "log"

    "github.com/i2y/ramune"
)

func main() {
    rt, err := ramune.New()
    if err != nil {
        log.Fatal(err)
    }
    defer rt.Close()

    val, _ := rt.Eval("1 + 2")
    defer val.Close()
    fmt.Println(val.Float64()) // 3
}
Call Go from JavaScript
rt.RegisterFunc("greet", func(args []any) (any, error) {
    return fmt.Sprintf("Hello, %s!", args[0]), nil
})

val, _ := rt.Eval(`greet("World")`) // "Hello, World!"

Go functions registered via RegisterFunc can safely access Value methods (Attr, Call, SetAttr, etc.) — no deadlock. For typed callbacks, use Register with generics:

ramune.Register(rt, "add", func(a, b float64) float64 {
    return a + b
})
Receive JS Functions in Go

JS functions passed to Go callbacks are wrapped as *JSFunc, callable from Go:

rt.RegisterFunc("forEach", func(args []any) (any, error) {
    items := args[0].([]any)
    fn := args[1].(*ramune.JSFunc)
    defer fn.Close()
    for _, item := range items {
        fn.Call(item)
    }
    return nil, nil
})
forEach(["a", "b", "c"], function(item) { console.log(item); });
// → a, b, c
Struct Binding

Expose Go structs to JavaScript:

type User struct {
    Name string `js:"name"`
    Age  int    `js:"age"`
}
func (u *User) Greet() string { return "Hello, " + u.Name }

rt.Bind("user", &User{Name: "Alice", Age: 30})
// JS: user.name → "Alice", user.greet() → "Hello, Alice"
Plugin System

Register custom modules available via require():

rt, _ := ramune.New(ramune.NodeCompat(), ramune.WithModule(ramune.Module{
    Name: "mydb",
    Exports: map[string]ramune.GoFunc{
        "query": func(args []any) (any, error) {
            return db.Query(args[0].(string))
        },
    },
}))
// JS: const db = require('mydb'); db.query("SELECT 1")
Native Module (Go Library API)

NativeModuleFromFuncs creates a require()-able module from typed Go functions — no manual argument parsing needed:

mod := ramune.NativeModuleFromFuncs("native:math", map[string]any{
    "add":       func(a, b float64) float64 { return a + b },
    "isPrime":   func(n float64) bool { /* ... */ },
    "fibonacci": mymath.Fibonacci,  // any typed Go function
})

rt, _ := ramune.New(ramune.NodeCompat(), ramune.WithModule(mod))
rt.Eval(`require('native:math').add(3, 4)`) // 7

Supports struct parameters, struct returns with live properties, typed slices, error handling, and panic recovery:

type Point struct {
    X float64 `json:"x"`
    Y float64 `json:"y"`
}

mod := ramune.NativeModuleFromFuncs("native:geo", map[string]any{
    "distance": func(a, b Point) float64 {
        dx, dy := a.X-b.X, a.Y-b.Y
        return math.Sqrt(dx*dx + dy*dy)
    },
})
// JS: require('native:geo').distance({x:0, y:0}, {x:3, y:4}) → 5

When a function returns a struct pointer, the JS object has live getter/setter properties and callable methods — mutations in JS are reflected in Go and vice versa.

Use npm Packages
rt, _ := ramune.New(
    ramune.NodeCompat(),
    ramune.Dependencies("lodash@4"),
)
val, _ := rt.Eval(`lodash.chunk([1,2,3,4,5,6], 2)`)
Async / Promises
val, _ := rt.EvalAsync(`
    new Promise(resolve => setTimeout(() => resolve(42), 100))
`)
HTTP Server
rt, _ := ramune.New(ramune.NodeCompat())

rt.Exec(`
    Ramune.serve({
        port: 3000,
        fetch(req) {
            return new Response("Hello!");
        }
    })
`)
rt.RunEventLoop()

Works with Hono and other frameworks. Async handlers with setTimeout/await are supported:

app.get('/slow', async (c) => {
    await new Promise(r => setTimeout(r, 100));
    return c.json({ ok: true });
});
Multi-core Parallelism

Unlike Bun/Node (single-threaded), Ramune runs multiple JSC VMs in parallel on separate OS threads:

pool, _ := ramune.NewPool(4, ramune.NodeCompat())
defer pool.Close()

pool.Eval("computeHeavy()")                     // round-robin dispatch
pool.Broadcast("globalThis.config = {debug: true}")  // run on all

// Multi-worker HTTP server
pool.ListenAndServe(":3000", `
    globalThis.__poolHandle = function(req) {
        return { status: 200, body: "Hello from worker!" };
    };
`)

With CPU-heavy handlers, 3 workers achieve 2.7x throughput vs single-threaded Bun.

Worker threads are also supported:

const { Worker } = require('worker_threads');
const w = new Worker('./worker.js', { workerData: { n: 42 } });
w.on('message', msg => console.log(msg));
Ramune APIs & Bun Compatibility

Ramune provides its own API namespace. Bun.* is available as an alias for backward compatibility with existing Bun code, though compatibility is partial and will be improved over time.

API Status
Ramune.serve({port, fetch, websocket}) Supported (Go net/http backend, 101K req/s)
Ramune.file(path) Supported (text, json, exists, size)
Ramune.write(path, data) Supported
Ramune.password.hash/verify Supported (bcrypt)
Ramune.sleep(ms) Supported
Ramune.plugin({setup}) Supported (onLoad filters, virtual modules)
Request / Response Polyfilled with ReadableStream body
bun:sqlite Supported (pure Go, modernc.org/sqlite)
Bun.* Alias for Ramune.* (partial Bun compatibility)
GC Configuration

Go's garbage collector can interfere with JavaScriptCore under high load. Ramune provides tunable GC settings:

rt, _ := ramune.New(ramune.NodeCompat(), ramune.WithGC(ramune.GCConfig{
    DisableAutoGC: true,   // disable Go's auto GC during HTTP serving
    GCInterval:    2000,   // manual GC every N requests
    GCPercent:     100,    // Go GC target %
}))

For most use cases (CLI, scripting, SDK), defaults work fine. Tuning is only needed for high-throughput HTTP servers.

Permissions (Library API)
rt, _ := ramune.New(
    ramune.NodeCompat(),
    ramune.WithPermissions(&ramune.Permissions{
        Read:      ramune.PermGranted,
        ReadPaths: []string{"/tmp", "/var/data"},
        Write:     ramune.PermDenied,
        Net:       ramune.PermDenied,
    }),
)

Performance

JSC backend (default)

Benchmarks on Apple M4 Max (macOS, JIT enabled):

Test Ramune Bun Node.js
Hello World startup 14.2ms 7.1ms 18.0ms
Fibonacci(35) 46.2ms 40.0ms 64.7ms
JSON 10K objects 17.6ms 9.7ms 22.9ms
Crypto SHA256 x1000 19.8ms 11.0ms 20.4ms
File I/O x100 20.7ms 13.3ms 24.2ms
HTTP req/s (single) 101K 156K 112K
QuickJS backend (-tags quickjs)

Same machine, no JIT:

Test Ramune (QuickJS) Ramune (JSC) Bun Node.js
Hello World startup 19.0ms 14.2ms 6.4ms 17.1ms
Fibonacci(35) 3,089ms 46.2ms 39.3ms 63.5ms
JSON 10K objects 65.1ms 17.6ms 9.0ms 22.0ms
Crypto SHA256 x1000 26.8ms 19.8ms 10.3ms 19.5ms
File I/O x100 25.8ms 20.7ms 12.4ms 22.7ms
HTTP req/s (single) 66K 101K 165K 111K

QuickJS has no JIT compiler, so CPU-bound code (Fibonacci, JSON) is significantly slower. I/O-bound workloads (crypto, file, HTTP) are closer because the heavy lifting happens in Go. The QuickJS backend is best suited for embedding, scripting, Windows support, and environments where zero external dependencies matter more than raw JS execution speed.

Multi-Runtime Pool

Ramune runs multiple JS VMs in parallel on separate OS threads (Bun/Node are single-threaded):

Workers req/s Scaling
1 44K 1.0x
2 65K 1.48x
3 68K 1.56x

Measured with a JSON generate/filter/map handler (200 objects per request).

vs Go JS Runtimes
Test Ramune (JSC+JIT) Ramune (QuickJS) goja otto
Fibonacci(35) 31ms 3,122ms 1,989ms 26,413ms
JSON 10K objects 0.9ms 30ms 11ms 27ms

JSC with JIT is the fastest by a wide margin. QuickJS (pure Go interpreter) is comparable to goja for JSON workloads and slower for CPU-heavy code. otto is the slowest across all tests.

Run make bench to reproduce.

JIT Setup

On macOS, JIT requires a code signing entitlement:

# After go install:
ramune setup-jit

# Or when building from source:
make build-cli

Linux does not need JIT setup.

Node.js Compatibility

Module Coverage Module Coverage
path 100% zlib 75% (gzip, deflate, brotli)
fs 90% (async + sync + watch) os 85%
child_process 80% events 85%
crypto 85% (+ crypto.subtle) url 80%
stream 70% Buffer 60%
http/https 70% assert 80%
net/tls 60% dns basic
worker_threads 70% readline 70%
vm 70% querystring 80%
timers/promises 70% perf_hooks basic
util 80% (types, promisify, format) process 85% (signals, exit, env)

Web Platform APIs

API Status
fetch Supported (Go net/http backend)
ReadableStream / WritableStream / TransformStream Supported (pipeTo, pipeThrough, tee, async iterator)
crypto.subtle Supported (digest, sign/verify, encrypt/decrypt, importKey/exportKey, deriveBits/deriveKey)
crypto.getRandomValues / randomUUID Supported
Blob / File Supported
FormData Supported
Headers / Request / Response Supported (ReadableStream body)
TextEncoder / TextDecoder Supported (UTF-8)
AbortController / AbortSignal Supported
URL / URLSearchParams Supported
WebSocket Supported (server-side via Ramune.serve)
performance.now / mark / measure Supported
structuredClone Supported (circular refs, Map, Set, Date, RegExp, TypedArray)
setTimeout / setInterval Supported
navigator Supported (userAgent, platform, hardwareConcurrency)
console.time / table / trace Supported

Ramune also supports package.json "exports" field resolution (conditional exports with require/import/default and subpath exports).

TypeScript-to-Go Transpiler (Experimental)

Warning: This feature is experimental and under active development. While many TypeScript patterns are supported, complex real-world codebases (e.g., frameworks with advanced generics, method overloads, or nullable string patterns) may produce code that requires manual fixes. Contributions and bug reports are welcome.

Ramune includes a built-in TypeScript-to-Go transpiler. It converts TypeScript source code to idiomatic Go, supporting a wide range of TypeScript features.

Supported TypeScript Features
Category Features
Types numberfloat64, string, boolean, void, null/undefinednil, any, unknownany
Collections T[][]T, Map<K,V>map[K]V, Set<T>map[T]struct{}
Nullable T | null, T | undefined*T (pointer)
Generics Functions and classes with type parameters and constraints
Enums String enums → Go const block, numeric enums → iota
Discriminated unions type Shape = Circle | Square with narrowing via if (s.kind === "circle")
Union of literals "a" | "b" | "c"string
Promises Promise<T>*promise.Promise[T], async/await supported
Classes Fields, constructors, methods, inheritance (extends), static fields/methods, abstract classes, getter/setter accessors
Interfaces Converted to Go struct types
Destructuring Object {a, b} and array [x, y] patterns, default values ({a = 1})
Spread [...arr, elem], {...obj, key: val}
Template literals `Hello ${name}`fmt.Sprintf
Operators typeof, instanceof, in, delete, ?. (optional chaining), ?? (nullish coalescing), ** (exponentiation), >>>, &&=, ||=, ??=
Array methods map, filter, reduce, find, forEach, includes, some, every, push, pop, slice, splice, concat, join, etc.
String methods split, includes, startsWith, endsWith, trim, replace, replaceAll, repeat, padStart, padEnd, etc.
Loops for, for...of, for...in, for await...of, while, do...while, labeled break/continue
Error handling try/catch/finally
Modules Relative imports, Node.js built-in modules, npm packages (uuid, lodash, zod), Go packages via go: prefix, export default, re-exports (export { x } from './mod')
Go interop go: prefix imports any Go package, multi-return destructuring (const [resp, err] = http.Get(url)), auto go.mod for third-party modules
Type resolution Conditional types, mapped types (Record<K,V>map[K]V), intersection types, utility types via checker
Type Mapping
TypeScript Go
number float64
string string
boolean bool
T[] []T
T | null *T
Map<K, V> map[K]V
Set<T> map[T]struct{}
Promise<T> *promise.Promise[T]
any / unknown any
Enum Named type with const block
Class Struct with methods
Interface Struct type
Native Extension Module Workflow

The --native flag in ramune compile transpiles TypeScript to Go and exposes exported functions as require()-able JavaScript modules:

TypeScript → Go transpiler → Go source → NativeModuleFromFuncs → require('native:name')

Supported native function signatures:

  • Primitive parameters and returns: number, string, boolean
  • Struct parameters: JS objects auto-converted to Go structs via field name matching
  • Struct returns: Go structs returned as JS objects with live getter/setter properties
  • Typed slice parameters: number[][]float64, etc.
  • Typed slice/map returns: []int → JS array, map[string]int → JS object, nested supported
  • Error returns: (T, error) — errors become JS exceptions
  • Pointer returns: *Struct — returned with methods and mutable fields
  • Panics caught and converted to JS exceptions

Not supported as native exports:

  • Generic functions (must be wrapped in a non-generic function)
  • Functions with channel parameters
  • Functions with interface{} parameters other than any
Go Package Imports (go: prefix)

Import any Go standard library or third-party package directly in TypeScript:

import { Println, Sprintf } from "go:fmt"
import * as http from "go:net/http"
import { Default } from "go:github.com/gin-gonic/gin"

const [resp, err] = http.Get("http://example.com")  // Go multi-return
Println(Sprintf("status: %d", resp.StatusCode))

Generate TypeScript type definitions for Go packages to enable type checking:

ramune typegen go:fmt go:net/http -o go.d.ts

This generates declare module "go:fmt" { ... } with full function signatures, interfaces, and type mappings.

Transpiler Limitations
  • No decorators — complex metaprogramming, not yet supported
  • No generators / yield — Go has no generator concept; use channels or callbacks instead
  • No dynamic import() — use require() (which is supported)
  • No Symbol or Proxy — no Go equivalent
  • Generic function exports — cannot be exposed as native module exports; wrap in a non-generic function
  • Numeric precision — all numbers are float64 (no BigInt-like arbitrary precision)
  • any-typed property access — uses jsrt.GetField() runtime reflection (struct fields and map keys)

Known Limitations

  • N-API / Native addons: Not supported. Packages that require .node native binaries (e.g., bcrypt, sharp, better-sqlite3) will not work. Use pure JS alternatives instead.
  • HTTP self-fetch: Ramune.serve() handlers cannot fetch their own server (same JS context deadlock).
  • Windows: JSC backend not available. Use -tags quickjs for Windows support.
  • Linux multi-runtime (JSC): Architecture-dependent signal handling. On arm64, CGO_ENABLED=1 and gcc are required for multi-runtime (cgo's signal forwarding is needed for JSC's GC). On x86_64, multi-runtime works without cgo (CGO_ENABLED=0).
  • Multi-worker limit (JSC): 2-3 workers recommended for sustained high-throughput; 4+ may trigger JSC JIT contention.
  • QuickJS backend: No JIT — CPU-bound JS is ~67x slower than JSC. Error stack traces not available. Best for embedding/scripting, not compute-heavy workloads.
  • Native module instance lifecycle: Struct instances returned to JS are not automatically freed when the JS object is garbage collected. Instances are cleaned up when Runtime.Close() is called. For long-running servers creating many short-lived struct instances, this may cause increased memory usage.

Requirements

JSC backend (default) QuickJS backend (-tags quickjs)
Go 1.26+ 1.26+
Platforms macOS, Linux macOS, Linux, Windows, FreeBSD
System deps macOS: none. Linux: apt install libjavascriptcoregtk-4.1-dev None

All tools are built in — no external dependencies needed for check, fmt, lint, or TypeScript transpilation. npm packages are fetched directly from the npm registry — no npm or bun CLI required.

Agent Skills

Ramune ships with an Agent Skill that teaches AI agents (Claude Code, GitHub Copilot, etc.) how to use Ramune:

ramune skills install   # install to ~/.agents/skills/ and .claude/skills/

Development

make ci          # fmt + build + vet + test
make build-cli   # build with JIT entitlement (macOS)
make bench       # benchmark vs Bun/Node
make sync        # sync typescript-go & rslint from submodules

License

MIT

Third-Party Licenses

Ramune includes code from the following projects:

Project License Usage Inclusion
microsoft/typescript-go Apache-2.0 Type checker, formatter (TS 7.0-dev) Source copy (internal/tsgo/)
web-infra-dev/rslint MIT Linter Source copy (internal/rslint/)
evanw/esbuild MIT TypeScript transpilation, bundling Go module dependency

License texts for source-copied projects are in internal/tsgo/LICENSE and internal/rslint/LICENSE.

The Ramune logo includes the Go Gopher, originally designed by Renée French, licensed under Creative Commons Attribution 4.0.

Documentation

Overview

Package ramune provides Go bindings for JavaScriptCore via purego — no Cgo required. The JSC runtime is dynamically loaded at startup and works with the system framework on macOS and libjavascriptcoregtk on Linux.

Basic Usage

Evaluate JavaScript and read results:

rt, err := ramune.New()
if err != nil {
    log.Fatal(err)
}
defer rt.Close()

val, err := rt.Eval("1 + 2")
if err != nil {
    log.Fatal(err)
}
defer val.Close()
fmt.Println(val.Float64()) // 3

Constructing Objects

Create JS objects and arrays directly from Go:

obj, _ := rt.NewObject(map[string]any{"name": "Alice", "age": 30})
arr, _ := rt.NewArray(1, "two", true)
obj.SetAttr("tags", arr)

Go Callbacks

Register Go functions callable from JavaScript:

rt.RegisterFunc("add", func(args []any) (any, error) {
    return args[0].(float64) + args[1].(float64), nil
})
val, _ := rt.Eval("add(3, 4)") // 7

npm Packages

Use npm packages via automatic esbuild bundling:

rt, _ := ramune.New(
    ramune.NodeCompat(),
    ramune.Dependencies("lodash@4"),
)
val, _ := rt.Eval(`lodash.chunk([1,2,3,4,5,6], 2)`)

Event Loop and Async

setTimeout, setInterval, and Promises work with the built-in event loop:

val, _ := rt.EvalAsync(`
    new Promise(resolve => setTimeout(() => resolve(42), 100))
`)
fmt.Println(val.Float64()) // 42

Fetch

HTTP requests via globalThis.fetch backed by Go's net/http:

rt, _ := ramune.New(ramune.WithFetch())
val, _ := rt.EvalAsync(`
    fetch("https://api.example.com/data").then(r => r.json())
`)

Index

Constants

This section is empty.

Variables

View Source
var ErrAlreadyClosed = errors.New("ramune: runtime already closed")

ErrAlreadyClosed is returned when operations are attempted on a closed Runtime.

View Source
var ErrJSCNotFound = errors.New("ramune: shared library not found")

ErrJSCNotFound is returned when no suitable JavaScriptCore shared library can be located on the system.

View Source
var ErrNilValue = errors.New("ramune: operation on nil Value")

ErrNilValue is returned when an operation is attempted on a nil Value.

Functions

func ClearCache

func ClearCache() error

ClearCache removes all cached JS bundles created by Dependencies().

func Register

func Register[F any](rt *Runtime, name string, fn F) error

Register registers a typed Go function as a global JavaScript function. Unlike RegisterFunc, which requires manual args[]any casting, Register uses reflection to automatically convert JS arguments to the function's parameter types and convert return values back.

Supported parameter types: float64, float32, int, int8/16/32/64, uint, uint8/16/32/64, string, bool, map[string]any, []any.

Supported return signatures:

  • func(...) → no return value
  • func(...) T → single return value (non-error)
  • func(...) error → single error return
  • func(...) (T, error) → value + error

Example:

ramune.Register(rt, "add", func(a, b float64) float64 {
    return a + b
})

Types

type CallbackContext

type CallbackContext struct {
	// contains filtered or unexported fields
}

CallbackContext provides safe access to the JS engine from within a GoFunc. Value methods like Attr() and Call() dispatch to the engine goroutine, which deadlocks inside a callback (already on the engine goroutine). CallbackContext calls engine functions directly and returns Go values.

func (*CallbackContext) Eval

func (cc *CallbackContext) Eval(code string) (any, error)

Eval evaluates JS code and returns the result as any (Go value).

func (*CallbackContext) EvalBool

func (cc *CallbackContext) EvalBool(code string) (bool, error)

EvalBool evaluates JS code and returns the result as bool.

func (*CallbackContext) EvalFloat64

func (cc *CallbackContext) EvalFloat64(code string) (float64, error)

EvalFloat64 evaluates JS code and returns the result as float64.

func (*CallbackContext) EvalString

func (cc *CallbackContext) EvalString(code string) (string, error)

EvalString evaluates JS code and returns the result as string.

func (*CallbackContext) Exec

func (cc *CallbackContext) Exec(code string) error

Exec executes JavaScript code, discarding the result.

func (*CallbackContext) GetProperty

func (cc *CallbackContext) GetProperty(name string) (any, error)

GetProperty reads a property from the global object.

func (*CallbackContext) SetProperty

func (cc *CallbackContext) SetProperty(name string, value any) error

SetProperty sets a property on the global object.

type GCConfig

type GCConfig struct {
	// DisableAutoGC disables Go's automatic GC while the HTTP server is
	// running. Manual GC is triggered every GCInterval requests.
	// Default: true (for HTTP server stability).
	DisableAutoGC bool

	// GCInterval is the number of HTTP requests between manual GC cycles.
	// Lower values use more CPU but prevent memory growth.
	// Default: 5000. Set to 0 to disable manual GC.
	GCInterval int

	// GCPercent sets the Go GC target percentage (same as GOGC env var).
	// Only used when DisableAutoGC is false.
	// Default: 100 (Go's default). Set to -1 to disable GC entirely.
	GCPercent int
}

GCConfig configures garbage collection behavior for a Runtime.

func DefaultGCConfig

func DefaultGCConfig() GCConfig

DefaultGCConfig returns the default GC configuration.

type GoFunc

type GoFunc func(args []any) (any, error)

GoFunc is a Go function that can be called from JavaScript. Arguments are converted to Go types: bool, float64, string, nil, map[string]any (for objects), []any (for arrays), or *JSFunc (for functions).

type GoFuncWithContext

type GoFuncWithContext func(ctx *CallbackContext, args []any) (any, error)

GoFuncWithContext is a callback that receives a CallbackContext for safe engine access. Use RegisterFuncWithContext to register these.

type JSError

type JSError struct {
	Context string
	Message string
	Stack   string // JavaScript stack trace, if available
}

JSError represents an error that originated in the JavaScript runtime.

func (*JSError) Error

func (e *JSError) Error() string

type JSFunc added in v0.4.0

type JSFunc struct {
	// contains filtered or unexported fields
}

JSFunc wraps a JavaScript function reference, allowing it to be called from Go. Created automatically when a JS function is passed as an argument to a GoFunc callback. Call Close() when done to release the JS reference.

func (*JSFunc) Call added in v0.4.0

func (f *JSFunc) Call(args ...any) (any, error)

Call invokes the JavaScript function with the given arguments. Returns the result converted to a Go value (bool, float64, string, nil, map[string]any, or []any). Safe to call from any goroutine and from within GoFunc callbacks.

func (*JSFunc) Close added in v0.4.0

func (f *JSFunc) Close() error

Close releases the JavaScript function reference. Safe to call multiple times or on nil.

type LibraryNotFoundError

type LibraryNotFoundError struct {
	Searched []string
}

LibraryNotFoundError provides detailed information about which paths were searched when JavaScriptCore could not be found.

func (*LibraryNotFoundError) Error

func (e *LibraryNotFoundError) Error() string

func (*LibraryNotFoundError) Unwrap

func (e *LibraryNotFoundError) Unwrap() error

type Module

type Module struct {
	// Name is the module name used with require('name').
	Name string

	// Exports maps JS property names to Go functions.
	// Each function becomes a property on the module object.
	Exports map[string]GoFunc

	// Init is called after exports are registered, allowing
	// additional setup such as evaluating JS code.
	// The Runtime's JSC lock is held — use execLocked/evalLocked only.
	Init func(rt *Runtime) error
}

Module defines a custom module that can be loaded via require() in JS.

func NativeModuleFromFuncs added in v0.4.0

func NativeModuleFromFuncs(name string, funcs map[string]any) Module

NativeModuleFromFuncs creates a Module from a map of typed Go functions. Each function is automatically wrapped with reflection-based argument conversion, similar to Register[F]. This is used to expose transpiled Go code as a JS module.

Example:

mod := ramune.NativeModuleFromFuncs("native:math", map[string]any{
    "fibonacci": mymath.Fibonacci,  // func(float64) float64
    "isPrime":   mymath.IsPrime,    // func(float64) bool
})
rt, _ := ramune.New(ramune.WithModule(mod))
rt.Eval(`require('native:math').fibonacci(10)`) // 55

type Option

type Option func(*config)

Option configures a Runtime.

func Dependencies

func Dependencies(pkgs ...string) Option

Dependencies declares npm package dependencies that are automatically installed, bundled with esbuild, and evaluated in the JSC context. Packages are specified as "name" or "name@version" (e.g., "lodash@4"). The bundle is cached in ~/.cache/ramune/jsbundles/<hash>/. Packages are fetched directly from the npm registry — no npm or bun required.

func NodeCompat

func NodeCompat() Option

NodeCompat installs a minimal Node.js compatibility layer into the JSC context. This enables npm packages that depend on Node.js built-ins to run in JSC with Go providing the native functionality.

Supported polyfills:

  • require() — returns polyfilled modules
  • process.env, process.cwd(), process.platform, process.arch
  • child_process.spawnSync / execSync (synchronous only)
  • fs.readFileSync, fs.existsSync, fs.writeFileSync, fs.mkdirSync
  • path.join, path.resolve, path.dirname, path.basename, path.sep
  • Buffer.from (basic)
  • console.log, console.error, console.warn
  • setTimeout (immediate execution, no real delay)

func WithFetch

func WithFetch() Option

WithFetch installs a globalThis.fetch polyfill backed by Go's net/http. This is also automatically enabled when NodeCompat() is used.

func WithGC

func WithGC(gc GCConfig) Option

WithGC configures garbage collection behavior. See GCConfig for details on each setting.

func WithLibraryPath

func WithLibraryPath(path string) Option

WithLibraryPath sets an explicit path to the JavaScriptCore shared library. Ignored when using the QuickJS backend.

func WithModule

func WithModule(m Module) Option

WithModule returns an Option that registers a module during Runtime creation. The module is available via require('name') if NodeCompat is enabled.

func WithPermissions

func WithPermissions(p *Permissions) Option

WithPermissions sets the permission policy for the Runtime.

type PermissionState

type PermissionState int

PermissionState represents the state of a permission.

const (
	PermGranted PermissionState = iota
	PermDenied
)

type Permissions

type Permissions struct {
	Read  PermissionState
	Write PermissionState
	Net   PermissionState
	Env   PermissionState
	Run   PermissionState

	ReadPaths  []string // allowed read paths (empty = all if granted)
	WritePaths []string // allowed write paths
	NetHosts   []string // allowed network hosts
	EnvVars    []string // allowed env var names
	RunCmds    []string // allowed commands
}

Permissions controls access to system resources. Default is all granted (Bun-compatible). Use WithSandbox() to deny by default.

func AllPermissions

func AllPermissions() *Permissions

AllPermissions returns permissions with everything granted.

func SandboxPermissions

func SandboxPermissions() *Permissions

SandboxPermissions returns permissions with everything denied.

func (*Permissions) CheckEnv

func (p *Permissions) CheckEnv(name string) error

CheckEnv checks if accessing the given env var is allowed.

func (*Permissions) CheckNet

func (p *Permissions) CheckNet(host string) error

CheckNet checks if network access to the given host is allowed.

func (*Permissions) CheckRead

func (p *Permissions) CheckRead(path string) error

CheckRead checks if reading the given path is allowed.

func (*Permissions) CheckRun

func (p *Permissions) CheckRun(cmd string) error

CheckRun checks if running the given command is allowed.

func (*Permissions) CheckWrite

func (p *Permissions) CheckWrite(path string) error

CheckWrite checks if writing to the given path is allowed.

type Runtime

type Runtime struct {
	// contains filtered or unexported fields
}

Runtime holds a loaded JavaScriptCore library and a global JS context. Multiple Runtimes can coexist in the same process — each gets a dedicated OS thread for JSC access. All JSC operations are dispatched to this thread via a channel, ensuring thread identity across calls (required by JSC). The Runtime is safe for concurrent use from multiple goroutines.

func New

func New(opts ...Option) (*Runtime, error)

New creates a new JavaScriptCore runtime with a fresh global context. Each Runtime gets a dedicated OS thread for all JSC operations, ensuring thread identity across calls. Multiple Runtimes can coexist safely.

func (*Runtime) Bind

func (r *Runtime) Bind(name string, v any) error

Bind exposes a Go struct as a JavaScript object on globalThis. Exported struct fields become JS properties (read from current Go state), and methods on the pointer receiver become callable JS functions.

Field naming: if a field has a `js:"name"` tag, that name is used; otherwise the first letter is lowercased (e.g. Name → name).

Method naming: Go method names are converted to camelCase (e.g. Greet → greet, SetAge → setAge).

Fields are backed by the Go struct: reading a property in JS always returns the current Go value. Setting a property in JS updates the Go struct. Methods that mutate the struct are reflected on subsequent property reads.

func (*Runtime) Close

func (r *Runtime) Close() error

Close releases the JS global context and stops the dedicated JSC goroutine.

func (*Runtime) Engine added in v0.2.0

func (r *Runtime) Engine() string

GCConfig controls garbage collection behavior for JSC interoperability. Go's concurrent GC can corrupt JSC's internal structures under high load. These settings allow tuning the tradeoff between performance and stability. Engine returns the name of the JS engine backend.

func (*Runtime) Eval

func (r *Runtime) Eval(code string) (*Value, error)

Eval evaluates JavaScript code and returns the result.

func (*Runtime) EvalAsync

func (r *Runtime) EvalAsync(code string) (*Value, error)

EvalAsync evaluates JavaScript code that may return a Promise, runs the event loop until the Promise resolves, and returns the result.

func (*Runtime) EvalAsyncWithContext

func (r *Runtime) EvalAsyncWithContext(ctx context.Context, code string) (*Value, error)

EvalAsyncWithContext evaluates JavaScript code that may return a Promise, runs the event loop until the Promise resolves or the context is cancelled/expired, and returns the result.

func (*Runtime) EvalWithContext

func (r *Runtime) EvalWithContext(ctx context.Context, code string) (*Value, error)

EvalWithContext evaluates JavaScript code and returns the result, respecting the provided context for cancellation and deadlines. Since JSC cannot be interrupted mid-execution, the context is checked before evaluation begins. For timeout control over async operations, use EvalAsyncWithContext instead.

func (*Runtime) Exec

func (r *Runtime) Exec(code string) error

Exec executes JavaScript code, discarding the result.

func (*Runtime) GlobalObject

func (r *Runtime) GlobalObject() *Value

GlobalObject returns the global object for this context.

func (*Runtime) LoadModule

func (r *Runtime) LoadModule(m Module) error

LoadModule registers a module on an existing Runtime.

func (*Runtime) NativeInstanceCount added in v0.4.0

func (r *Runtime) NativeInstanceCount() int

NativeInstanceCount returns the number of live native struct instances. Useful for testing and debugging instance lifecycle.

func (*Runtime) NewArray

func (r *Runtime) NewArray(items ...any) (*Value, error)

NewArray creates a new JavaScript array with the given items.

func (*Runtime) NewObject

func (r *Runtime) NewObject(props map[string]any) (*Value, error)

NewObject creates a new JavaScript object with the given properties.

func (*Runtime) NewUint8Array

func (r *Runtime) NewUint8Array(data []byte) (*Value, error)

NewUint8Array creates a JavaScript Uint8Array containing a copy of the given bytes.

func (*Runtime) RegisterFunc

func (r *Runtime) RegisterFunc(name string, fn GoFunc) error

RegisterFunc registers a Go function as a global JavaScript function.

func (*Runtime) RegisterFuncWithContext

func (r *Runtime) RegisterFuncWithContext(name string, fn GoFuncWithContext) error

RegisterFuncWithContext registers a Go function that receives a CallbackContext, allowing safe JSC access from within the callback without deadlocking.

func (*Runtime) RunEventLoop

func (r *Runtime) RunEventLoop() error

RunEventLoop processes the event loop until all pending operations complete. For short-lived scripts (timers, promises), the default timeout is 30 seconds. If an HTTP server (Ramune.serve) is active, the loop runs indefinitely.

func (*Runtime) RunEventLoopFor

func (r *Runtime) RunEventLoopFor(timeout time.Duration) error

RunEventLoopFor processes the event loop until all timers complete or the timeout is reached.

func (*Runtime) RunEventLoopWithContext

func (r *Runtime) RunEventLoopWithContext(ctx context.Context) error

RunEventLoopWithContext processes the event loop until all timers complete or the context is cancelled/expired.

func (*Runtime) Tick

func (r *Runtime) Tick() (bool, error)

Tick processes one round of the event loop (immediates + ready timers). Returns true if there are still pending timers or immediates.

func (*Runtime) Wake

func (r *Runtime) Wake()

Wake signals the event loop to process events immediately. Safe to call from any goroutine. Non-blocking.

type RuntimePool

type RuntimePool struct {
	// contains filtered or unexported fields
}

RuntimePool manages multiple Runtimes for parallel JS execution. Each Runtime has its own dedicated OS thread and independent JSC VM.

func NewPool

func NewPool(n int, opts ...Option) (*RuntimePool, error)

NewPool creates a pool of n Runtimes, each configured with the given options.

func (*RuntimePool) Addr

func (p *RuntimePool) Addr() string

Addr returns the listener address, or "" if not listening.

func (*RuntimePool) Broadcast

func (p *RuntimePool) Broadcast(code string) error

Broadcast executes JavaScript code on all workers in parallel.

func (*RuntimePool) Close

func (p *RuntimePool) Close() error

Close stops the HTTP server (if running) and closes all Runtimes.

func (*RuntimePool) Eval

func (p *RuntimePool) Eval(code string) (*Value, error)

Eval evaluates JavaScript code on the next available worker.

func (*RuntimePool) Exec

func (p *RuntimePool) Exec(code string) error

Exec executes JavaScript code on the next available worker, discarding the result.

func (*RuntimePool) ListenAndServe

func (p *RuntimePool) ListenAndServe(addr string, jsHandler string) error

ListenAndServe starts an HTTP server that dispatches requests round-robin across pool workers via per-worker channels.

func (*RuntimePool) Size

func (p *RuntimePool) Size() int

Size returns the number of workers in the pool.

func (*RuntimePool) StopHTTP

func (p *RuntimePool) StopHTTP()

StopHTTP stops the HTTP server and drains in-flight requests.

type Value

type Value struct {
	// contains filtered or unexported fields
}

Value wraps a JavaScriptCore JSValueRef with lifecycle management. Call Close() to unprotect the value.

func (*Value) Attr

func (v *Value) Attr(name string) *Value

Attr returns a property by name from the JS object. Returns nil if this is not an object or the property doesn't exist.

func (*Value) AttrErr

func (v *Value) AttrErr(name string) (*Value, error)

AttrErr returns a property by name or an error.

func (*Value) Bool

func (v *Value) Bool() (bool, error)

Bool returns the value as a bool.

func (*Value) Bytes

func (v *Value) Bytes() ([]byte, error)

Bytes returns the contents of a TypedArray or ArrayBuffer as a Go byte slice.

func (*Value) Call

func (v *Value) Call(args ...any) (*Value, error)

Call calls this value as a function with the given arguments.

func (*Value) Close

func (v *Value) Close() error

Close queues the JSValueRef for unprotection at the next safe point. Uses the unprotectQueue to avoid deadlock when called from GoFunc callbacks (which already run on the dedicated JSC goroutine). Safe to call multiple times or on nil.

func (*Value) Delete

func (v *Value) Delete(name string) error

Delete removes a property from the JS object.

func (*Value) Float64

func (v *Value) Float64() (float64, error)

Float64 returns the value as a float64.

func (*Value) GoString

func (v *Value) GoString() (string, error)

GoString returns the JavaScript string value as a Go string.

func (*Value) Has

func (v *Value) Has(name string) bool

Has reports whether the JS object has the named property.

func (*Value) Index

func (v *Value) Index(i int) *Value

Index returns the value at the given array index.

func (*Value) Int64

func (v *Value) Int64() (int64, error)

Int64 returns the value as an int64 (truncated from float64, since JS has no integer type).

func (*Value) IsArray

func (v *Value) IsArray() bool

IsArray reports whether this value is a JavaScript array.

func (*Value) IsFunction

func (v *Value) IsFunction() bool

IsFunction reports whether this value is a JavaScript function.

func (*Value) IsNull

func (v *Value) IsNull() bool

IsNull reports whether this value is JavaScript null.

func (*Value) IsUndefined

func (v *Value) IsUndefined() bool

IsUndefined reports whether this value is JavaScript undefined.

func (*Value) Keys

func (v *Value) Keys() ([]string, error)

Keys returns all enumerable property names of the JS object.

func (*Value) Len

func (v *Value) Len() (int, error)

Len returns the "length" property as an integer. Works for arrays, strings, and any object with a length property.

func (*Value) Ptr

func (v *Value) Ptr() uintptr

Ptr returns the raw JSValueRef pointer.

func (*Value) SetAttr

func (v *Value) SetAttr(name string, val any) error

SetAttr sets a property on the JS object.

func (*Value) String

func (v *Value) String() string

String returns the JavaScript string representation.

func (*Value) ToMap

func (v *Value) ToMap() (map[string]any, error)

ToMap converts a JS object to a Go map via JSON serialization. Returns an error if the value is not a JSON-serializable object.

func (*Value) ToSlice

func (v *Value) ToSlice() ([]any, error)

ToSlice converts a JS array to a Go slice via JSON serialization.

Directories

Path Synopsis
bench
pool command
cmd
ramune command
Command ramune is a JavaScript runtime powered by JavaScriptCore via purego.
Command ramune is a JavaScript runtime powered by JavaScriptCore via purego.
internal
gotranspiler
Package gotranspiler implements TypeScript to Go source code transpilation.
Package gotranspiler implements TypeScript to Go source code transpilation.
tsgo/bundled
Package bundled provides access to files bundled with TypeScript.
Package bundled provides access to files bundled with TypeScript.
tsgo/compiler
Package compiler implements the TypeScript compiler.
Package compiler implements the TypeScript compiler.
tsgo/diagnostics
Package diagnostics contains generated localizable diagnostic messages.
Package diagnostics contains generated localizable diagnostic messages.
tsgo/jsnum
Package jsnum provides JS-like number handling.
Package jsnum provides JS-like number handling.
tsgo/nodebuilder
Exports interfaces and types defining the node builder - concrete implementations are on top of the checker, but these types and interfaces are used by the emit resolver in the printer
Exports interfaces and types defining the node builder - concrete implementations are on top of the checker, but these types and interfaces are used by the emit resolver in the printer
tsgo/printer
Package printer exports a Printer for pretty-printing TS ASTs and writer interfaces and implementations for using them Intended ultimate usage:
Package printer exports a Printer for pretty-printing TS ASTs and writer interfaces and implementations for using them Intended ultimate usage:
tsgo/stringutil
Package stringutil Exports common rune utilities for parsing and emitting javascript
Package stringutil Exports common rune utilities for parsing and emitting javascript
Package jsrt provides runtime support for TypeScript-to-Go transpiled code.
Package jsrt provides runtime support for TypeScript-to-Go transpiled code.
array
Package array provides JavaScript Array.prototype method equivalents using Go generics.
Package array provides JavaScript Array.prototype method equivalents using Go generics.
compat/lodash
Package lodash provides Go adapters for commonly used lodash/lodash-es functions.
Package lodash provides Go adapters for commonly used lodash/lodash-es functions.
compat/uuid
Package uuid provides a Go adapter for the npm "uuid" package.
Package uuid provides a Go adapter for the npm "uuid" package.
compat/zod
Package zod provides a Go adapter for the npm "zod" schema validation library.
Package zod provides a Go adapter for the npm "zod" schema validation library.
console
Package console provides console.log/error/warn for transpiled TypeScript code.
Package console provides console.log/error/warn for transpiled TypeScript code.
fetch
Package fetch provides the fetch() API for transpiled TypeScript code.
Package fetch provides the fetch() API for transpiled TypeScript code.
node/crypto
Package crypto provides Node.js crypto module equivalents for transpiled TypeScript code.
Package crypto provides Node.js crypto module equivalents for transpiled TypeScript code.
node/fs
Package fs provides Node.js fs module equivalents for transpiled TypeScript code.
Package fs provides Node.js fs module equivalents for transpiled TypeScript code.
node/http
Package http provides Node.js http module equivalents for transpiled TypeScript code.
Package http provides Node.js http module equivalents for transpiled TypeScript code.
node/path
Package path provides Node.js path module equivalents for transpiled TypeScript code.
Package path provides Node.js path module equivalents for transpiled TypeScript code.
promise
Package promise provides a Promise[T] type for transpiled async/await TypeScript code.
Package promise provides a Promise[T] type for transpiled async/await TypeScript code.
web
Package web provides Go struct definitions for Web API types used by transpiled TypeScript code.
Package web provides Go struct definitions for Web API types used by transpiled TypeScript code.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL