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