Skip to main content

Database Mode

Fakelab can persist generated mock data to a local database. This is useful for testing CRUD operations, maintaining state across development sessions, and simulating real database behavior.

Overview

Under the hood, Fakelab uses the lightweight lowdb library for persistence, ensuring:

  • Fast reads and writes
  • Simple JSON storage
  • Zero external dependencies

Enabling Database Mode

Enable database mode in your configuration:

// fakelab.config.ts
import { defineConfig } from "fakelab";

export default defineConfig({
sourcePath: ["./fixtures"],
database: { enabled: true },
});

Basic Usage

Getting Data

import { database } from "fakelab/browser";

const users = await database.get("User");
console.log(users);

Inserting Data

import { database } from "fakelab/browser";

// Insert a single User
await database.post("User");

// Insert multiple Users
await database.post("User", 10);

Database Seeding

Database seeding allows you to initialize your database with mock data.

Seed Options

type SeedOptions = {
count?: number;
strategy?: "reset" | "once" | "merge";
};
OptionTypeDescription
countnumberNumber of records to generate
strategyreset, once, mergeDefines how seeding interacts with existing database data. Default is reset

Seed Strategies

reset (Default)

Removes all existing data and recreates it from scratch.

import { database } from "fakelab/browser";

await database.seed("User", {
count: 10,
strategy: "reset",
});

once

Seeds data only if the database is empty. Useful for initial setup.

import { database } from "fakelab/browser";

await database.seed("User", {
count: 10,
strategy: "once",
});

merge

Inserts new records and updates existing ones. The total number of items per table is limited to 1000 records.

import { database } from "fakelab/browser";

await database.seed("User", {
count: 5,
strategy: "merge",
});

Flushing Data

Clear all data from a specific table:

import { database } from "fakelab/browser";

await database.flush("User");

Complete Example

import { database } from "fakelab/browser";
import type { User } from "./types/user";

// Seed initial data
await database.seed("User", {
count: 10,
strategy: "reset",
});

// Get all users
const users = await database.get<User[]>("User");
console.log("All users:", users);

// Add a new user
await database.post("User");
const updatedUsers = await database.get<User[]>("User");
console.log("Updated users:", updatedUsers);

// Clear all users
await database.flush("User");
const emptyUsers = await database.get<User[]>("User");
console.log("After flush:", emptyUsers); // []

Database Storage

The database is stored as a JSON file in your project directory. The default location is:

.fakelab/db

This file is automatically created when database mode is enabled and data is inserted.

Use Cases

Testing CRUD Operations

// Create
await database.post("User");

// Read
const users = await database.get("User");

// Update (via merge strategy)
await database.seed("User", { count: 1, strategy: "merge" });

// Delete (flush)
await database.flush("User");

Maintaining State

Database mode allows you to maintain state across server restarts, making it perfect for:

  • Testing stateful applications
  • Simulating real database behavior
  • Debugging data flow issues

Development Workflow

// On app startup
await database.seed("User", {
count: 20,
strategy: "once", // Only seed if empty
});

// During development, data persists
// You can modify data and it will remain until flushed

Best Practices

  1. Use once strategy for initial seeding - Prevents overwriting data on every app start
  2. Flush before tests - Ensure clean state for each test run
  3. Limit merge operations - Remember the 1000 record limit per table
  4. Commit database file to git - For consistent development environments (optional)