- Alpha
Compatibility and status
What ts-r matches today against tsc 7, esbuild and ESLint, and how the top 1,000 npm packages fare. Generated from ecosystem/STATUS.md and the crates' notes.
ts-r measures correctness against the tools it replaces: tsc 7.0.2 for parsing, resolution, emit and type errors, esbuild 0.28.2 for bundling, and ESLint with typescript-eslint for lint. This page is generated when the site is built. The ecosystem section comes from ecosystem/STATUS.md, and the conformance table from numbers recorded in the crates' AGENTS.md files and design records (the build fails if a quoted number disappears from its source, so the table can't silently go stale).
Summary
| Tool | Works today | Main gaps |
|---|---|---|
ts-r-run | Runs TypeScript on Node 22.15+; passes 98 of 100 compared tests of tsx's own suite and 36 of 36 of Node's type-stripping tests | Only the entry's tsconfig is used; Windows untested |
ts-r-dev | Hot reload, Vite's import.meta.hot API, React Fast Refresh, dependency pre-bundling | No CSS preprocessors; some vite.config options and plugin APIs; HTTP/1.1 only |
ts-r-build | esbuild's CLI flags, ESM/CJS/IIFE, splitting, minify, source maps, --watch | No plugins, no CSS bundling, lowering down to ES2015 (not ES5) |
ts-r-check | tsc's codes and messages; 97.0% of conformance tests exact; 3 of 6 public bench projects match exactly | No "Did you mean" suggestions on regular expression errors (TS1369); some inference and narrowing; emits like tsc unless --noEmit |
ts-r-lint | 154 rules (51 type-aware) matching 15,495 of 15,517 of ESLint's own tests; ESLint flat config, oxlint and Biome configs | Type-aware rules only where ts-r-check matches your tsc; plugins other than typescript-eslint unsupported |
ts-r-lsp | Shared server per workspace; lint; our checker or your TypeScript as the type backend | Slower than TypeScript 7's LSP to first diagnostics; most projects fall back to your TypeScript for diagnostics |
Conformance
| Area | Compared against | Result | Source |
|---|---|---|---|
| Parser | every JavaScript and TypeScript file of the top 1,000 npm packages (39,101 files in 989 packages) | 959 of 989 packages with no false errors; 56 files in 30 packages get grammar errors that Node and tsc don't report (TS1313, TS1108, TS1052) | ecosystem/STATUS.md, commit ea41eac |
| Print, then parse again | TypeScript's tests/cases | 17,740 files ok, 0 mismatches (1,472 skipped: syntax errors) | ts_r_codegen/AGENTS.md, commit ea41eac |
| tsconfig loading | tsc 7.0.2 --showConfig and config diagnostics on the five public bench repos (114 tsconfig files) | 114 of 114 --showConfig outputs match; 111 of 114 with the same diagnostics (3 differ in a message's text) | ts_r_config/AGENTS.md, commit ea41eac |
| Module resolution | tsc 7.0.2 --traceResolution on the five public bench repos (114 configs) | 158,174 resolutions, 10 mismatches (one require of vitest, in two tRPC configs) | ts_r_resolver/AGENTS.md, commit ea41eac |
| JavaScript emit | tsc 7.0.2's emit baselines (below ES2022, outFile, AMD/System/UMD and syntax errors skipped) | 1,673 match, 61 differ | ts_r_transform/AGENTS.md, commit 493fc13 |
| Binder diagnostics | tsc 7.0.2 baselines for the binder's codes (12,783 variants) | 418 of 464 tests exact; 1,720 of 1,839 diagnostics found | ts_r_binder/AGENTS.md, commit 4224610 |
| Type checker | tsc 7.0.2 conformance baselines, 12,750 compared test variants | 97.0% exact (all diagnostics and chains); 191 variants with a diagnostic tsc does not report, 10 of them in tests where tsc reports nothing | ts_r_checker/AGENTS.md, commit 9b5f8f2 |
| Type checker | tsc 7.0.2 on six public projects: tRPC, date-fns, TypeORM, Playwright, RxJS and the React Compiler | 3 of 6 match exactly (tRPC, date-fns, TypeORM); Playwright 2 extra; RxJS 6 extra and 5 missing of 21,908; React Compiler 71 extra, 0 missing of 156 | bench/README.md, commit ea41eac |
| Lint rules | every case of the published ESLint and typescript-eslint rule tests (154 rules, 51 type-aware) | 15,495 of 15,517 cases match (8,597 of 8,597 without types; 6,898 of 6,920 type-aware) | ts_r_lint/AGENTS.md, commit 087afc9 |
| Lint on a real project | ESLint on TypeORM without type information (ts-r-lint --no-type-check), every configured rule, 2026-10-16 | 2,174 of ESLint's 7,392 problems match, 2 only ts-r-lint; most of the 5,218 missed (4,928) come from jsdoc plugin rules ts-r-lint doesn't have | bench/README.md |
| Bundler | esbuild 0.28.2's end-to-end bundler tests | 832 of 872 compared cases pass (95.4%); 198 skipped | esbuild-oracle/README.md, commit 07d2cdd |
| Dev server | Vite 8.3.4's playground e2e specs, run in headless Chrome against both servers (tests that pass on Vite are compared) | 274 of 322 compared tests pass (85.1%); 77 skipped | dev-oracle/README.md, commit e07eafa |
| Runner | tsx 4.23.15's own test suite, run with ts-r-run in place of tsx | 98 of 100 compared cases pass (98.0%); 35 skipped | run-oracle/README.md, commit 23aedd7 |
| Runner | Node 24.21.0's TypeScript (type stripping) tests | 36 of 36 compared cases pass (100%); 53 skipped | run-oracle/README.md, commit 23aedd7 |
| Editor features | tsc 7.0.2 --lsp on TypeScript's fourslash tests (hover, completion, definition, references, rename, signature help, highlights) | 795 of 2549 compared tests pass (31.2%); 4050 of 9094 queries agree | lsp-oracle/README.md, commit 4eda074 |
| Launcher | the standalone ts-r-<tool> binaries (ts-r <tool> args vs ts-r-<tool> args) | 37 of 37 passthrough cases and 13 of 13 launcher cases pass | cli-oracle/README.md, commit 8c14f29 |
Ecosystem: the top 1,000 npm packages
cargo xtask ecosystem downloads the most-downloaded npm packages and runs each stage that applies: parse every file, transform TypeScript sources, bundle the package and run it, check its .d.ts files against tsc 7, and run its own test suite with tsc, tsx, ts-node and esbuild swapped for ts-r. See ecosystem/README.md for how each stage compares.
Run on 2026-10-24 at commit ea41eac over the top 1000 npm packages (776 s). Reference tools: esbuild 0.28.2, node v24.21.0, tsc 7.0.2.. Pass rate = pass / (pass + fail + error); skips have nothing to compare.
| Stage | Pass | Fail | Error | Skip | Pass rate |
|---|---|---|---|---|---|
| parse | 959 | 30 | 0 | 11 | 97.0% |
| transform | 48 | 0 | 0 | 952 | 100.0% |
| bundle | 915 | 0 | 0 | 85 | 100.0% |
| check | 652 | 57 | 0 | 291 | 92.0% |
| tests | 2 | 2 | 0 | 996 | 50.0% |
| Stage | Items compared | Items failing |
|---|---|---|
| parse | 39101 | 56 |
| transform | 1156 | 0 |
| bundle | 1217 | 0 |
| check | 1460 | 121 |
| tests | 4 | 2 |
Bundle size versus esbuild (minified): 914 packages with both bundles: ts-r-build 98048.1 KiB total, esbuild 101020.8 KiB (-2.9%). Median ratio 0.993; 637 of 914 packages are the same size or smaller. Worst ratios:
Top 10 failure causes (all extra causes are diagnostics ts-r reports and tsc doesn't):
| # | Stage | Cause | Packages | Items | Owner |
|---|---|---|---|---|---|
| 1 | parse | TS1313: The body of an '…' statement cannot be the empty statement. | 25 | 49 | ts_r_parser |
| 2 | check | extra TS2536: Type '…' cannot be used to index type '…'. | 21 | 21 | ts_r_checker |
| 3 | check | extra TS2716: Type parameter '…' has a circular default. | 18 | 18 | ts_r_checker |
| 4 | check | extra TS2344: Type '…' does not satisfy the constraint '…'. | 13 | 26 | ts_r_checker |
| 5 | check | extra TS2739: Type '…' is missing the following properties from type '…': RuleOptions, MessageId… | 7 | 10 | ts_r_checker |
| 6 | check | extra TS2417: Class static side '…' incorrectly extends base class static side '…'. | 4 | 20 | ts_r_checker |
| 7 | parse | TS1108: A '…' statement can only be used within a function body. | 3 | 5 | ts_r_parser |
| 8 | check | extra TS2322: Type '…' is not assignable to type '…'. | 2 | 2 | ts_r_checker |
| 9 | check | extra TS2415: Class '…' incorrectly extends base class '…'. | 2 | 2 | ts_r_checker |
| 10 | parse | TS1052: A '…' accessor parameter cannot have an initializer. | 2 | 2 | ts_r_parser |
The full list of failing packages and a repro for each top cause are in ecosystem/STATUS.md.
What "works today" means
A feature is listed as working when it runs from source on a branch that passed its gates (cargo test, cargo clippy -D warnings, cargo xtask agents-check) and its numbers are recorded in the repo. Alpha releases are on npm under the next dist-tag; see Getting started.