Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Prisma Client Extensions (Preview) #43

Closed
marcjulian opened this issue Dec 2, 2022 · 3 comments
Closed

Support Prisma Client Extensions (Preview) #43

marcjulian opened this issue Dec 2, 2022 · 3 comments
Labels
enhancement New feature or request

Comments

@marcjulian
Copy link
Member

Prisma release with in version 4.7.0 Prisma Client Extensions (Preview)

This should be possible with the new CustomPrismaModule/CustomPrismaService (#40) where you can need to provide a PrismaClient instance.

@marcjulian
Copy link
Member Author

Example to use Prisma Client Extensions.

  1. Install Prisma Client v4.7.0 or later and install nestjs-prisma@v0.20.0-dev.2

  2. Enable clientExtensions preview

datasource db {
  provider = "sqlite"
  url      = "file:dev.db"
}

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["clientExtensions"]
}

model User {
  id    String  @id @default(cuid())
  email String  @unique
  name  String?
}
  1. Create a file for the Prisma extension prisma.extension.ts
import { PrismaClient } from '@prisma/client';

/**
 * TS error: "Inferred type of this node exceeds the maximum length the compiler will serialize" with "declaration": true in tsconfig
 *
 * Change "declaration": false in `tsconfig.json`
 *
 * https://github.com/prisma/prisma/issues/16536#issuecomment-1332055501
 */
export const prismaClient = new PrismaClient().$extends({
  model: {
    user: {
      findByEmail: async (email: string) => {
        return prismaClient.user.findFirstOrThrow({ where: { email } });
      },
    },
  },
});

export type prismaClient = typeof prismaClient;
  1. Change declaration to false in your tsconfig.json - workaround for $extends TS error: "Inferred type of this node exceeds the maximum length the compiler will serialize" with "declaration": true in tsconfig prisma/prisma#16536 (comment)

The inferred type of this node exceeds the maximum length the compiler will serialize. An explicit type annotation is needed.

  1. Use CustomPrismaModule.forRootAsync
import { Module } from '@nestjs/common';
import { CustomPrismaModule } from 'nestjs-prisma';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { prismaClient } from './prisma.extension';

@Module({
  imports: [
    CustomPrismaModule.forRootAsync({
      name: 'PrismaService',
      useFactory: () => {
        return prismaClient;
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  1. Inject CustomPrismaService into your controller/service
import { Inject, Injectable } from '@nestjs/common';
import { CustomPrismaService } from 'nestjs-prisma';
import { prismaClient } from './prisma.extension';

@Injectable()
export class AppService {
  constructor(
    // ✅ use `prismaClient` from extension for correct type-safety
    @Inject('PrismaService')
    private prismaService: CustomPrismaService<prismaClient>,
  ) {}

  users() {
    return this.prismaService.client.user.findMany();
  }

  user(userId: string) {
    // 🦾 use new `findByEmail`
    return this.prismaService.client.user.findByEmail(userId);
  }
}

@marcjulian marcjulian added the enhancement New feature or request label Dec 16, 2022
@shoaibsharif
Copy link

Thank you for the example. That helps a lot to understand how to use extension with new dev release version, but is there a way we can use extension in existing PrismaService or anyway to override that?

@marcjulian
Copy link
Member Author

marcjulian commented Jan 16, 2023

hi @shoaibsharif haven't found a way to use extension with the existing PrismaService as the service is directly extended by the default PrismaClient. For now you need to use CustomPrismaService.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants