# Prisma tRPC Generator

> This generator is a fork from ["prisma-trpc-generator"](https://github.com/omar-dulaimi/prisma-trpc-generator) but with the added value of working in Prisma ORM versions 5 and 6. The related forked generator only works fine until Prisma ORM version 4.

Thanks to [Omar Dulaimi](https://github.com/omar-dulaimi/) for sharing.

[![npm](https://img.shields.io/npm/l/prisma-trpc-generator.svg)](LICENSE)

<p align="center">
  <a href="https://github.com/ladislaogarcia/prisma-trpc-generator">
    <img src="https://raw.githubusercontent.com/ladislaogarcia/prisma-trpc-generator/master/logo.png" alt="Logo" width="200" height="200"/>
  </a>
  <h3 align="center">Prisma tRPC Generator</h3>
  <p align="center">
    A Prisma generator that automates creating your tRPC routers from your Prisma schema.
    <br />
    <a href="https://github.com/ladislaogarcia/prisma-trpc-generator#additional-options"><strong>Explore the options »</strong></a>
    <br />
    <br />
    <a href="https://github.com/ladislaogarcia/prisma-trpc-generator/issues/new?template=bug_report.yml">Report Bug</a>
    ·
    <a href="https://github.com/ladislaogarcia/prisma-trpc-generator/issues/new?template=feature_request.md">Request Feature</a>
  </p>
</p>

## Table of Contents

- [About The Project](#about-the-project)
- [Supported Prisma Versions](#supported-prisma-versions)
  - [Prisma 4](#prisma-4)
  - [Prisma 2/3](#prisma-23)
- [Supported tRPC Versions](#supported-trpc-versions)
  - [tRPC 10](#trpc-10)
  - [tRPC 9](#trpc-9)
- [Installation](#installation)
- [Usage](#usage)
- [Customizations](#customizations)
  - [Skipping entire models](#skipping-entire-models)
- [Additional Options](#additional-options)

# About The Project

Automatically generate fully implemented tRPC routers from your [Prisma](https://github.com/prisma/prisma) Schema. This includes routers, app router and of course all input schemas using [Zod](https://github.com/colinhacks/zod). Updates every time `npx prisma generate` runs.

# Supported Prisma Versions

### Prisma 4

- 0.2.0 and higher

### Prisma 2/3

- 0.1.12 and lower

# Supported tRPC Versions

### tRPC 10

- 0.8.0 and higher

### tRPC 9

- 0.7.2 and lower

# Installation

Using npm:

```bash
 npm install @ladislaogarcia/prisma-trpc-generator
```

# Usage

1- Star this repo 😉

2- Add the generator to your Prisma schema

```prisma
generator trpc {
  provider          = "prisma-trpc-generator"
  withZod           = true
  withMiddleware    = false
  withShield        = false
  contextPath       = "../src/context"
  trpcOptionsPath   = "../src/trpcOptions"
}
```

3- Enable strict mode in `tsconfig` as it is required by Zod, and considered a Typescript best practice

```ts
{
  "compilerOptions": {
    "strict": true
  }
}

```

4- Running `npx prisma generate` for the following schema.prisma

```prisma
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String
  content   String?
  published Boolean  @default(false)
  viewCount Int      @default(0)
  author    User?    @relation(fields: [authorId], references: [id])
  authorId  Int?
}
```

will generate

![tRPC Routers](https://raw.githubusercontent.com/ladislaogarcia/prisma-trpc-generator/master/trpcRouters.png)

5- Make sure you have a valid `Context` file, as specified in `contextPath` option. The official [Context](https://trpc.io/docs/context) for reference.

6- Optionally, you can specify a `trpcOptionsPath` to set various tRPC options (like transformer, error formatter, etc). Find about all possible options [here](https://trpc.io/docs/router#advanced-usage).

```ts
import { ZodError } from 'zod';

export default {
  errorFormatter({ shape, error }) {
    return {
      ...shape,
      data: {
        ...shape.data,
        zodError:
          error.code === 'BAD_REQUEST' && error.cause instanceof ZodError
            ? error.cause.flatten()
            : null,
      },
    };
  },
};
```

# Customizations

## Skipping entire models

```prisma
/// @@Gen.model(hide: true)
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}
```

# Additional Options

| Option                     | Description                                                                            | Type      | Default                                                                                                                                                                      |
| -------------------------- | -------------------------------------------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `output`                   | Output directory for the generated routers and zod schemas                             | `string`  | `./generated`                                                                                                                                                                |
| `withMiddleware`           | Attaches a global middleware that runs before all procedures                           | `boolean or string`| `true`                                                                                                                                                              |
| `output`                   | Output directory for the generated routers and zod schemas                             | `string`  | `./generated`                                                                                                                                                                |
| `withZod`                  |  Use Zod for input validation                                                          | `boolean` | `true`                                                                                                                                                                       |
| `withShield`               | Generates a tRPC Shield to use as a permissions layer                                  | `boolean or string` | `true`                                                                                                                                                                       |
| `contextPath`              | Sets the context path used in your routers                                             | `string`  | `../../../../src/context`                                                                                                                                                    |
| `trpcOptionsPath`          | Sets the tRPC instance options                                                         | `string`  | `../../../../src/trpcOptions`                                                                                                                                                |
| `isGenerateSelect`         | Enables the generation of Select related schemas and the select property               | `boolean` | `false`                                                                                                                                                                      |
| `isGenerateInclude`        | Enables the generation of Include related schemas and the include property             | `boolean` | `false`                                                                                                                                                                      |
| `showModelNameInProcedure` | When disabled, the generated procedure no longer includes the name of the Prisma model | `boolean` | `true`                                                                                                                                                                       |
| `generateModelActions`     | Enables the generation of specific model actions                                       | `string`  | `aggregate,aggregateRaw,count,create,createMany,delete,deleteMany,findFirst,findFirstOrThrow,findMany,findRaw,findUnique,findUniqueOrThrow,groupBy,update,updateMany,upsert` |

Use additional options in the `schema.prisma`

```prisma
generator trpc {
  provider           = "prisma-trpc-generator"
  output             = "./trpc"
  withMiddleware     = "../middleware"
  withZod            = false
  withShield         = false
  contextPath        = "../context"
  trpcOptionsPath    = "../trpcOptions"
  isGenerateSelect   = true
  isGenerateInclude  = true
  showModelNameInProcedure  = false
  generateModelActions = "aggregate,aggregateRaw,count,create,createMany,delete,deleteMany,findFirst,findFirstOrThrow,findMany,findRaw,findUnique,findUniqueOrThrow,groupBy,update,updateMany,upsert"
}
```
