Skip to content
🚀 This documentation is for unreal-orm 1.0.0 alpha which requires SurrealDB 2.0 alpha SDK. For the stable version, see npm.

Introduction

Unreal ORM Logo

GitHub Stars npm version License: ISC npm downloads TypeScript


A modern, type-safe ORM for SurrealDB. Native SurrealDB power, full TypeScript safety, zero abstraction—no decorators, no magic, just classes and functions.

UnrealORM builds on top of the official surrealdb package, providing a TypeScript ORM experience while preserving full access to SurrealDB’s native features. Define your schema once in code, and the ORM handles type inference, DDL generation, and schema synchronization.

Note: UnrealORM 1.0.0-alpha.x requires SurrealDB’s 2.0 (alpha) JS SDK. If you’re using 1.x of their SDK, install unreal-orm@0.6.0 instead. To upgrade, see the Migration Guide.

Terminal window
bunx @unreal-orm/cli init
# Or with other package managers
npx @unreal-orm/cli init
pnpm dlx @unreal-orm/cli init
yarn dlx @unreal-orm/cli init

This will:

  • Set up your project structure (unreal/ folder)
  • Configure database connection (surreal.ts)
  • Install dependencies (unreal-orm, surrealdb, @unreal-orm/cli)
  • Optionally generate sample tables or import from existing database
Manual installation
Terminal window
# Using bun
bun add unreal-orm@latest surrealdb@alpha
bun add -D @unreal-orm/cli@latest
# Using pnpm
pnpm add unreal-orm@latest surrealdb@alpha
pnpm add -D @unreal-orm/cli@latest
# Using npm
npm install unreal-orm@latest surrealdb@alpha
npm install -D @unreal-orm/cli@latest
# Using yarn
yarn add unreal-orm@latest surrealdb@alpha
yarn add -D @unreal-orm/cli@latest
  • Type-safe models — Define tables as classes with full TypeScript inference for fields, queries, and results
  • Schema sync — Generate DDL from code with applySchema(), or generate code from database with unreal pull
  • Relations — Typed record links with automatic hydration via fetch
  • Native SurrealQL — Use surql templates and functional expressions directly in queries and field definitions
  • Indexes — Define unique, composite, and search indexes with full type safety
  • Custom methods — Add instance and static methods to your models
  • CLI toolsinit, pull, push, diff, mermaid for schema management
import { Surreal, surql } from "surrealdb";
import Table, { Field, Index, applySchema } from "unreal-orm";
// Define a User model with validation and custom methods
class User extends Table.normal({
name: "user",
fields: {
name: Field.string(),
email: Field.string({ assert: surql`$value CONTAINS "@"` }),
createdAt: Field.datetime({ default: surql`time::now()` }),
},
}) {
getDisplayName() {
return `${this.name} <${this.email}>`;
}
}
// Define a unique index
const idx_user_email = Index.define(() => User, {
name: "idx_user_email",
fields: ["email"],
unique: true,
});
// Define a Post with a relation to User
class Post extends Table.normal({
name: "post",
fields: {
title: Field.string(),
content: Field.string(),
author: Field.record(() => User),
},
}) {}
async function main() {
const db = new Surreal();
await db.connect("ws://localhost:8000");
await db.signin({ username: "root", password: "root" });
await db.use({ namespace: "test", database: "test" });
// Apply schema to database
await applySchema(db, [User, idx_user_email, Post]);
// Create records
const user = await User.create(db, {
name: "Alice",
email: "alice@example.com",
});
const post = await Post.create(db, {
title: "Hello",
content: "World",
author: user.id,
});
// Query with hydrated relations
const result = await Post.select(db, {
from: post.id,
only: true,
fetch: ["author"],
});
console.log(result.author.getDisplayName()); // "Alice <alice@example.com>"
// Update with explicit mode
await user.update(db, { data: { name: "Alice Smith" }, mode: "merge" });
await db.close();
}

See the Hands-on Tutorial for a complete walkthrough building a blog API with users, posts, comments, and relations.

The CLI helps manage schema synchronization between your code and database:

Terminal window
unreal init # Initialize project with connection and sample tables
unreal pull # Generate TypeScript models from database schema
unreal push # Apply TypeScript schema to database
unreal diff # Compare code vs database schema
unreal mermaid # Generate ERD diagram
unreal view # Interactive TUI for browsing/editing records

After init, the CLI is installed as a dev dependency and can be run via bunx unreal or npx unreal.

UnrealORM is created and maintained by Jimpex.

ISC License