GamingTS

Architecture

Monorepo Structure

GTS is a monorepo managed with Bun (workspaces defined in the root package.json). The build orchestration is handled by bunup, configured in bunup.config.ts.

gts/
├── packages/
│   ├── transpiler/          # Core: parse .gts → transform → emit JS
│   ├── runtime/             # Runtime library (ViewModel, createDefine, createBinding)
│   ├── language-plugin/     # Volar language plugin (virtual code generation)
│   ├── language-server/     # LSP server (Node.js + browser entry points)
│   ├── esbuild-plugin/      # esbuild/Bun plugin for .gts files
│   ├── rollup-plugin/       # Rollup plugin for .gts files
│   ├── tsc/                 # CLI: gtsc (TypeScript compiler with GTS support)
│   ├── typescript-language-service-plugin/  # TS Language Service Plugin (CJS)
│   └── vscode/              # VS Code extension (syntax, LSP client)
├── examples/
│   ├── local/               # Dev testing with .gts files
│   ├── provider/            # Example provider (ViewModel definitions)
│   └── web/                 # Vite + web example
├── bunup.config.ts          # Build configuration for all packages
├── bunfig.toml              # Bun config (preloads GTS esbuild plugin)
└── package.json             # Root workspace definition

Package Map

Packagenpm NameFormatTargetPurpose
transpiler@gi-tcg/gts-transpilerESMbrowserCore compilation engine
runtime@gi-tcg/gts-runtimeESMbrowserRuntime library for execution
language-plugin@gi-tcg/gts-language-pluginESMbrowserVolar virtual code provider
language-server@gi-tcg/gts-language-serverESMnode+browserFull LSP implementation
esbuild-plugin@gi-tcg/gts-esbuild-pluginESMnodeesbuild/Bun build plugin
rollup-plugin@gi-tcg/gts-rollup-pluginESMbrowserRollup build plugin
tsc@gi-tcg/gtscESMnodeCLI compiler wrapper
ts-ls-plugin@gi-tcg/gts-typescript-language-service-pluginCJSnodeTS editor plugin
vscodegts-vscode (private)CJSnodeVS Code extension

Dependency Graph

                        ┌──────────────┐
                        │  transpiler  │
                        └──────┬───────┘
                               │ used by
            ┌──────────┬───────┼───────────┬────────────┐
            │          │       │           │            │
      ┌─────┴─────┐ ┌──┴──┐ ┌─┴──────┐ ┌──┴───┐  ┌────┴─────┐
      │  esbuild  │ │rollup│ │language │ │ tsc  │  │ language │
      │  plugin   │ │plugin│ │ plugin  │ │(gtsc)│  │  server  │
      └───────────┘ └─────┘ └────┬────┘ └──┬───┘  └────┬─────┘
                                 │         │            │
                                 │    uses language-plugin
                                 │         │            │
                                 └─────────┼────────────┘

                              ┌────────────┴──────────────┐
                              │  ts-language-service-plugin │
                              └────────────┬──────────────┘

                              ┌────────────┴──────────────┐
                              │     vscode extension       │
                              └───────────────────────────┘

      ┌──────────┐
      │ runtime  │  (standalone — consumed by user code at runtime)
      └──────────┘

Key relationships:

  • transpiler is the foundational package; all build plugins and language tools depend on it.
  • language-plugin wraps the transpiler's Volar output into a Volar LanguagePlugin — used by the language server, gtsc, and the TS language service plugin.
  • runtime is independent and only consumed by the generated JavaScript at execution time.

Build System

bunup (Build Orchestrator)

The root bunup.config.ts defines workspaces with individual build configs:

export default defineWorkspace([
  { name: "transpiler", root: "packages/transpiler" },
  { name: "runtime", root: "packages/runtime" },
  { name: "esbuild-plugin", root: "packages/esbuild-plugin", config: { target: "node" } },
  { name: "rollup-plugin", root: "packages/rollup-plugin", config: { target: "browser" } },
  { name: "language-plugin", root: "packages/language-plugin", config: { target: "browser" } },
  { name: "language-server", root: "packages/language-server", config: [
    { name: "node", entry: "src/node.ts", target: "node", outDir: "dist/node" },
    { name: "browser", entry: "src/browser.ts", target: "browser", outDir: "dist/browser" },
  ]},
  { name: "tsc", root: "packages/tsc", config: { target: "node", dts: false } },
  { name: "ts-ls-plugin", root: "packages/typescript-language-service-plugin",
    config: { target: "node", format: "cjs", dts: false } },
  { name: "vscode", root: "packages/vscode",
    config: { entry: ["src/extension.ts", "src/server.ts"], target: "node",
              format: "cjs", dts: false, packages: "bundle" } },
], { outDir: "dist", format: "esm", target: "browser", conditions: ["bun"], packages: "external" });

Default output format is ESM targeting browser. Individual packages override as needed (CJS for VS Code/TS plugin, node for CLI tools).

Bun Preloading

The root bunfig.toml preloads the esbuild plugin so that .gts files can be imported directly when running with bun:

preload = ["@gi-tcg/gts-esbuild-plugin/bun-preload"]

This calls Bun.plugin(gts()) at startup, registering a loader for .gts files.

External Dependencies

Transpiler Dependencies

PackageVersionPurpose
acorn8.15.0JavaScript parser (base)
@sveltejs/acorn-typescriptTypeScript syntax plugin for Acorn
esrap2.2.1AST printer with source map support
zimmerframe1.1.4AST walker/visitor framework
magic-string0.30.21Source map generation
@jridgewell/sourcemap-codecVLQ source map decoding

Language Tooling Dependencies

PackagePurpose
@volar/language-coreVolar virtual code and language plugin interfaces
@volar/language-serverLSP server framework
@volar/typescriptTypeScript integration for Volar
volar-service-typescriptTypeScript language service for Volar
vscode-uriURI handling for VS Code/LSP

Publishing

The scripts/publish.ts script validates consistency across all 8 public packages (version, repository, license) and publishes each to npm with --access public. Current version: 0.2.0.

On this page