Database
Seeders
Populate your database with test data using seeders. Built-in fake data generators and factory patterns.
Test Data
Populate database with realistic test data
Fake Helpers
Built-in generators for names, emails, etc.
Factories
Define reusable data generation patterns
Bulk Creation
Create hundreds of records efficiently
Defining a Seeder
seeders/UserSeeder.ts
1import { defineSeeder, fake } from "canxjs";2import { User } from "./models/User";34defineSeeder("users", async () => {5// Create admin user6await User.create({7name: "Admin User",8email: "admin@example.com",9password: await Bun.password.hash("password"),10role: "admin"11});1213// Create regular users14for (let i = 0; i < 10; i++) {15await User.create({16name: fake.name(),17email: fake.email(),18password: await Bun.password.hash("password"),19role: "user"20});21}22});
Fake Data Helpers
| Method | Output |
|---|---|
| fake.name() | "John Smith" |
| fake.email() | "user@gmail.com" |
| fake.uuid() | UUID v4 string |
| fake.number(min, max) | Random number in range |
| fake.boolean() | true or false |
| fake.date() | Random Date object |
| fake.pick(array) | Random element from array |
fake-data.ts
1import { fake } from "canxjs";23// Generate fake data4const name = fake.name(); // "John Smith"5const email = fake.email(); // "abc123@gmail.com"6const uuid = fake.uuid(); // "550e8400-e29b-41d4-a716-446655440000"7const number = fake.number(1, 100); // Random 1-1008const bool = fake.boolean(); // true or false9const date = fake.date(); // Random Date object10const phone = fake.phone(); // "+1234567890"11const address = fake.address(); // "123 Main St"12const text = fake.paragraph(); // Lorem ipsum...1314// Pick from array15const role = fake.pick(["admin", "user", "guest"]);
Factories
Define reusable data generation patterns with factories.
factories.ts
1import { factory, fake } from "canxjs";2import { User } from "./models/User";3import { Post } from "./models/Post";45// Define a factory6const userFactory = factory(() => ({7name: fake.name(),8email: fake.email(),9role: fake.pick(["admin", "user"]),10is_active: fake.boolean()11}));1213// Create one record14const user = userFactory.create();1516// Create many records17const users = userFactory.createMany(50);1819// Use in seeder20defineSeeder("users", async () => {21const userData = userFactory.createMany(100);2223for (const data of userData) {24await User.create(data);25}26});
Running Seeders
run-seeders.ts
1import { seeder } from "canxjs";23// Run all seeders4await seeder.run();56// Run specific seeder7await seeder.run("users");89// List registered seeders10const list = seeder.list();11console.log(list); // ["users", "posts", "categories"]
CLI Commands
terminal
1# Run all seeders2bunx canx db:seed34# Run specific seeder5bunx canx db:seed --class=users67# List available seeders8bunx canx db:seed --list
Complete Example
seeders/DatabaseSeeder.ts
1import { defineSeeder, fake, factory } from "canxjs";2import { User } from "./models/User";3import { Post } from "./models/Post";4import { Category } from "./models/Category";56// Categories seeder7defineSeeder("categories", async () => {8const categories = ["Technology", "Health", "Travel", "Food", "Sports"];910for (const name of categories) {11await Category.create({ name, slug: name.toLowerCase() });12}13});1415// Users seeder16const userFactory = factory(() => ({17name: fake.name(),18email: fake.email(),19role: "user"20}));2122defineSeeder("users", async () => {23// Admin24await User.create({25name: "Admin",26email: "admin@example.com",27role: "admin"28});2930// Regular users31for (const data of userFactory.createMany(50)) {32await User.create(data);33}34});3536// Posts seeder37defineSeeder("posts", async () => {38const users = await User.all();39const categories = await Category.all();4041for (let i = 0; i < 100; i++) {42await Post.create({43title: `Post ${i + 1}`,44content: fake.paragraph(),45user_id: fake.pick(users).id,46category_id: fake.pick(categories).id47});48}49});