Type-safe schema generator, part IV
Well, it's good enough for my current needs.
I can generate typed CRUD operations for the style of queries that I'm writing.
Supports SELECT
, UPDATE
, INSERT
, and DELETE
, with JOIN
s (automatically makes fields nullable for OUTER JOIN
s). Aliased columns, COUNT
, SELECT * ...
and RETURNING
.
Uses nominal types for primary and foreign keys.
For the following query
INSERT INTO
users AS u (
telegram_id,
first_name,
last_name,
username,
photo_url
)
VALUES
(
$telegram_id,
$first_name,
$last_name,
$username,
$photo_url
)
ON CONFLICT(telegram_id) DO
UPDATE
SET
first_name = excluded.first_name,
last_name = excluded.last_name,
username = excluded.username,
photo_url = excluded.photo_url
RETURNING *;
Output looks roughly like this
import type { Brand } from "../../brand.ts";
import Database from "bun:sqlite";
// This file is automatically generated and should not be edited by hand
type MakeBunHappy = Record<string, never>;
export type UserUserId = Brand<number, 'user:user_id'>;
export interface UpsertUserInput {
readonly $telegram_id: number;
readonly $first_name: string;
readonly $last_name: string;
readonly $username: string;
readonly $photo_url: string;
}
export interface UpsertUserOutput {
readonly user_id: UserUserId;
readonly telegram_id: number;
readonly first_name: string;
readonly last_name: string;
readonly username: string;
readonly photo_url: string;
readonly approved: number;
}
export function getUpsertUserQuery(connection: Database) {
return connection.query<UpsertUserOutput, UpsertUserInput & MakeBunHappy>(`... query text here ...`);
}
❯ cloc .
11 text files.
11 unique files.
0 files ignored.
github.com/AlDanial/cloc v 1.90 T=0.02 s (603.6 files/s, 44449.2 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
TypeScript 11 79 4 727
-------------------------------------------------------------------
Not too bad...
It's too crusty to be published – but if you're interested drop me a line.