prisma-hooks-generator
v1.0.1
Published
Automatically generate type-safe TanStack Query hooks and Next.js server actions from your Prisma schema
Maintainers
Readme
Prisma Hooks Generator
Automatically generate type-safe TanStack Query hooks and Next.js server actions from your Prisma schema.
✨ Features
- 🔄 Full CRUD Operations - Automatically generated hooks for list, get, create, update, and delete
- 🔒 User-Filtered Hooks - Secure
my*hooks that automatically filter byuserId - 🎯 Type-Safe - Full TypeScript support with Prisma types and Zod validation
- 🔍 Filters & Querying - Built-in support for
where,include,select, andorderBy - 📄 Pagination - Offset, cursor, and infinite scroll pagination out of the box
- ⚡ Optimistic Updates - Automatic cache updates with rollback on error
- 🛡️ Server-Side Security - Automatic
userIdinjection and filtering - 🎨 Customizable - Override mutation logic with custom business rules
🚀 Quick Start
1. Install
npm install prisma-hooks-generator
# or
pnpm add prisma-hooks-generator
# or
yarn add prisma-hooks-generator2. Add to Prisma Schema
generator hooks {
provider = "prisma-hooks-generator"
output = "./generated/hooks"
}3. Generate Hooks
npx prisma generate4. Use in Your Components
import { useTodos, useCreateTodo } from './prisma/generated/hooks';
function TodoList() {
const { data, isLoading } = useTodos();
const createTodo = useCreateTodo();
if (isLoading) return <div>Loading...</div>;
return (
<div>
{data?.map(todo => (
<div key={todo.id}>{todo.title}</div>
))}
<button onClick={() => createTodo.mutate({
data: { title: 'New Todo', status: 'TODO' }
})}>
Add Todo
</button>
</div>
);
}📚 Documentation
- Getting Started - Complete setup guide
- Features - Deep dives into all features
- API Reference - Complete API documentation
- Examples - Real-world examples
- Guides - How-to guides
- Best Practices - Tips and patterns
🎯 Basic Usage
List Query
import { useTodos } from './prisma/generated/hooks';
function TodoList() {
const { data, isLoading, error } = useTodos({
where: { status: 'TODO' },
orderBy: { createdAt: 'desc' },
});
// ...
}Get by ID
import { useTodo } from './prisma/generated/hooks';
function TodoDetail({ id }: { id: string }) {
const { data, isLoading } = useTodo(id);
// ...
}Create Mutation
import { useCreateTodo } from './prisma/generated/hooks';
function CreateTodo() {
const createTodo = useCreateTodo();
const handleCreate = () => {
createTodo.mutate({
data: {
title: 'New Todo',
description: 'Description here',
status: 'TODO',
},
});
};
// ...
}User-Filtered Hooks (My*)
Mark a field with /// @userId in your Prisma schema:
model Todo {
id String @id
title String
/// @userId
userId String
}Then use the secure my* hooks:
import { useMyTodos, useCreateMyTodo } from './prisma/generated/hooks';
// Automatically filters by current user's ID
const { data } = useMyTodos();
// Automatically injects userId (server-side security)
const createTodo = useCreateMyTodo();Pagination
// Offset pagination
const { data, pagination } = useTodos({
pagination: { type: 'offset', page: 1, pageSize: 10 }
});
pagination.nextPage();
// Cursor pagination
const { data, pagination } = useTodos({
pagination: { type: 'cursor', take: 10 }
});
pagination.nextPage();
// Infinite scroll
const { data, pagination } = useTodos({
pagination: { type: 'infinite', pageSize: 10 }
});
pagination.fetchNextPage();🔧 Requirements
- Node.js 18+
- Prisma 5.0+
- Next.js 13+ (App Router)
- TanStack Query 5.0+
- next-safe-action 8.0+
📦 What Gets Generated?
prisma/generated/hooks/
├── actions/ # Server actions
│ ├── todo.ts
│ ├── user.ts
│ └── ...
├── hooks/ # React hooks
│ ├── todo.ts
│ ├── user.ts
│ └── ...
├── keys.ts # Query keys
├── types.ts # TypeScript types
└── index.ts # Main exports🎓 Learn More
- Getting Started Guide - Step-by-step tutorial
- Feature Guides - Learn about each feature
- API Reference - Complete API docs
- Examples - Real-world examples
🤝 Contributing
Contributions are welcome! Please read our contributing guidelines first.
📄 License
MIT
🙏 Acknowledgments
Built with:
