Skip to content
VibORM
Esc
navigateopen⌘Jpreview
On this page

Configuration

Configure VibORM with viborm.config.ts for CLI commands like push and migrate

Config File

Create a viborm.config.ts file in your project root:

import { defineConfig } from "viborm/config";
import { client } from "./src/db";

export default defineConfig({
  client,
});

The client is created in your application code:

import { createClient } from "viborm/pglite";
import * as schema from "./schema";

export const client = createClient({ schema });

Configuration Options

interface VibORMConfig {
  /** VibORM client instance (required) */
  client: VibORMClient;

  /** Migration configuration */
  migrations?: {
    /** Directory for migration files (default: "./migrations") */
    dir?: string;
    /** Name of the migrations tracking table (default: "_viborm_migrations") */
    tableName?: string;
    /** Storage driver for migration files */
    storageDriver?: MigrationStorageDriver;
  };
}
Option Type Required Default Description
client VibORMClient Yes - VibORM client instance
migrations.dir string No "./migrations" Directory for migration files
migrations.tableName string No "_viborm_migrations" Name of the migrations tracking table
migrations.storageDriver MigrationStorageDriver No Filesystem Storage driver for migration files

Database Drivers

VibORM ships a driver per database library (viborm/pg, viborm/postgres, viborm/sqlite3, viborm/pglite, and more) — see Drivers for the full list and their options.

Migration Storage

By default, VibORM uses filesystem storage for migration files. You can configure the storage driver explicitly:

import { defineConfig } from "viborm/config";
import { createFsStorageDriver } from "viborm/migrations/storage/fs";
import { client } from "./src/db";

export default defineConfig({
  client,
  migrations: {
    // Explicit filesystem storage
    storageDriver: createFsStorageDriver("./migrations"),
    // Or just use dir (creates filesystem storage automatically)
    // dir: "./migrations",
    tableName: "_viborm_migrations",
  },
});

Schema Export

Your schema file should export all your models:

import { s } from "viborm";

// Define enums with explicit names for reuse
export const Status = s.enum(["PENDING", "ACTIVE", "INACTIVE"]).name("status");

// Define models
export const user = s.model({
  id: s.string().id(),
  name: s.string(),
  email: s.string().unique(),
  status: Status.default("PENDING"),
});

export const post = s.model({
  id: s.string().id(),
  title: s.string(),
  content: s.string().nullable(),
  authorId: s.string(),
  author: s.manyToOne(() => user).fields("authorId").references("id"),
});

Then import it when creating your client:

import { createClient } from "viborm/pg";
import * as schema from "./schema";
// schema = { Status, user, post }

// VibORM extracts only the model definitions
export const client = createClient({
  schema,
  databaseUrl: process.env.DATABASE_URL,
});

Environment Variables

Use environment variables for sensitive configuration:

import { createClient } from "viborm/pg";
import * as schema from "./schema";

export const client = createClient({
  schema,
  databaseUrl: process.env.DATABASE_URL,
});

If a URL isn’t enough, every driver also accepts an options object with library-specific settings (host, port, ssl, pool size, …) — see Drivers.

DATABASE_URL=postgresql://user:password@localhost:5432/mydb

Running the CLI

The CLI automatically loads your config file:

# Using bun (recommended for TypeScript)
bun viborm push

# Using npx with tsx
npx tsx node_modules/.bin/viborm push

# With custom config path
bun viborm push --config ./config/viborm.config.ts

Multiple Environments

For different environments, you can use environment variables or multiple config files:

import { createClient } from "viborm/pg";
import * as schema from "./schema";

const isProduction = process.env.NODE_ENV === "production";

export const client = createClient({
  schema,
  databaseUrl: isProduction
    ? process.env.DATABASE_URL
    : "postgresql://localhost:5432/mydb_dev",
});
import { defineConfig } from "viborm/config";
import { client } from "./src/db";

const isProduction = process.env.NODE_ENV === "production";

export default defineConfig({
  client,
  migrations: {
    dir: "./migrations",
    tableName: isProduction ? "_migrations" : "_viborm_migrations",
  },
});
import { createClient } from "viborm/pglite";
import * as schema from "./schema";

export const client = createClient({ schema });
import { createClient } from "viborm/pg";
import * as schema from "./schema";

export const client = createClient({
  schema,
  databaseUrl: process.env.DATABASE_URL,
});
import { defineConfig } from "viborm/config";
import { client } from "./src/db.dev";

export default defineConfig({ client });
import { defineConfig } from "viborm/config";
import { client } from "./src/db.prod";

export default defineConfig({ client });
# Development
bun viborm push --config viborm.config.dev.ts

# Production
bun viborm push --config viborm.config.prod.ts

Next Steps

Was this page helpful?