Hi HN, TypeSQL parses Postgres SQL string literals inside TypeScript's type system, so you get the exact row and parameter types with no codegen and no database connection. A misspelled column is a compile error.
const q = sql("SELECT id, email FROM users WHERE id = $1", 7);
// Query<{ id: number; email: string }, [number | null]>
It handles joins with correct nullability, CTEs, subqueries, window functions, INSERT/UPDATE/DELETE with RETURNING, and DDL. At runtime it's a 3.8 KB wrapper for pg or postgres.js, and it can take your schema from Kysely, Drizzle or Prisma.
It needs TypeScript 7 and only supports Postgres. Each extra query adds about 6 ms of compile time (numbers in the README).
Feedback is welcome, especially queries you think should type-check but don't.
Hey that's quite neat! Prisma (and others) compatibility is a good idea, and I can see it being merged directly into bigger projects. Maybe you could split your project, with a core project that can be used directly by other ORMs, and a standalone project that depends on your core.
3 comments
[ 0.14 ms ] story [ 15.5 ms ] threadIt handles joins with correct nullability, CTEs, subqueries, window functions, INSERT/UPDATE/DELETE with RETURNING, and DDL. At runtime it's a 3.8 KB wrapper for pg or postgres.js, and it can take your schema from Kysely, Drizzle or Prisma.
It needs TypeScript 7 and only supports Postgres. Each extra query adds about 6 ms of compile time (numbers in the README).
Feedback is welcome, especially queries you think should type-check but don't.