Giter VIP home page Giter VIP logo

trpc-routes's Introduction

trpc-routes



TODO

  • Improve router traversing
  • Test on other platforms (vite, rollup)
  • Investigate wheter it's posible to have "virtual routes" on nextjs to not have to generate route files

Route treeshaking and generation support for tRPC

  • Allows you to treeshake your routers and remove unused procedures.
  • Route handler generator allows you to specify handler config for each procedure separately.
  • Ideal for big procedures where you get an unnecessarily slow initial load.

Router treeshake plugin usage

1. Install @trpc-routes/treeshake.

# npm
npm install --save-dev @trpc-routes/treeshake
# yarn
yarn add @trpc-routes/treeshake
# pnpm
pnpm add --save-dev @trpc-routes/treeshake

2. Add plugin to your nextjs/vite/etc config.

import { next } from "@trpc-routes/treeshake/next";

/** @type {import("next").NextConfig} */
const config = next({}); /* ๐Ÿ‘ˆ */

export default config;

3. Use treeshake$ on a router.

const appRouter = t.router({
  sayHello: t.procedure
    .query(({ input }) => {
      return { greeting: `Hello ${input.name}!` };
    });
  bye: t.procedure
    .query(({ input }) => {
      return { response: `Bye ${input.name}!` };
    });
});

console.log(treeshake$(appRouter, 'sayHello')) /* ๐Ÿ‘ˆ output will remove all procedures except sayHello */

Route generation usage

1. Install @trpc-routes/generate.

# npm
npm install --save-dev @trpc-routes/generate
# yarn
yarn add @trpc-routes/generate
# pnpm
pnpm add --save-dev @trpc-routes/generate

2. Add NextRoutesMeta to your tRPC instance.

import { initTRPC } from '@trpc/server';
import { NextRoutesMeta } from '@trpc-routes/generate/adapters/next';

const t = initTRPC.meta<NextRoutesMeta>().create(); /* ๐Ÿ‘ˆ */

3. Add config options for a procedure.

export const appRouter = t.router({
  sayHello: t.procedure
    .meta({ /* ๐Ÿ‘‰ */ next: { runtime: 'edge', revalidate: 3600 } })
    .input(z.object({ name: z.string() }))
    .output(z.object({ greeting: z.string() }))
    .query(({ input }) => {
      return { greeting: `Hello ${input.name}!` };
    });
});

4. Define trpc-routes.config.ts.

import { createNextRoutesConfig } from "@trpc-routes/generate/adapters/next";

import { createTRPCContext } from "~/server/api/trpc";
import { appRouter } from "~/server/api/root";

/* ๐Ÿ‘‡ */
export default createNextRoutesConfig({
  router: appRouter,
  endpoint: "/api/trpc",
  createContext: createTRPCContext,
  onError: ({ path, error }) => {
    console.error(`โŒ tRPC failed on ${path ?? "<no-path>"}: ${error.message}`);
  },
});

5. Run route generation.

$ trpc-routes generate

Example of generated code

// /app/(generated)/api/trpc/example.hello/route.ts
import type { NextRequest } from "next/server";
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
import { treeshake$ } from "@trpc-routes/treeshake/runtime";
import { createTRPCContext } from "~/server/api/trpc";
import { appRouter } from "~/server/api/root";

export const runtime = "edge";

const handler = (req: NextRequest) => fetchRequestHandler({
  req,
  router: treeshake$(appRouter, "example.hello"),
  endpoint: "/api/trpc",
  createContext: createTRPCContext,
  onError: ({
    path,
    error
  }) => {
    console.error(`โŒ tRPC failed on ${path ?? "<no-path>"}: ${error.message}`);
  },
  batching: {
    enabled: false
  }
});

export { handler as GET, handler as POST };

License

Distributed under the MIT License. See LICENSE for more information.

Mentions

Built with create-t3-turbo starter project

trpc-routes's People

Contributors

lucasthevenet avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.