Introduction
UnrealORM
Section titled “UnrealORM”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.
Quick Start
Section titled “Quick Start”bunx @unreal-orm/cli init
# Or with other package managersnpx @unreal-orm/cli initpnpm dlx @unreal-orm/cli inityarn dlx @unreal-orm/cli initThis 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
# Using bunbun add unreal-orm@latest surrealdb@alphabun add -D @unreal-orm/cli@latest
# Using pnpmpnpm add unreal-orm@latest surrealdb@alphapnpm add -D @unreal-orm/cli@latest
# Using npmnpm install unreal-orm@latest surrealdb@alphanpm install -D @unreal-orm/cli@latest
# Using yarnyarn add unreal-orm@latest surrealdb@alphayarn add -D @unreal-orm/cli@latestFeatures
Section titled “Features”- 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 withunreal pull - Relations — Typed record links with automatic hydration via
fetch - Native SurrealQL — Use
surqltemplates 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 tools —
init,pull,push,diff,mermaidfor schema management
Example
Section titled “Example”import { Surreal, surql } from "surrealdb";import Table, { Field, Index, applySchema } from "unreal-orm";
// Define a User model with validation and custom methodsclass 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 indexconst idx_user_email = Index.define(() => User, { name: "idx_user_email", fields: ["email"], unique: true,});
// Define a Post with a relation to Userclass 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:
unreal init # Initialize project with connection and sample tablesunreal pull # Generate TypeScript models from database schemaunreal push # Apply TypeScript schema to databaseunreal diff # Compare code vs database schemaunreal mermaid # Generate ERD diagramunreal view # Interactive TUI for browsing/editing recordsAfter init, the CLI is installed as a dev dependency and can be run via bunx unreal or npx unreal.
Documentation
Section titled “Documentation”- Getting Started — Installation and setup
- Hands-on Tutorial — Build a blog API step-by-step
- Capabilities — Supported SurrealDB features
- API Reference — Full API documentation
- Migration Guide — Upgrading from 0.x
Community
Section titled “Community”- 💬 GitHub Discussions — Questions & ideas
- 🐛 Issues — Bug reports
- 🤝 Contributing — How to contribute
- ⭐ Star on GitHub — Show support
- ☕ Ko-fi — Buy me a coffee
Author
Section titled “Author”UnrealORM is created and maintained by Jimpex.