Working with Client Extensions

1. Creating Client Extensions

const xprisma = prisma.$extends({
  name: "audited",
  query: {
    $allModels: {
      async $allOperations({ model, operation, args, query }) {
        const start = Date.now();
        const res = await query(args);
        console.log(`${model}.${operation}: ${Date.now() - start}ms`);
        return res;
      }
    }
  }
});
SectionUse
queryIntercept operations
modelAdd custom methods
resultAdd computed fields
clientAdd top-level methods

2. Adding Custom Model Methods

const xprisma = prisma.$extends({
  model: {
    user: {
      async findByEmail(email: string) {
        return prisma.user.findUnique({ where: { email } });
      }
    }
  }
});
await xprisma.user.findByEmail("a@b.io");
AspectDetail
ScopePer model or $allModels
InheritsOriginal API still available

3. Implementing Query Extensions

HookUse
$allOperationsAll actions across models
findManySingle action override
createWrap inserts

4. Using Result Extensions

const xprisma = prisma.$extends({
  result: {
    user: {
      fullName: {
        needs: { firstName: true, lastName: true },
        compute(u) { return `${u.firstName} ${u.lastName}`; }
      }
    }
  }
});
AspectDetail
needsAuto-select dependencies
computeDerived field

5. Creating Reusable Extensions

import { Prisma } from "@prisma/client";
export const softDelete = Prisma.defineExtension({ name: "softDelete", model: { /* ... */ } });
const xprisma = prisma.$extends(softDelete);
HelperUse
Prisma.defineExtensionType-safe reusable factory

6. Composing Multiple Extensions

AspectDetail
Chainprisma.$extends(a).$extends(b)
ConflictsLast extension wins on name collisions

7. Using Community Extensions

PackageUse
@prisma/extension-accelerateEdge caching
@prisma/extension-pulseReal-time subscriptions
prisma-extension-soft-deleteSoft delete
prisma-extension-paginationCursor helpers

8. Testing Custom Extensions

TipDetail
Unit testMock query function
Integration testReal DB + transaction rollback

9. Publishing Extension Packages

StepDetail
Use defineExtensionFor typed re-use
Peer deps@prisma/client
DocsDocument required schema fields

10. Managing Extension Lifecycle

AspectDetail
Singleton-friendlyExtend once, reuse client
Hot reloadRe-apply on dev client recreation