← На главную

@ilbertt/bun-sqlgen: строго типизированные SQL-запросы с проверкой живой схемы

23.06.2026 14:20 · hackernews

@ilbertt/bun-sqlgen добавляет в Bun полностью типизированные SQL-запросы без ORM. Вы пишете обычный Bun.sql — а библиотека сверяет его с живой схемой. Запрос помечается именем: sql.GetUser\...`` — и на месте вызова сразу получается строго типизированная, null-безопасная строка. Никаких ORM, обобщённых типов или ручного описания.

Генератор типов прогоняет каждый запрос против реальной Postgres или SQLite базы — Docker не нужен. Ошибки в колонках или SQL валят сборку, а не продакшен. При этом кодогенерация достаточно быстрая, чтобы перезапускать её при каждом сохранении. Рантайм остаётся на 100% нативным для Bun.

Установка — bun add @ilbertt/bun-sqlgen. Миграции считаются источником истины для схемы. Вы кладёте их в любую папку, например db/migrations/0001_init.sql. Клиент оборачивается через withTypes из пакета:

import { withTypes } from '@ilbertt/bun-sqlgen';
import { SQL } from 'bun';
const sql = withTypes(new SQL(Bun.env.DATABASE_URL!));

Затем помечаете запрос: sql.GetUser\SELECT id, email, display_name FROM users WHERE id = ${id}`— возвращается объект с типом`.

Чтобы сгенерировать декларации типов, запускаете:

bun bun-sqlgen generate 'src/**/*.ts' --migrations db/migrations

Он создаёт файл src/queries.gen.d.ts — его надо закоммитить. Как только он на месте, user.emial превращается в ошибку компиляции, а user.display_name.length помечается как возможно null. Всё это работает на обычном tsc.

Поддерживаются оба диалекта (Postgres, SQLite), nullability override, транзакции и конфигурация. Полный гайд лежит в README. Рабочие проекты — в папке examples/, правила для разработчиков — в CONTRIBUTING.md.

Читать оригинал →