Skip to main content

Configuration

Complete reference for ORM configuration options.

Config Interface

import type { Config } from "@casekit/orm";

const config = {
models: { /* ... */ },
// ... other options
} satisfies Config;

Options

models (required)

Object containing all model definitions:

import { author, book, tag } from "./models";

const config = {
models: { author, book, tag },
} satisfies Config;

schema

Default PostgreSQL schema for all models:

const config = {
models,
schema: "public", // Default: undefined (uses PostgreSQL default)
} satisfies Config;

Individual models can override this with their own schema property.

connection

PostgreSQL connection configuration:

const config = {
models,
connection: {
host: "localhost",
port: 5432,
database: "myapp",
user: "postgres",
password: "password",
ssl: true, // or { rejectUnauthorized: false }
},
} satisfies Config;

Or use a connection string:

const config = {
models,
connection: {
connectionString: "postgresql://user:pass@host:5432/db",
},
} satisfies Config;

pool

Enable connection pooling:

const config = {
models,
pool: true, // Default: true
} satisfies Config;

With pool options:

const config = {
models,
connection: {
database: "myapp",
max: 20, // Max connections
idleTimeoutMillis: 30000, // Close idle connections after 30s
connectionTimeoutMillis: 2000, // Connection timeout
},
pool: true,
} satisfies Config;

naming

Transform field and model names for database columns/tables:

import { snakeCase } from "es-toolkit";

const config = {
models,
naming: {
column: snakeCase, // authorId → author_id
table: snakeCase, // userProfile → user_profile
},
} satisfies Config;

extensions

PostgreSQL extensions to create:

const config = {
models,
extensions: ["uuid-ossp", "pg_trgm"],
} satisfies Config;

Extensions are created in each schema when running db push.

operators

Custom WHERE operators:

import { sql } from "@casekit/sql";

const $contains = Symbol("contains");

const config = {
models,
operators: {
where: {
[$contains]: (meta, value) =>
sql`${meta.column} @> ${value}`,
},
},
} satisfies Config;

// Usage
const posts = await db.findMany("post", {
select: ["id", "title"],
where: {
tags: { [$contains]: ["typescript", "orm"] },
},
});

logger

Custom logger for query debugging:

const config = {
models,
logger: {
debug: (...args) => console.debug(...args),
info: (...args) => console.info(...args),
warn: (...args) => console.warn(...args),
error: (...args) => console.error(...args),
},
} satisfies Config;

Or use pino:

import pino from "pino";

const config = {
models,
logger: pino({ level: "debug" }),
} satisfies Config;

Environment-Based Configuration

const config = {
models,
connection: {
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT || "5432"),
database: process.env.DB_NAME || "myapp",
user: process.env.DB_USER || "postgres",
password: process.env.DB_PASSWORD || "password",
},
pool: process.env.NODE_ENV === "production",
} satisfies Config;

Complete Example

import { orm, type Config } from "@casekit/orm";
import { sql } from "@casekit/sql";
import { snakeCase } from "es-toolkit";
import pino from "pino";
import * as models from "./models";

const $arrayContains = Symbol("arrayContains");

const config = {
schema: "app",
models,
connection: {
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT || "5432"),
database: process.env.DB_NAME || "myapp",
user: process.env.DB_USER || "postgres",
password: process.env.DB_PASSWORD,
ssl: process.env.NODE_ENV === "production",
max: 20,
},
pool: true,
naming: {
column: snakeCase,
table: snakeCase,
},
extensions: ["uuid-ossp"],
operators: {
where: {
[$arrayContains]: (meta, value) =>
sql`${meta.column} @> ${value}`,
},
},
logger: pino({
level: process.env.LOG_LEVEL || "info"
}),
} as const satisfies Config;

export const db = orm(config);