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?: {
/** Estate directory (default: "./migrations") */
dir?: string;
/** Estate storage writer. Defaults to filesystem storage at `dir`. */
storage?: MigrationStorageWriter;
};
}
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
client |
VibORMClient |
Yes | - | VibORM client instance |
migrations.dir |
string |
No | "./migrations" |
Estate directory |
migrations.storage |
MigrationStorageWriter |
No | Filesystem writer at dir |
Estate storage writer |
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 { createFsStorageWriter } from "viborm/migrations";
import { client } from "./src/db";
export default defineConfig({
client,
migrations: {
storage: createFsStorageWriter("./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"),
posts: s.toMany(() => post),
});
export const post = s.model({
id: s.string().id(),
title: s.string(),
content: s.string().nullable(),
authorId: s.string(),
author: s.toOne(() => 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