Edge / Serverless
SlintORM works in Cloudflare Workers, Deno Deploy, and Next.js Edge routes. The key constraint: V8 isolates have no filesystem. Generate the schema JSON at build time and pass it in at runtime.
The 3-step pattern
Step 1 — Generate schema at build time
# Step 1: Generate schema files at build time
# Run this in CI or before deploying — NOT at edge runtime
npx slintorm generate
# Creates: src/schema/generated.ts
# src/schema/generated.jsonStep 2 — Import the JSON
// Step 2: Import schema from the generated file
// schema is exported alongside ModelMap from generated.ts
import { schema } from './schema/generated';Step 3 — Initialize with schema option
// Step 3: Initialize with schema option (no filesystem reads)
import ORMManager from 'slintorm/browser';
import { schema } from './schema/generated';
const orm = new ORMManager({
driver: 'postgres',
databaseUrl: process.env.DATABASE_URL!,
schema, // pre-built — no file scanning, no migrate() needed
});Driver support matrix
Next.js Edge Route Handler
app/api/users/route.ts
// app/api/users/route.ts — Next.js Edge Route Handler
import { NextRequest, NextResponse } from 'next/server';
import ORMManager from 'slintorm/browser';
import { schema } from '@/schema/generated';
export const runtime = 'edge';
const orm = new ORMManager({
driver: 'postgres',
databaseUrl: process.env.DATABASE_URL!,
schema,
});
const User = orm.defineModel<User>('users', 'User');
export async function GET(req: NextRequest) {
const users = await User.getAll();
return NextResponse.json(users);
}Cloudflare Worker (with Hyperdrive)
workers.ts
// Cloudflare Worker with Hyperdrive (TCP connection pool)
// workers.ts
import ORMManager from 'slintorm/browser';
import { schema } from './schema/generated';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const orm = new ORMManager({
driver: 'postgres',
// Use Hyperdrive connection string for Cloudflare TCP
databaseUrl: env.HYPERDRIVE.connectionString,
schema,
});
const User = orm.defineModel<User>('users', 'User');
const users = await User.getAll();
return Response.json(users);
},
};
// Note: Direct TCP connections to Postgres/MySQL require Cloudflare Hyperdrive.
// Plain pg/mysql2 will not work in Workers without Hyperdrive.Deno Deploy
main.ts
// Deno Deploy
import ORMManager from 'npm:slintorm/browser';
import { schema } from './schema/generated';
const orm = new ORMManager({
driver: 'postgres',
databaseUrl: Deno.env.get('DATABASE_URL')!,
schema,
});CI/CD migration script
Run migrations in your Node.js CI pipeline before deploying to edge functions. Never call migrate() inside an edge runtime.
scripts/migrate.ts
// scripts/migrate.ts — CI/CD migration script
// Run this in your pipeline before deploying to edge
import ORMManager from 'slintorm'; // Node.js — NOT the edge import
const orm = new ORMManager({
driver: 'postgres',
databaseUrl: process.env.DATABASE_URL!,
dir: './src',
});
await orm.migrate();
console.log('Migrations complete');
process.exit(0);
// package.json scripts:
// "db:migrate": "tsx scripts/migrate.ts"Not available in V8 isolates
// NOT available in edge runtimes (V8 isolates):
// - orm.migrate() (filesystem reads)
// - npx slintorm generate (Node.js only)
// - SQLite driver (native binding)
// - Schema auto-generation (scans .ts files)
// The 'browser' export (slintorm/browser) re-exports only what works in V8:
// - ORMManager class
// - defineModel()
// - All query builder methods
// - Validation
// - Hooks