tsrun 0.1.23

A TypeScript interpreter designed for embedding in applications
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Getting Started - tsrun</title>
  <meta name="description" content="Get started with tsrun - installation, setup, and first steps.">
  <link rel="stylesheet" href="/css/style.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
</head>
<body>
  <nav class="nav">
    <div class="nav-container">
      <a href="/" class="nav-brand">
        <span>tsrun</span>
      </a>
      <ul class="nav-links">
        <li><a href="/playground/">Playground</a></li>
        <li><a href="/getting-started/" class="active">Getting Started</a></li>
        <li><a href="/docs/">Documentation</a></li>
        <li><a href="/examples/">Examples</a></li>
      </ul>
      <div class="nav-actions">
        <a href="https://github.com/DmitryBochkarev/tsrun" class="github-link" aria-label="GitHub">
          <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
            <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/>
          </svg>
        </a>
      </div>
    </div>
  </nav>

  <main>
    <div class="container">
      <div class="docs-layout">
        <aside class="docs-sidebar">
          <h4>On this page</h4>
          <ul>
            <li><a href="#installation">Installation</a></li>
            <li><a href="#cli-usage">CLI Usage</a></li>
            <li><a href="#rust-library">Rust Library</a></li>
            <li><a href="#c-embedding">C/C++ Embedding</a></li>
            <li><a href="#next-steps">Next Steps</a></li>
          </ul>
        </aside>

        <div class="docs-content">
          <h1>Getting Started</h1>

          <p>tsrun is a minimal TypeScript runtime in Rust, perfect for configuration files where you want IDE autocompletion, type checking, and error highlighting. It executes TypeScript directly without transpilation, with no Node.js dependency.</p>

          <h2 id="installation">Installation</h2>

          <h3>CLI Tool</h3>
          <p>Install the command-line tool with Cargo:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">bash</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-bash">cargo install tsrun</code></pre>
            </div>
          </div>

          <h3>Rust Library</h3>
          <p>Add tsrun to your Cargo.toml:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">toml</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-toml">[dependencies]
tsrun = "0.1"</code></pre>
            </div>
          </div>

          <h3>C/C++ Library</h3>
          <p>Build the shared library with C API support:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">bash</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-bash">cargo build --release --features c-api
# Produces: target/release/libtsrun.so (Linux)
#           target/release/libtsrun.dylib (macOS)
#           target/release/tsrun.dll (Windows)</code></pre>
            </div>
          </div>

          <h2 id="cli-usage">CLI Usage</h2>

          <p>Run TypeScript files directly:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">bash</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-bash"># Run a TypeScript file
tsrun script.ts

# With ES modules - imports are resolved automatically
tsrun main.ts</code></pre>
            </div>
          </div>

          <p>Example script.ts:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">typescript</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-typescript">interface User {
    name: string;
    email: string;
}

function greet(user: User): string {
    return `Hello, ${user.name}!`;
}

const user: User = { name: "Alice", email: "alice@example.com" };
console.log(greet(user));</code></pre>
            </div>
          </div>

          <h2 id="rust-library">Rust Library</h2>

          <p>Basic usage with the step-based execution model:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">rust</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-rust">use tsrun::{Interpreter, StepResult};

fn main() -> Result&lt;(), tsrun::JsError&gt; {
    let mut interp = Interpreter::new();

    // Prepare code for execution
    interp.prepare("1 + 2 * 3", None)?;

    // Step until completion
    loop {
        match interp.step()? {
            StepResult::Continue => continue,
            StepResult::Complete(value) => {
                println!("Result: {}", value.as_number().unwrap());
                break;
            }
            _ => break,
        }
    }
    Ok(())
}</code></pre>
            </div>
          </div>

          <h3>Working with Objects</h3>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">rust</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-rust">use tsrun::{Interpreter, api};
use serde_json::json;

let mut interp = Interpreter::new();
let guard = api::create_guard(&interp);

// Create values from JSON
let user = api::create_from_json(&mut interp, &guard, &json!({
    "name": "Alice",
    "age": 30,
    "tags": ["admin", "developer"]
}))?;

// Read properties
let name = api::get_property(&user, "name")?;
assert_eq!(name.as_str(), Some("Alice"));

// Modify properties
api::set_property(&user, "email", JsValue::from("alice@example.com"))?;</code></pre>
            </div>
          </div>

          <h2 id="c-embedding">C/C++ Embedding</h2>

          <p>Include the header and link against the library:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">c</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-c">#include "tsrun.h"

int main() {
    TsRunContext* ctx = tsrun_new();

    // Prepare and run code
    tsrun_prepare(ctx, "1 + 2 * 3", NULL);
    TsRunStepResult result = tsrun_run(ctx);

    if (result.status == TSRUN_STEP_COMPLETE) {
        printf("Result: %g\n", tsrun_get_number(result.value));
        tsrun_value_free(result.value);
    }

    tsrun_step_result_free(&result);
    tsrun_free(ctx);
    return 0;
}</code></pre>
            </div>
          </div>

          <p>Compile with:</p>
          <div class="code-block">
            <div class="code-header">
              <span class="lang">bash</span>
              <button class="copy-btn">Copy</button>
            </div>
            <div class="code-content">
              <pre><code class="language-bash">gcc -o myapp myapp.c -L./target/release -ltsrun</code></pre>
            </div>
          </div>

          <h2 id="next-steps">Next Steps</h2>

          <ul>
            <li><a href="/playground/">Try the Playground</a> - Run TypeScript in your browser</li>
            <li><a href="/docs/">Documentation</a> - Full API reference and guides</li>
            <li><a href="/docs/api.html">API Reference</a> - Rust and C APIs</li>
            <li><a href="/examples/">Examples</a> - Real-world usage examples</li>
          </ul>
        </div>
      </div>
    </div>

    <footer class="footer">
      <div class="container">
        <div class="footer-content">
          <div class="footer-links">
            <a href="https://github.com/DmitryBochkarev/tsrun">GitHub</a>
            <a href="/docs/">Documentation</a>
            <a href="/examples/">Examples</a>
          </div>
          <p class="footer-copy">MIT License</p>
        </div>
      </div>
    </footer>
  </main>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/rust.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/typescript.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/c.min.js"></script>
  <script src="/js/main.js"></script>
</body>
</html>