Client Extensions
Client extensions allow you to add custom functionality to Prisma Client in a type-safe way.What are Extensions?
Extensions let you:- Add custom model methods
- Add custom client methods
- Add computed fields to results
- Modify queries before execution
- Transform results after execution
Creating Extensions
Use$extends() to create an extended client:
/home/daytona/workspace/source/packages/client/src/runtime/core/extensions/$extends.ts:8-20
Extension Types
Model Extensions
Add custom methods to specific models:this context:
Inside model methods, this refers to the model:
Client Extensions
Add methods to the client itself:Query Extensions
Modify queries before they execute:Result Extensions
Add computed fields to query results:Combining Extensions
Extensions can include multiple types:Chaining Extensions
Extensions can be chained:Defining Reusable Extensions
Create reusable extension functions:/home/daytona/workspace/source/packages/client/src/runtime/core/extensions/defineExtension.ts:4-10
Parameterized extensions:
Extension Context
Access extension context information:/home/daytona/workspace/source/packages/client/src/runtime/core/extensions/getExtensionContext.ts
Practical Examples
Soft Delete Extension
Pagination Extension
JSON Field Extension
Audit Log Extension
Extensions vs Middleware
Use extensions when:- Adding custom methods to models or client
- Adding computed fields to results
- Need type-safe APIs
- Want to compose functionality
- Need model-specific behavior
- Intercepting ALL queries globally
- Order of execution is critical
- Need access to low-level query params
- Simple logging or monitoring
Limitations
No Access to Original Client
Extensions receive a modified client, not the original:Result Extensions Require Fields
Computed fields only work when needed fields are selected:Next Steps
Middleware
Compare with middleware approach
Error Handling
Handle errors in extensions