start-vibing 2.0.11 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -177
- package/dist/cli.js +19 -2
- package/package.json +42 -42
- package/template/.claude/CLAUDE.md +174 -174
- package/template/.claude/agents/01-orchestration/agent-selector.md +130 -130
- package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -142
- package/template/.claude/agents/01-orchestration/context-manager.md +138 -138
- package/template/.claude/agents/01-orchestration/error-recovery.md +182 -182
- package/template/.claude/agents/01-orchestration/orchestrator.md +114 -114
- package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -141
- package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -121
- package/template/.claude/agents/01-orchestration/workflow-router.md +114 -114
- package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -197
- package/template/.claude/agents/02-typescript/esm-resolver.md +193 -193
- package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -158
- package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -183
- package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -238
- package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -180
- package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -199
- package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -187
- package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -212
- package/template/.claude/agents/02-typescript/zod-validator.md +158 -158
- package/template/.claude/agents/03-testing/playwright-assertions.md +265 -265
- package/template/.claude/agents/03-testing/playwright-e2e.md +247 -247
- package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -234
- package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -256
- package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
- package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -248
- package/template/.claude/agents/03-testing/test-data-generator.md +254 -254
- package/template/.claude/agents/03-testing/tester-integration.md +278 -278
- package/template/.claude/agents/03-testing/tester-unit.md +207 -207
- package/template/.claude/agents/03-testing/vitest-config.md +287 -287
- package/template/.claude/agents/04-docker/container-health.md +255 -255
- package/template/.claude/agents/04-docker/deployment-validator.md +225 -225
- package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -281
- package/template/.claude/agents/04-docker/docker-env-manager.md +235 -235
- package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -241
- package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -208
- package/template/.claude/agents/05-database/database-seeder.md +273 -273
- package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -230
- package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -306
- package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -182
- package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
- package/template/.claude/agents/06-security/auth-session-validator.md +68 -68
- package/template/.claude/agents/06-security/input-sanitizer.md +80 -80
- package/template/.claude/agents/06-security/owasp-checker.md +97 -97
- package/template/.claude/agents/06-security/permission-auditor.md +100 -100
- package/template/.claude/agents/06-security/security-auditor.md +84 -84
- package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -83
- package/template/.claude/agents/07-documentation/api-documenter.md +136 -136
- package/template/.claude/agents/07-documentation/changelog-manager.md +105 -105
- package/template/.claude/agents/07-documentation/documenter.md +76 -76
- package/template/.claude/agents/07-documentation/domain-updater.md +81 -81
- package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
- package/template/.claude/agents/07-documentation/readme-generator.md +135 -135
- package/template/.claude/agents/08-git/branch-manager.md +58 -58
- package/template/.claude/agents/08-git/commit-manager.md +63 -63
- package/template/.claude/agents/08-git/pr-creator.md +76 -76
- package/template/.claude/agents/09-quality/code-reviewer.md +71 -71
- package/template/.claude/agents/09-quality/quality-checker.md +67 -67
- package/template/.claude/agents/10-research/best-practices-finder.md +89 -89
- package/template/.claude/agents/10-research/competitor-analyzer.md +106 -106
- package/template/.claude/agents/10-research/pattern-researcher.md +93 -93
- package/template/.claude/agents/10-research/research-cache-manager.md +76 -76
- package/template/.claude/agents/10-research/research-web.md +98 -98
- package/template/.claude/agents/10-research/tech-evaluator.md +101 -101
- package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -136
- package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -125
- package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -118
- package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -132
- package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -98
- package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -110
- package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -156
- package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -113
- package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -137
- package/template/.claude/agents/12-performance/performance-profiler.md +115 -115
- package/template/.claude/agents/12-performance/query-optimizer.md +124 -124
- package/template/.claude/agents/12-performance/render-optimizer.md +154 -154
- package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -207
- package/template/.claude/agents/13-debugging/debugger.md +149 -149
- package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -141
- package/template/.claude/agents/13-debugging/network-debugger.md +208 -208
- package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -181
- package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -185
- package/template/.claude/agents/14-validation/final-validator.md +93 -93
- package/template/.claude/agents/_backup/analyzer.md +134 -134
- package/template/.claude/agents/_backup/code-reviewer.md +279 -279
- package/template/.claude/agents/_backup/commit-manager.md +219 -219
- package/template/.claude/agents/_backup/debugger.md +280 -280
- package/template/.claude/agents/_backup/documenter.md +237 -237
- package/template/.claude/agents/_backup/domain-updater.md +197 -197
- package/template/.claude/agents/_backup/final-validator.md +169 -169
- package/template/.claude/agents/_backup/orchestrator.md +149 -149
- package/template/.claude/agents/_backup/performance.md +232 -232
- package/template/.claude/agents/_backup/quality-checker.md +240 -240
- package/template/.claude/agents/_backup/research.md +315 -315
- package/template/.claude/agents/_backup/security-auditor.md +192 -192
- package/template/.claude/agents/_backup/tester.md +566 -566
- package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -247
- package/template/.claude/config/README.md +30 -30
- package/template/.claude/config/mcp-config.json +344 -344
- package/template/.claude/config/project-config.json +53 -53
- package/template/.claude/config/quality-gates.json +46 -46
- package/template/.claude/config/security-rules.json +45 -45
- package/template/.claude/config/testing-config.json +164 -164
- package/template/.claude/hooks/SETUP.md +126 -126
- package/template/.claude/hooks/run-hook.ts +176 -176
- package/template/.claude/hooks/stop-validator.ts +914 -824
- package/template/.claude/hooks/user-prompt-submit.ts +886 -886
- package/template/.claude/scripts/mcp-quick-install.ts +151 -151
- package/template/.claude/scripts/setup-mcps.ts +651 -651
- package/template/.claude/settings.json +275 -275
- package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
- package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -431
- package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -295
- package/template/.claude/skills/debugging-patterns/SKILL.md +485 -485
- package/template/.claude/skills/docker-patterns/SKILL.md +555 -555
- package/template/.claude/skills/git-workflow/SKILL.md +454 -454
- package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -499
- package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -327
- package/template/.claude/skills/performance-patterns/SKILL.md +547 -547
- package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
- package/template/.claude/skills/react-patterns/SKILL.md +389 -389
- package/template/.claude/skills/research-cache/SKILL.md +222 -222
- package/template/.claude/skills/shadcn-ui/SKILL.md +511 -511
- package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -465
- package/template/.claude/skills/test-coverage/SKILL.md +467 -467
- package/template/.claude/skills/trpc-api/SKILL.md +434 -434
- package/template/.claude/skills/typescript-strict/SKILL.md +367 -367
- package/template/.claude/skills/zod-validation/SKILL.md +403 -403
- package/template/CLAUDE.md +117 -117
|
@@ -1,273 +1,273 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: database-seeder
|
|
3
|
-
description: 'AUTOMATICALLY invoke when setting up development environment. Triggers: new project, database initialized, test data needed. Creates database seeders with realistic data. PROACTIVELY generates seed data for development and testing.'
|
|
4
|
-
model: haiku
|
|
5
|
-
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
-
skills: mongoose-patterns
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Database Seeder Agent
|
|
10
|
-
|
|
11
|
-
You create database seeders for development and testing.
|
|
12
|
-
|
|
13
|
-
## Seeder Structure
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
scripts/
|
|
17
|
-
└── seed/
|
|
18
|
-
├── index.ts # Main seeder
|
|
19
|
-
├── users.seed.ts # User data
|
|
20
|
-
├── products.seed.ts
|
|
21
|
-
└── utils.ts # Helpers
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Main Seeder
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
// scripts/seed/index.ts
|
|
28
|
-
import mongoose from 'mongoose';
|
|
29
|
-
import { seedUsers } from './users.seed';
|
|
30
|
-
import { seedProducts } from './products.seed';
|
|
31
|
-
import { seedOrders } from './orders.seed';
|
|
32
|
-
|
|
33
|
-
async function seed() {
|
|
34
|
-
console.log('Connecting to database...');
|
|
35
|
-
await mongoose.connect(process.env['MONGODB_URI']!);
|
|
36
|
-
|
|
37
|
-
console.log('Clearing existing data...');
|
|
38
|
-
await Promise.all([
|
|
39
|
-
mongoose.connection.collection('users').deleteMany({}),
|
|
40
|
-
mongoose.connection.collection('products').deleteMany({}),
|
|
41
|
-
mongoose.connection.collection('orders').deleteMany({}),
|
|
42
|
-
]);
|
|
43
|
-
|
|
44
|
-
console.log('Seeding users...');
|
|
45
|
-
const users = await seedUsers();
|
|
46
|
-
console.log(` Created ${users.length} users`);
|
|
47
|
-
|
|
48
|
-
console.log('Seeding products...');
|
|
49
|
-
const products = await seedProducts();
|
|
50
|
-
console.log(` Created ${products.length} products`);
|
|
51
|
-
|
|
52
|
-
console.log('Seeding orders...');
|
|
53
|
-
const orders = await seedOrders(users, products);
|
|
54
|
-
console.log(` Created ${orders.length} orders`);
|
|
55
|
-
|
|
56
|
-
console.log('Seeding complete!');
|
|
57
|
-
await mongoose.disconnect();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
seed().catch((error) => {
|
|
61
|
-
console.error('Seed failed:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## User Seeder
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
// scripts/seed/users.seed.ts
|
|
70
|
-
import { UserModel } from '../../src/models/user.model';
|
|
71
|
-
|
|
72
|
-
interface SeedUser {
|
|
73
|
-
email: string;
|
|
74
|
-
password: string;
|
|
75
|
-
name: string;
|
|
76
|
-
role: 'admin' | 'user' | 'viewer';
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const testUsers: SeedUser[] = [
|
|
80
|
-
// Admin user
|
|
81
|
-
{
|
|
82
|
-
email: 'admin@example.com',
|
|
83
|
-
password: 'Admin123!',
|
|
84
|
-
name: 'Admin User',
|
|
85
|
-
role: 'admin',
|
|
86
|
-
},
|
|
87
|
-
// Regular users
|
|
88
|
-
{
|
|
89
|
-
email: 'user@example.com',
|
|
90
|
-
password: 'User123!',
|
|
91
|
-
name: 'Regular User',
|
|
92
|
-
role: 'user',
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
email: 'viewer@example.com',
|
|
96
|
-
password: 'Viewer123!',
|
|
97
|
-
name: 'Viewer User',
|
|
98
|
-
role: 'viewer',
|
|
99
|
-
},
|
|
100
|
-
];
|
|
101
|
-
|
|
102
|
-
// Generate more users
|
|
103
|
-
function generateUsers(count: number): SeedUser[] {
|
|
104
|
-
return Array.from({ length: count }, (_, i) => ({
|
|
105
|
-
email: `user${i + 1}@example.com`,
|
|
106
|
-
password: 'Password123!',
|
|
107
|
-
name: `Generated User ${i + 1}`,
|
|
108
|
-
role: 'user' as const,
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export async function seedUsers() {
|
|
113
|
-
const allUsers = [...testUsers, ...generateUsers(20)];
|
|
114
|
-
|
|
115
|
-
const created = await UserModel.insertMany(
|
|
116
|
-
allUsers.map((user) => ({
|
|
117
|
-
...user,
|
|
118
|
-
createdAt: randomDate(30),
|
|
119
|
-
isActive: Math.random() > 0.1,
|
|
120
|
-
}))
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
return created;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function randomDate(daysBack: number): Date {
|
|
127
|
-
const date = new Date();
|
|
128
|
-
date.setDate(date.getDate() - Math.floor(Math.random() * daysBack));
|
|
129
|
-
return date;
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Product Seeder
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
// scripts/seed/products.seed.ts
|
|
137
|
-
import { ProductModel } from '../../src/models/product.model';
|
|
138
|
-
|
|
139
|
-
const categories = ['Electronics', 'Clothing', 'Books', 'Home', 'Sports'];
|
|
140
|
-
|
|
141
|
-
const productTemplates = [
|
|
142
|
-
{ name: 'Laptop', category: 'Electronics', minPrice: 500, maxPrice: 2000 },
|
|
143
|
-
{ name: 'Phone', category: 'Electronics', minPrice: 200, maxPrice: 1500 },
|
|
144
|
-
{ name: 'T-Shirt', category: 'Clothing', minPrice: 15, maxPrice: 50 },
|
|
145
|
-
{ name: 'Novel', category: 'Books', minPrice: 10, maxPrice: 30 },
|
|
146
|
-
{ name: 'Chair', category: 'Home', minPrice: 50, maxPrice: 500 },
|
|
147
|
-
];
|
|
148
|
-
|
|
149
|
-
export async function seedProducts() {
|
|
150
|
-
const products = productTemplates.flatMap((template) =>
|
|
151
|
-
Array.from({ length: 10 }, (_, i) => ({
|
|
152
|
-
name: `${template.name} ${i + 1}`,
|
|
153
|
-
category: template.category,
|
|
154
|
-
price: randomBetween(template.minPrice, template.maxPrice),
|
|
155
|
-
stock: randomBetween(0, 100),
|
|
156
|
-
description: `A great ${template.name.toLowerCase()} for everyone.`,
|
|
157
|
-
isActive: Math.random() > 0.1,
|
|
158
|
-
createdAt: randomDate(60),
|
|
159
|
-
}))
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
return ProductModel.insertMany(products);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function randomBetween(min: number, max: number): number {
|
|
166
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## Order Seeder
|
|
171
|
-
|
|
172
|
-
```typescript
|
|
173
|
-
// scripts/seed/orders.seed.ts
|
|
174
|
-
import { ObjectId } from 'mongodb';
|
|
175
|
-
import { OrderModel } from '../../src/models/order.model';
|
|
176
|
-
|
|
177
|
-
interface SeedOrder {
|
|
178
|
-
userId: ObjectId;
|
|
179
|
-
items: Array<{ productId: ObjectId; quantity: number; price: number }>;
|
|
180
|
-
total: number;
|
|
181
|
-
status: 'pending' | 'paid' | 'shipped' | 'delivered';
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export async function seedOrders(users: any[], products: any[]) {
|
|
185
|
-
const orders: SeedOrder[] = [];
|
|
186
|
-
|
|
187
|
-
// Each user gets 0-5 orders
|
|
188
|
-
for (const user of users) {
|
|
189
|
-
const orderCount = Math.floor(Math.random() * 6);
|
|
190
|
-
|
|
191
|
-
for (let i = 0; i < orderCount; i++) {
|
|
192
|
-
const itemCount = Math.floor(Math.random() * 4) + 1;
|
|
193
|
-
const items = Array.from({ length: itemCount }, () => {
|
|
194
|
-
const product = products[Math.floor(Math.random() * products.length)];
|
|
195
|
-
return {
|
|
196
|
-
productId: product._id,
|
|
197
|
-
quantity: Math.floor(Math.random() * 3) + 1,
|
|
198
|
-
price: product.price,
|
|
199
|
-
};
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
203
|
-
|
|
204
|
-
orders.push({
|
|
205
|
-
userId: user._id,
|
|
206
|
-
items,
|
|
207
|
-
total,
|
|
208
|
-
status: ['pending', 'paid', 'shipped', 'delivered'][
|
|
209
|
-
Math.floor(Math.random() * 4)
|
|
210
|
-
] as any,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return OrderModel.insertMany(orders);
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Package.json Script
|
|
220
|
-
|
|
221
|
-
```json
|
|
222
|
-
{
|
|
223
|
-
"scripts": {
|
|
224
|
-
"seed": "bun run scripts/seed/index.ts",
|
|
225
|
-
"seed:fresh": "bun run scripts/seed/index.ts --fresh"
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
## Running Seeder
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
# Seed database
|
|
234
|
-
bun run seed
|
|
235
|
-
|
|
236
|
-
# With environment
|
|
237
|
-
MONGODB_URI=mongodb://localhost:27017/myapp bun run seed
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
## Output Format
|
|
241
|
-
|
|
242
|
-
```markdown
|
|
243
|
-
## Database Seeder
|
|
244
|
-
|
|
245
|
-
### Collections Seeded
|
|
246
|
-
|
|
247
|
-
| Collection | Records | Time |
|
|
248
|
-
| ---------- | ------- | ----- |
|
|
249
|
-
| users | 23 | 150ms |
|
|
250
|
-
| products | 50 | 200ms |
|
|
251
|
-
| orders | 85 | 300ms |
|
|
252
|
-
|
|
253
|
-
### Test Accounts
|
|
254
|
-
|
|
255
|
-
| Email | Password | Role |
|
|
256
|
-
| ----------------- | --------- | ----- |
|
|
257
|
-
| admin@example.com | Admin123! | admin |
|
|
258
|
-
| user@example.com | User123! | user |
|
|
259
|
-
|
|
260
|
-
### Usage
|
|
261
|
-
|
|
262
|
-
\`\`\`bash
|
|
263
|
-
bun run seed
|
|
264
|
-
\`\`\`
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Critical Rules
|
|
268
|
-
|
|
269
|
-
1. **CLEAR FIRST** - Delete before seeding
|
|
270
|
-
2. **TEST ACCOUNTS** - Include known credentials
|
|
271
|
-
3. **REALISTIC DATA** - Varied, representative data
|
|
272
|
-
4. **DETERMINISTIC OPTION** - Seed for reproducible testing
|
|
273
|
-
5. **ENVIRONMENT CHECK** - Prevent seeding production
|
|
1
|
+
---
|
|
2
|
+
name: database-seeder
|
|
3
|
+
description: 'AUTOMATICALLY invoke when setting up development environment. Triggers: new project, database initialized, test data needed. Creates database seeders with realistic data. PROACTIVELY generates seed data for development and testing.'
|
|
4
|
+
model: haiku
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
skills: mongoose-patterns
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Database Seeder Agent
|
|
10
|
+
|
|
11
|
+
You create database seeders for development and testing.
|
|
12
|
+
|
|
13
|
+
## Seeder Structure
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
scripts/
|
|
17
|
+
└── seed/
|
|
18
|
+
├── index.ts # Main seeder
|
|
19
|
+
├── users.seed.ts # User data
|
|
20
|
+
├── products.seed.ts
|
|
21
|
+
└── utils.ts # Helpers
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Main Seeder
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// scripts/seed/index.ts
|
|
28
|
+
import mongoose from 'mongoose';
|
|
29
|
+
import { seedUsers } from './users.seed';
|
|
30
|
+
import { seedProducts } from './products.seed';
|
|
31
|
+
import { seedOrders } from './orders.seed';
|
|
32
|
+
|
|
33
|
+
async function seed() {
|
|
34
|
+
console.log('Connecting to database...');
|
|
35
|
+
await mongoose.connect(process.env['MONGODB_URI']!);
|
|
36
|
+
|
|
37
|
+
console.log('Clearing existing data...');
|
|
38
|
+
await Promise.all([
|
|
39
|
+
mongoose.connection.collection('users').deleteMany({}),
|
|
40
|
+
mongoose.connection.collection('products').deleteMany({}),
|
|
41
|
+
mongoose.connection.collection('orders').deleteMany({}),
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
console.log('Seeding users...');
|
|
45
|
+
const users = await seedUsers();
|
|
46
|
+
console.log(` Created ${users.length} users`);
|
|
47
|
+
|
|
48
|
+
console.log('Seeding products...');
|
|
49
|
+
const products = await seedProducts();
|
|
50
|
+
console.log(` Created ${products.length} products`);
|
|
51
|
+
|
|
52
|
+
console.log('Seeding orders...');
|
|
53
|
+
const orders = await seedOrders(users, products);
|
|
54
|
+
console.log(` Created ${orders.length} orders`);
|
|
55
|
+
|
|
56
|
+
console.log('Seeding complete!');
|
|
57
|
+
await mongoose.disconnect();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
seed().catch((error) => {
|
|
61
|
+
console.error('Seed failed:', error);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## User Seeder
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// scripts/seed/users.seed.ts
|
|
70
|
+
import { UserModel } from '../../src/models/user.model';
|
|
71
|
+
|
|
72
|
+
interface SeedUser {
|
|
73
|
+
email: string;
|
|
74
|
+
password: string;
|
|
75
|
+
name: string;
|
|
76
|
+
role: 'admin' | 'user' | 'viewer';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const testUsers: SeedUser[] = [
|
|
80
|
+
// Admin user
|
|
81
|
+
{
|
|
82
|
+
email: 'admin@example.com',
|
|
83
|
+
password: 'Admin123!',
|
|
84
|
+
name: 'Admin User',
|
|
85
|
+
role: 'admin',
|
|
86
|
+
},
|
|
87
|
+
// Regular users
|
|
88
|
+
{
|
|
89
|
+
email: 'user@example.com',
|
|
90
|
+
password: 'User123!',
|
|
91
|
+
name: 'Regular User',
|
|
92
|
+
role: 'user',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
email: 'viewer@example.com',
|
|
96
|
+
password: 'Viewer123!',
|
|
97
|
+
name: 'Viewer User',
|
|
98
|
+
role: 'viewer',
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
// Generate more users
|
|
103
|
+
function generateUsers(count: number): SeedUser[] {
|
|
104
|
+
return Array.from({ length: count }, (_, i) => ({
|
|
105
|
+
email: `user${i + 1}@example.com`,
|
|
106
|
+
password: 'Password123!',
|
|
107
|
+
name: `Generated User ${i + 1}`,
|
|
108
|
+
role: 'user' as const,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export async function seedUsers() {
|
|
113
|
+
const allUsers = [...testUsers, ...generateUsers(20)];
|
|
114
|
+
|
|
115
|
+
const created = await UserModel.insertMany(
|
|
116
|
+
allUsers.map((user) => ({
|
|
117
|
+
...user,
|
|
118
|
+
createdAt: randomDate(30),
|
|
119
|
+
isActive: Math.random() > 0.1,
|
|
120
|
+
}))
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
return created;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function randomDate(daysBack: number): Date {
|
|
127
|
+
const date = new Date();
|
|
128
|
+
date.setDate(date.getDate() - Math.floor(Math.random() * daysBack));
|
|
129
|
+
return date;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Product Seeder
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// scripts/seed/products.seed.ts
|
|
137
|
+
import { ProductModel } from '../../src/models/product.model';
|
|
138
|
+
|
|
139
|
+
const categories = ['Electronics', 'Clothing', 'Books', 'Home', 'Sports'];
|
|
140
|
+
|
|
141
|
+
const productTemplates = [
|
|
142
|
+
{ name: 'Laptop', category: 'Electronics', minPrice: 500, maxPrice: 2000 },
|
|
143
|
+
{ name: 'Phone', category: 'Electronics', minPrice: 200, maxPrice: 1500 },
|
|
144
|
+
{ name: 'T-Shirt', category: 'Clothing', minPrice: 15, maxPrice: 50 },
|
|
145
|
+
{ name: 'Novel', category: 'Books', minPrice: 10, maxPrice: 30 },
|
|
146
|
+
{ name: 'Chair', category: 'Home', minPrice: 50, maxPrice: 500 },
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
export async function seedProducts() {
|
|
150
|
+
const products = productTemplates.flatMap((template) =>
|
|
151
|
+
Array.from({ length: 10 }, (_, i) => ({
|
|
152
|
+
name: `${template.name} ${i + 1}`,
|
|
153
|
+
category: template.category,
|
|
154
|
+
price: randomBetween(template.minPrice, template.maxPrice),
|
|
155
|
+
stock: randomBetween(0, 100),
|
|
156
|
+
description: `A great ${template.name.toLowerCase()} for everyone.`,
|
|
157
|
+
isActive: Math.random() > 0.1,
|
|
158
|
+
createdAt: randomDate(60),
|
|
159
|
+
}))
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
return ProductModel.insertMany(products);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function randomBetween(min: number, max: number): number {
|
|
166
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Order Seeder
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// scripts/seed/orders.seed.ts
|
|
174
|
+
import { ObjectId } from 'mongodb';
|
|
175
|
+
import { OrderModel } from '../../src/models/order.model';
|
|
176
|
+
|
|
177
|
+
interface SeedOrder {
|
|
178
|
+
userId: ObjectId;
|
|
179
|
+
items: Array<{ productId: ObjectId; quantity: number; price: number }>;
|
|
180
|
+
total: number;
|
|
181
|
+
status: 'pending' | 'paid' | 'shipped' | 'delivered';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export async function seedOrders(users: any[], products: any[]) {
|
|
185
|
+
const orders: SeedOrder[] = [];
|
|
186
|
+
|
|
187
|
+
// Each user gets 0-5 orders
|
|
188
|
+
for (const user of users) {
|
|
189
|
+
const orderCount = Math.floor(Math.random() * 6);
|
|
190
|
+
|
|
191
|
+
for (let i = 0; i < orderCount; i++) {
|
|
192
|
+
const itemCount = Math.floor(Math.random() * 4) + 1;
|
|
193
|
+
const items = Array.from({ length: itemCount }, () => {
|
|
194
|
+
const product = products[Math.floor(Math.random() * products.length)];
|
|
195
|
+
return {
|
|
196
|
+
productId: product._id,
|
|
197
|
+
quantity: Math.floor(Math.random() * 3) + 1,
|
|
198
|
+
price: product.price,
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
203
|
+
|
|
204
|
+
orders.push({
|
|
205
|
+
userId: user._id,
|
|
206
|
+
items,
|
|
207
|
+
total,
|
|
208
|
+
status: ['pending', 'paid', 'shipped', 'delivered'][
|
|
209
|
+
Math.floor(Math.random() * 4)
|
|
210
|
+
] as any,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return OrderModel.insertMany(orders);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Package.json Script
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{
|
|
223
|
+
"scripts": {
|
|
224
|
+
"seed": "bun run scripts/seed/index.ts",
|
|
225
|
+
"seed:fresh": "bun run scripts/seed/index.ts --fresh"
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Running Seeder
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Seed database
|
|
234
|
+
bun run seed
|
|
235
|
+
|
|
236
|
+
# With environment
|
|
237
|
+
MONGODB_URI=mongodb://localhost:27017/myapp bun run seed
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Output Format
|
|
241
|
+
|
|
242
|
+
```markdown
|
|
243
|
+
## Database Seeder
|
|
244
|
+
|
|
245
|
+
### Collections Seeded
|
|
246
|
+
|
|
247
|
+
| Collection | Records | Time |
|
|
248
|
+
| ---------- | ------- | ----- |
|
|
249
|
+
| users | 23 | 150ms |
|
|
250
|
+
| products | 50 | 200ms |
|
|
251
|
+
| orders | 85 | 300ms |
|
|
252
|
+
|
|
253
|
+
### Test Accounts
|
|
254
|
+
|
|
255
|
+
| Email | Password | Role |
|
|
256
|
+
| ----------------- | --------- | ----- |
|
|
257
|
+
| admin@example.com | Admin123! | admin |
|
|
258
|
+
| user@example.com | User123! | user |
|
|
259
|
+
|
|
260
|
+
### Usage
|
|
261
|
+
|
|
262
|
+
\`\`\`bash
|
|
263
|
+
bun run seed
|
|
264
|
+
\`\`\`
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Critical Rules
|
|
268
|
+
|
|
269
|
+
1. **CLEAR FIRST** - Delete before seeding
|
|
270
|
+
2. **TEST ACCOUNTS** - Include known credentials
|
|
271
|
+
3. **REALISTIC DATA** - Varied, representative data
|
|
272
|
+
4. **DETERMINISTIC OPTION** - Seed for reproducible testing
|
|
273
|
+
5. **ENVIRONMENT CHECK** - Prevent seeding production
|