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";
3
4defineSeeder("users", async () => {
5 // Create admin user
6 await User.create({
7 name: "Admin User",
8 email: "admin@example.com",
9 password: await Bun.password.hash("password"),
10 role: "admin"
11 });
12
13 // Create regular users
14 for (let i = 0; i < 10; i++) {
15 await User.create({
16 name: fake.name(),
17 email: fake.email(),
18 password: await Bun.password.hash("password"),
19 role: "user"
20 });
21 }
22});

Fake Data Helpers

MethodOutput
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";
2
3// Generate fake data
4const 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-100
8const bool = fake.boolean(); // true or false
9const date = fake.date(); // Random Date object
10const phone = fake.phone(); // "+1234567890"
11const address = fake.address(); // "123 Main St"
12const text = fake.paragraph(); // Lorem ipsum...
13
14// Pick from array
15const 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";
4
5// Define a factory
6const userFactory = factory(() => ({
7 name: fake.name(),
8 email: fake.email(),
9 role: fake.pick(["admin", "user"]),
10 is_active: fake.boolean()
11}));
12
13// Create one record
14const user = userFactory.create();
15
16// Create many records
17const users = userFactory.createMany(50);
18
19// Use in seeder
20defineSeeder("users", async () => {
21 const userData = userFactory.createMany(100);
22
23 for (const data of userData) {
24 await User.create(data);
25 }
26});

Running Seeders

run-seeders.ts
1import { seeder } from "canxjs";
2
3// Run all seeders
4await seeder.run();
5
6// Run specific seeder
7await seeder.run("users");
8
9// List registered seeders
10const list = seeder.list();
11console.log(list); // ["users", "posts", "categories"]

CLI Commands

terminal
1# Run all seeders
2bunx canx db:seed
3
4# Run specific seeder
5bunx canx db:seed --class=users
6
7# List available seeders
8bunx 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";
5
6// Categories seeder
7defineSeeder("categories", async () => {
8 const categories = ["Technology", "Health", "Travel", "Food", "Sports"];
9
10 for (const name of categories) {
11 await Category.create({ name, slug: name.toLowerCase() });
12 }
13});
14
15// Users seeder
16const userFactory = factory(() => ({
17 name: fake.name(),
18 email: fake.email(),
19 role: "user"
20}));
21
22defineSeeder("users", async () => {
23 // Admin
24 await User.create({
25 name: "Admin",
26 email: "admin@example.com",
27 role: "admin"
28 });
29
30 // Regular users
31 for (const data of userFactory.createMany(50)) {
32 await User.create(data);
33 }
34});
35
36// Posts seeder
37defineSeeder("posts", async () => {
38 const users = await User.all();
39 const categories = await Category.all();
40
41 for (let i = 0; i < 100; i++) {
42 await Post.create({
43 title: `Post ${i + 1}`,
44 content: fake.paragraph(),
45 user_id: fake.pick(users).id,
46 category_id: fake.pick(categories).id
47 });
48 }
49});

Next Steps

Explore advanced features like real-time WebSockets.