
Transform your Prisma schema into a fully functional REST API in seconds
Quick Start β’ New Features β’ Examples β’ Report Bug β’ Request Feature
π΄ Before (Manual Setup) | π’ After (This Generator) |
---|---|
π Create mock data manually | π npx prisma generate |
βοΈ Write JSON files by hand | β‘ json-server --watch db.json |
π§ Set up json-server manually | |
π Maintain data consistency | |
π Update when schema changes | |
β Time consuming | β 2 commands to full REST API |
β Error prone | β Realistic data with faker.js |
β Hard to maintain | β Auto-sync with schema changes |
β Inconsistent data | β Customizable data patterns |
Get a fully functional REST API running in under 2 minutes:
npm install prisma-json-server-generator --save-dev
npm install -g json-server
generator json_server {
provider = "prisma-json-server-generator"
}
npx prisma generate # Generate data
json-server --watch db.json --port 3001 # Launch API
Your REST API is now live at http://localhost:3001
GET /users
- List all usersGET /posts
- List all postsPOST /users
- Create user- Full CRUD operations available!
{
"customPatterns": {
"User.email": "{{internet.email}}",
"Product.price": "{{commerce.price}}"
}
} Generate realistic data with 50+ faker patterns |
{
"recordCounts": {
"User": 100,
"Product": 500,
"Order": 1000
}
} Control exactly how much data you need |
// seeds/admins.json
[{
"id": 1,
"role": "admin",
"email": "[email protected]"
}] Load real data then generate additional records |
Prisma Version | Generator Version | Status |
---|---|---|
6.x (Latest) | 0.3.0+ | β Fully Supported |
5.x | 0.2.5+ | β Compatible |
4.x | 0.2.0 - 0.2.4 | |
2.x/3.x | 0.1.2 and lower | β Deprecated |
π Choose your package manager
# npm
npm install prisma-json-server-generator --save-dev
# yarn
yarn add prisma-json-server-generator --dev
# pnpm
pnpm add -D prisma-json-server-generator
Don't forget json-server:
npm install -g json-server
Create prisma/json-server-config.json
:
{
"outputFileName": "api-data.json",
"recordCounts": {
"User": 50,
"Product": 200,
"Category": 10,
"Order": 300
},
"customPatterns": {
"User.email": "{{internet.email}}",
"User.firstName": "{{person.firstName}}",
"User.lastName": "{{person.lastName}}",
"User.avatar": "{{image.avatar}}",
"Product.name": "{{commerce.productName}}",
"Product.price": "{{commerce.price}}",
"Product.description": "{{commerce.productDescription}}",
"Category.name": "{{commerce.department}}",
"Order.status": "{{helpers.arrayElement(['pending', 'shipped', 'delivered'])}}"
},
"seedData": {
"enabled": true,
"seedDataPath": "./seeds/",
"generateAdditionalRecords": true
}
}
Update your schema:
generator json_server {
provider = "prisma-json-server-generator"
config = "./prisma/json-server-config.json"
}
π€ Person Data
{
"User.firstName": "{{person.firstName}}",
"User.lastName": "{{person.lastName}}",
"User.fullName": "{{person.fullName}}",
"User.jobTitle": "{{person.jobTitle}}",
"User.bio": "{{person.bio}}"
}
π Internet & Contact
{
"User.email": "{{internet.email}}",
"User.username": "{{internet.userName}}",
"User.website": "{{internet.url}}",
"User.phone": "{{phone.number}}"
}
ποΈ E-commerce
{
"Product.name": "{{commerce.productName}}",
"Product.price": "{{commerce.price}}",
"Product.department": "{{commerce.department}}",
"Product.material": "{{commerce.productMaterial}}"
}
π Location
{
"Address.street": "{{location.streetAddress}}",
"Address.city": "{{location.city}}",
"Address.country": "{{location.country}}",
"Address.zipCode": "{{location.zipCode}}"
}
Setting up seed data
1. Create seed files:
seeds/
βββ users.json # Admin users, test accounts
βββ categories.json # Product categories
βββ settings.json # App configuration
2. Example seed file (seeds/users.json
):
[
{
"id": 1,
"email": "[email protected]",
"firstName": "Admin",
"lastName": "User",
"role": "ADMIN"
},
{
"id": 2,
"email": "[email protected]",
"firstName": "Demo",
"lastName": "User",
"role": "USER"
}
]
3. Configure in your JSON config:
{
"seedData": {
"enabled": true,
"seedDataPath": "./seeds/",
"generateAdditionalRecords": true
},
"recordCounts": {
"User": 25 // Will generate 23 more (25 - 2 seeds)
}
}
This project uses Vitest for lightning-fast testing:
# Run tests in watch mode
npm test
# Run tests once
npm run test:run
# Generate coverage report
npm run test:coverage
Test Coverage:
- β Configuration validation
- β Faker pattern evaluation
- β Seed data loading
- β Record generation logic
- β Error handling
Option | Description | Type | Default |
---|---|---|---|
output |
Output directory | string |
./generated |
config |
External config file path | string |
null |
generator json_server {
provider = "prisma-json-server-generator"
output = "./api-data"
config = "./my-config.json"
}
Option | Description | Type | Default |
---|---|---|---|
outputFileName |
Generated JSON filename | string |
db.json |
recordCounts |
Records per model | Record<string,number> |
{} |
customPatterns |
Faker patterns | Record<string,string> |
{} |
seedData |
Seed configuration | object |
{} |
πͺ E-commerce Store
Schema:
model User {
id Int @id @default(autoincrement())
email String @unique
firstName String
lastName String
orders Order[]
}
model Product {
id Int @id @default(autoincrement())
name String
price Float
categoryId Int
category Category @relation(fields: [categoryId], references: [id])
}
model Category {
id Int @id @default(autoincrement())
name String
products Product[]
}
model Order {
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id])
total Float
}
Configuration:
{
"recordCounts": {
"User": 100,
"Product": 500,
"Category": 12,
"Order": 1000
},
"customPatterns": {
"User.email": "{{internet.email}}",
"User.firstName": "{{person.firstName}}",
"User.lastName": "{{person.lastName}}",
"Product.name": "{{commerce.productName}}",
"Product.price": "{{commerce.price}}",
"Category.name": "{{commerce.department}}"
}
}
Generated API endpoints:
GET /users
- Customer listGET /products
- Product catalogGET /categories
- Product categoriesGET /orders
- Order history- Full CRUD on all resources
π± Social Media App
Schema:
model User {
id Int @id @default(autoincrement())
username String @unique
email String @unique
avatar String?
bio String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String
imageUrl String?
likes Int @default(0)
authorId Int
author User @relation(fields: [authorId], references: [id])
createdAt DateTime @default(now())
}
Configuration:
{
"recordCounts": {
"User": 200,
"Post": 1000
},
"customPatterns": {
"User.username": "{{internet.userName}}",
"User.email": "{{internet.email}}",
"User.avatar": "{{image.avatar}}",
"User.bio": "{{lorem.sentence}}",
"Post.title": "{{lorem.sentence}}",
"Post.content": "{{lorem.paragraphs}}",
"Post.imageUrl": "{{image.url}}",
"Post.likes": "{{number.int({'min': 0, 'max': 500})}}"
}
}
This project is licensed under the MIT License - see the LICENSE file for details.
Made with β€οΈ by Omar Dulaimi
β Don't forget to star this repo if you found it useful! β