From 6defa1cd7d15846922f7dfe22e6601782fab4e24 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Thu, 28 Aug 2025 22:09:52 -0400 Subject: [PATCH] refactor: replace @prisma/client/runtime imports with public API (#23087) - Replace PrismaClientKnownRequestError and other error classes with Prisma namespace equivalents - Remove internal DefaultArgs and InternalArgs type imports from Prisma extensions - Ensure all error handling uses stable public API exports - Maintain compatibility with future Prisma versions by avoiding runtime dependencies Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Keith Williams --- .../v2/src/filters/prisma-exception.filter.ts | 30 ++++++++----------- .../stripepayment/lib/team-billing.ts | 4 +-- .../auth/lib/next-auth-custom-adapter.ts | 6 ++-- .../prisma/extensions/exclude-locked-users.ts | 11 ++++--- .../exclude-pending-payment-teams.ts | 11 ++++--- .../viewer/eventTypes/create.handler.ts | 5 ++-- 6 files changed, 29 insertions(+), 38 deletions(-) diff --git a/apps/api/v2/src/filters/prisma-exception.filter.ts b/apps/api/v2/src/filters/prisma-exception.filter.ts index 4c77c354fd..a92b04171d 100644 --- a/apps/api/v2/src/filters/prisma-exception.filter.ts +++ b/apps/api/v2/src/filters/prisma-exception.filter.ts @@ -2,13 +2,7 @@ import { extractUserContext } from "@/lib/extract-user-context"; import { filterReqHeaders } from "@/lib/filterReqHeaders"; import type { ArgumentsHost, ExceptionFilter } from "@nestjs/common"; import { Catch, HttpStatus, Logger } from "@nestjs/common"; -import { - PrismaClientInitializationError, - PrismaClientKnownRequestError, - PrismaClientRustPanicError, - PrismaClientUnknownRequestError, - PrismaClientValidationError, -} from "@prisma/client/runtime/library"; +import { Prisma } from "@prisma/client"; import { Request } from "express"; import { @@ -21,18 +15,18 @@ import { import { Response } from "@calcom/platform-types"; type PrismaError = - | PrismaClientInitializationError - | PrismaClientKnownRequestError - | PrismaClientRustPanicError - | PrismaClientUnknownRequestError - | PrismaClientValidationError; + | Prisma.PrismaClientInitializationError + | Prisma.PrismaClientKnownRequestError + | Prisma.PrismaClientRustPanicError + | Prisma.PrismaClientUnknownRequestError + | Prisma.PrismaClientValidationError; @Catch( - PrismaClientInitializationError, - PrismaClientKnownRequestError, - PrismaClientRustPanicError, - PrismaClientUnknownRequestError, - PrismaClientValidationError + Prisma.PrismaClientInitializationError, + Prisma.PrismaClientKnownRequestError, + Prisma.PrismaClientRustPanicError, + Prisma.PrismaClientUnknownRequestError, + Prisma.PrismaClientValidationError ) export class PrismaExceptionFilter implements ExceptionFilter { private readonly logger = new Logger("PrismaExceptionFilter"); @@ -58,7 +52,7 @@ export class PrismaExceptionFilter implements ExceptionFilter { let message = "There was an error, please try again later."; let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; let errorCode = INTERNAL_SERVER_ERROR; - if (error instanceof PrismaClientKnownRequestError) { + if (error instanceof Prisma.PrismaClientKnownRequestError) { switch (error.code) { case "P2002": // Unique constraint failed errorCode = CONFLICT; diff --git a/packages/app-store/stripepayment/lib/team-billing.ts b/packages/app-store/stripepayment/lib/team-billing.ts index 514eb0d1ba..046c35b17e 100644 --- a/packages/app-store/stripepayment/lib/team-billing.ts +++ b/packages/app-store/stripepayment/lib/team-billing.ts @@ -1,4 +1,4 @@ -import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; +import { Prisma } from "@prisma/client"; export function getRequestedSlugError(error: unknown, requestedSlug: string) { let message = `Unknown error`; @@ -6,7 +6,7 @@ export function getRequestedSlugError(error: unknown, requestedSlug: string) { // This covers the edge case if an unpublished team takes too long to publish // and another team gets the requestedSlug first. // https://www.prisma.io/docs/reference/api-reference/error-reference#p2002 - if (error instanceof PrismaClientKnownRequestError && error.code === "P2002") { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { statusCode = 400; message = `It seems like the requestedSlug: '${requestedSlug}' is already taken. Please contact support at help@cal.com so we can resolve this issue.`; } else if (error instanceof Error) { diff --git a/packages/features/auth/lib/next-auth-custom-adapter.ts b/packages/features/auth/lib/next-auth-custom-adapter.ts index bb6b61b497..5416c381de 100644 --- a/packages/features/auth/lib/next-auth-custom-adapter.ts +++ b/packages/features/auth/lib/next-auth-custom-adapter.ts @@ -1,5 +1,5 @@ -import type { Account, IdentityProvider, Prisma, User, VerificationToken } from "@prisma/client"; -import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; +import type { Account, IdentityProvider, User, VerificationToken } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import type { Awaitable } from "next-auth"; import type { PrismaClient } from "@calcom/prisma"; @@ -86,7 +86,7 @@ export default function CalComAdapter(prismaClient: PrismaClient): CalComAdapter } catch (error) { // If token already used/deleted, just return null // https://www.prisma.io/docs/reference/api-reference/error-reference#p2025 - if (error instanceof PrismaClientKnownRequestError) { + if (error instanceof Prisma.PrismaClientKnownRequestError) { if (error.code === "P2025") return null; } throw error; diff --git a/packages/prisma/extensions/exclude-locked-users.ts b/packages/prisma/extensions/exclude-locked-users.ts index dce5ae9a20..66a805d5ea 100644 --- a/packages/prisma/extensions/exclude-locked-users.ts +++ b/packages/prisma/extensions/exclude-locked-users.ts @@ -1,5 +1,4 @@ import { Prisma } from "@prisma/client"; -import type { DefaultArgs, InternalArgs } from "@prisma/client/runtime/library"; export function excludeLockedUsersExtension() { return Prisma.defineExtension({ @@ -35,11 +34,11 @@ function safeJSONStringify(x: any) { async function excludeLockedUsers( args: - | Prisma.UserFindUniqueArgs - | Prisma.UserFindFirstArgs - | Prisma.UserFindManyArgs - | Prisma.UserFindUniqueOrThrowArgs - | Prisma.UserFindFirstOrThrowArgs, + | Prisma.UserFindUniqueArgs + | Prisma.UserFindFirstArgs + | Prisma.UserFindManyArgs + | Prisma.UserFindUniqueOrThrowArgs + | Prisma.UserFindFirstOrThrowArgs, query: (args: T) => Promise ) { args.where = args.where || {}; diff --git a/packages/prisma/extensions/exclude-pending-payment-teams.ts b/packages/prisma/extensions/exclude-pending-payment-teams.ts index 64b2b88107..c8491ae8e9 100644 --- a/packages/prisma/extensions/exclude-pending-payment-teams.ts +++ b/packages/prisma/extensions/exclude-pending-payment-teams.ts @@ -1,5 +1,4 @@ import { Prisma } from "@prisma/client"; -import type { DefaultArgs, InternalArgs } from "@prisma/client/runtime/library"; export function excludePendingPaymentsExtension() { return Prisma.defineExtension({ @@ -27,11 +26,11 @@ export function excludePendingPaymentsExtension() { async function excludePendingPayments( args: - | Prisma.TeamFindUniqueArgs - | Prisma.TeamFindFirstArgs - | Prisma.TeamFindManyArgs - | Prisma.TeamFindUniqueOrThrowArgs - | Prisma.TeamFindFirstOrThrowArgs, + | Prisma.TeamFindUniqueArgs + | Prisma.TeamFindFirstArgs + | Prisma.TeamFindManyArgs + | Prisma.TeamFindUniqueOrThrowArgs + | Prisma.TeamFindFirstOrThrowArgs, query: (args: T) => Promise ) { args.where = args.where || {}; diff --git a/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts index c222945015..5d008716a0 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts @@ -1,5 +1,4 @@ -import type { Prisma } from "@prisma/client"; -import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; +import { Prisma } from "@prisma/client"; import { DailyLocationType } from "@calcom/app-store/locations"; import { getDefaultLocations } from "@calcom/lib/server/getDefaultLocations"; @@ -139,7 +138,7 @@ export const createHandler = async ({ ctx, input }: CreateOptions) => { return { eventType }; } catch (e) { console.warn(e); - if (e instanceof PrismaClientKnownRequestError) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { if (e.code === "P2002" && Array.isArray(e.meta?.target) && e.meta?.target.includes("slug")) { throw new TRPCError({ code: "BAD_REQUEST", message: "URL Slug already exists for given user." }); }