Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/omar-dulaimi/prisma-trpc-generator

Prisma 2+ generator to emit fully implemented tRPC routers
https://github.com/omar-dulaimi/prisma-trpc-generator

prisma prisma-generator trpc zod

Last synced: about 2 months ago
JSON representation

Prisma 2+ generator to emit fully implemented tRPC routers

Awesome Lists containing this project

README

        

[![npm version](https://badge.fury.io/js/prisma-trpc-generator.svg)](https://badge.fury.io/js/prisma-trpc-generator)
[![npm](https://img.shields.io/npm/dt/prisma-trpc-generator.svg)](https://www.npmjs.com/package/prisma-trpc-generator)
[![HitCount](https://hits.dwyl.com/omar-dulaimi/prisma-trpc-generator.svg?style=flat)](http://hits.dwyl.com/omar-dulaimi/prisma-trpc-generator)
[![npm](https://img.shields.io/npm/l/prisma-trpc-generator.svg)](LICENSE)



Logo

Prisma tRPC Generator



A Prisma generator that automates creating your tRPC routers from your Prisma schema.


Explore the options ยป




Report Bug
ยท
Request Feature



Buy Me A Coffee

## 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 prisma-trpc-generator
```

Using yarn:

```bash
yarn add 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/omar-dulaimi/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"
}
```