SlintORM
Docsnpm

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.json

Step 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

RuntimeSQLitePostgresMySQLMongoDB
Node.js✓ better-sqlite3 / sqlite3✓ pg✓ mysql2✓ mongodb
Next.js (Node)✓ (serverExternalPackages)✓ pg✓ mysql2✓ mongodb
Next.js Edge✓ pg (Neon)✓ mysql2HTTP API only
Cloudflare Workers✓ via Hyperdrive✓ via HyperdriveHTTP API only
Deno Deploy✓ pgHTTP API only

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
PreviousCLINextEdge Features