Una de las cosas que he visto es que en pnpm-workspaces.yaml no solo declaran las carpetas en las que están todos los paquetes, sino que además, crean catalogs para establecer de manera global las versiones a utilizar para diferentes paquetes.
index.ts - Inicializamos el TRPC Router, pasándole un objeto con los procedimientos, y lo exportamos junto con su type.
import { peopleRouter } from './router/people.js';import { createTRPCRouter } from './trpc.js';export const appRouter = createTRPCRouter({ people: peopleRouter});// Export type router type signature,// NOT the router itself.export type AppRouter = typeof appRouter;/** * Create a server-side caller for the tRPC API * @example * const trpc = createCaller(createContext); * const res = await trpc.post.all(); * ^? Post[] */export const createCaller = createCallerFactory(appRouter);
trpc.ts - Inicializamos TRPC y exportamos:
t.router: Método para instanciar el router
t.procedure: Método para instanciar procesos de TRPC
import { initTRPC } from '@trpc/server';/** * Initialization of tRPC backend * Should be done only once per backend! */const t = initTRPC.create();/** * Middleware for timing procedure execution and adding an articifial delay in development. */const timingMiddleware = t.middleware(async ({path, next}) => { const start = Date.now(); if (t._config.isDev) { const waitMs = Math.floor(Math.random() * 400) + 100; await new Promise(resolve => setTimeout(resolve, waitMs)); } const result = await next(); const end = Date.now(); console.log(`[TRPC] ${path} took ${end - start}ms to execute`); return result;})/** * Create a server-side caller * @see https://trpc.io/docs/server/server-side-calls */export const createCallerFactory = t.createCallerFactory;/** * Export reusable router and procedure helpers * that can be used throughout the router */export const createTRPCRouter = t.router;export const publicProcedure = t.procedure;
/router/people - Creamos el peopleRouter que incluimos más arriba en appRouter
/trpc/react.ts - Exportamos el provider y un hook de TRPC desde createTRPCContext. Le pasamos como genérico el type de nuestro appRouter para que Typescript conozca nuestra API.
import { createTRPCContext } from '@trpc/tanstack-react-query'import type { AppRouter } from '@repo/api'export const { TRPCProvider, useTRPC } = createTRPCContext<AppRouter>()
Para llamar a procedimientos TRPC desde el servidor debemos usar createCallerFactory, una función que nos permite crear un caller server-side para el router que le pasemos como argumento.
En este caso es necesario crearlo en como hemos hecho más arriba entrpc.ts