From d97acf0dfc40d77b983fe2f7b05a0c0d11757617 Mon Sep 17 00:00:00 2001 From: Jory Irving Date: Wed, 1 Jul 2026 15:41:53 -0600 Subject: [PATCH] refactor(prisma): tighten the $transaction adapter cast asPrFixQueueClient/asAgentWorkClient wrapped the interactive-transaction callback in a double `as any`, silencing all typechecking on the callback and its return. The only real gap is the tx type (adapter client vs Prisma's TransactionClient), which are structurally compatible for the delegates these callbacks use. Cast the callback once to (tx: Prisma.TransactionClient) and drop the result `as any`, so the transaction's return type T is checked again. Closes #510 --- src/lib/prisma.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 00a3969..164120c 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -1,4 +1,4 @@ -import { PrismaClient } from "@prisma/client"; +import { PrismaClient, Prisma } from "@prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; import { PrFixQueueClient } from "@/lib/pr-fix-queue"; import { AgentWorkClient } from "@/lib/agent-work"; @@ -95,11 +95,17 @@ export function __resetPrismaClientForTests(): void { globalForPrisma.prisma = undefined; } +// The adapter interfaces type the interactive-transaction callback's `tx` as +// the narrowed client (PrFixQueueClient / AgentWorkClient), whereas Prisma types +// it as Prisma.TransactionClient. The two are structurally compatible for the +// model delegates these callbacks actually use; cast the callback once (rather +// than `as any`) so the transaction's return type T is still checked. export function asPrFixQueueClient(client: PrismaClient): PrFixQueueClient { return { prFixQueueItem: client.prFixQueueItem, prFixHistory: client.prFixHistory, - $transaction: (fn) => client.$transaction(fn as any) as any, + $transaction: (fn: (tx: PrFixQueueClient) => Promise): Promise => + client.$transaction(fn as (tx: Prisma.TransactionClient) => Promise), }; } @@ -107,6 +113,7 @@ export function asAgentWorkClient(client: PrismaClient): AgentWorkClient { return { agentWork: client.agentWork, agentWorkHistory: client.agentWorkHistory, - $transaction: (fn) => client.$transaction(fn as any) as any, + $transaction: (fn: (tx: AgentWorkClient) => Promise): Promise => + client.$transaction(fn as (tx: Prisma.TransactionClient) => Promise), }; }