@imwildcat/xtrpc v0.1.4
๐tRPC
A CLI tool that helps you cleanly e๐port your tRPC router to
- ๐ฅ๐ massively boost your language server performance
 - ๐ป๐ give your users a typed SDK so they can consume your API without hassle
 - ๐ซโ ensure you don't leak any implementation details via 
ctx - โ๏ธ๐ณ prune your router to expose only the routes you (or your users) care about
 
๐tRPC leverages the awesome ts-morph API to load, transform & emit the Typescript AST containing your tRPC definitions. Basically, it
- (in-memory) redefines your 
Contexttype asany - (in-memory) "unimplements" your middlewares by transforming them into 
({ ctx, next }) => next({ ctx }) - (in-memory) prunes your router based on your needs
 - emits a minimal 
.d.tsfile that declares your API 
With the help of a type assertion, your app stays fully typesafe while you enjoy the performance benefits in your editor!
Demo
Performance
Compare how long it takes to write the same tRPC query with the help of Intellisense before and after compiling your API with ๐tRPC:
| Before (45s) | After (10s) | 
|---|---|
![]()  | ![]()  | 
Typed SDK
See algora-io/sdk as an example of how we published our own API
Table of Contents
Quickstart
Setup
Install the package
Navigate to the project containing your tRPC router and run
pnpm add -D @algora/xtrpcGenerate your API
pnpm xtrpcInclude your types in tsconfig.json
{
  "include": ["index.ts", "src", "types"]
}Export your API & inference helpers
export { type API } from "./types/api";
export type RouterInputs = inferRouterInputs<API>;
export type RouterOutputs = inferRouterOutputs<API>;(Recommended) Add a type assertion to maintain type safety
type Expect<T extends true> = T;
type _Assertion = Expect<AppRouter extends API ? true : false>;Use API instead of AppRouter in your tRPC client
export const trpc = createTRPCNext<API>({...})Usage
Once you've set up your client to use the API, just rerun the tool to regenerate it whenever your type assertion fails
pnpm xtrpcConfiguration
Add a xtrpc.config.json file in your project to configure ๐tRPC. Below is the default configuration.
{
  // path to the project that contains your tRPC definitions
  "srcProject": ".",
  // path to the project that your API will be exported to
  "dstProject": ".",
  
  // name of the directory your API will be exported to
  "outDir": "types",
  
  // name of the file your API will be exported to
  "outName": "api.d.ts",
  
  // whether your API should be overwritten if it already exists
  "overwrite": false,
  
  // an optional Record<string, string[]> if you'd like to prune your router before exporting
  // keys are subrouters (i.e. the exported name of your subrouter)
  // values are procedures (i.e. the keys of your subrouter)
  "include": {}
  "parserOptions": {
    // type alias of your app router
    "appRouterAlias": "AppRouter"
  }
}Caveats
- ๐tRPC may not work properly if your procedure outputs are not explicitly declared. For best results, add 
.outputto all of your procedures (which is a good practice to not leak sensitive info anyways) and enableexplicitOutputsin yourxtrpc.config.json - "Go to definition" jumps to the emitted 
.d.tsfile instead of your source code. This can potentially be fixed by emitting declaration map(s) alongside your API. 

