0.1.7 • Published 10 months ago

trpc-decorator v0.1.7

Weekly downloads
-
License
MIT
Repository
-
Last release
10 months ago

tRPC Decorator

A library to simplify building tRPC routes using decorator syntax, enhancing ease of use and compatibility with Dependency Injection paradigms like TSyringe.

Benefits

  • Class-style declaration of tRPC routes
  • Better integration with Dependency-Injection paradigms (e.g. TSyringe)
  • Improved code organization and readability

Installation

npm install trpc-decorator

Requirements

Ensure the following configurations are set in your project:

  1. Install the reflect-metadata package and import it in your project's root.

  2. If using TypeScript 5.0 or above, update your tsconfig.json:

    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
      }
    }

Usage

Note: Only tRPC v10 is currently support

Setting up tRPC v10

// server/trpc.ts
import { initTRPC } from '@trpc/server';
import { useDecorators } from "trpc-decorator";
import type { ContextOf } from "trpc-decorator";

const t = initTRPC.create();

export const router = t.router;
export const publicProcedure = t.procedure;
export const authProcedure = t.procedure.use(() => {
  // Implement your authentication logic here
});

export const decorators = useDecorators({
  "public": publicProcedure,
  "auth": authProcedure,
  // Add more custom procedures as needed
});

export type contextOf = ContextOf<typeof decorators>

Define tRPC routes using decorators

// server/TestRoute.ts
import { decorators } from "./trpc";
import type { contextOf } from "./trpc";
import { z } from "zod";

@decorators.route()
export class TestRoute {
    @decorators.query("public")
    sayHello(@decorators.input(z.string()) name: string) {
        return `Hello ${name}! How are you?`;
    }

    @decorators.query("auth")
    whoAmI(@decorators.context() ctx: contextOf<"auth">) {
        return `You are ${ctx.user.name}`;
    }
}

Integrating routes

// server/_app.ts
import { router } from './trpc';
import { createTrpcDecoratorRoutes } from "trpc-decorator";
import { GeneratedRouteTypes } from "./types-generated"; // generated by `npx trpc-decorator-gen`
import { TestRoute } from './TestRoute';

const routes = createTrpcDecoratorRoutes([
    new UserRoute(),
    // In case of using IoC libraries such as TSyringe:
    // container.resolve(UserRoute)
], router) as GeneratedRouteTypes;

export const appRouter = router({
  ...routes,
  // your regular routes here
  // ...
})

// Export only the type of the router to prevent importing server code on the client
export type AppRouter = typeof appRouter;

Generating Types for Routes

To generate type definitions for your class-based routes, run:

npx trpc-decorator-gen

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

0.1.7

10 months ago

0.1.6

10 months ago

0.1.5

10 months ago

0.1.4

11 months ago

0.1.3

11 months ago

0.1.2

12 months ago

0.1.1

12 months ago

0.1.0

12 months ago