release notes
release notes
Published 4/28/2026
Contains breaking changes#16289 5d580c0 Thanks @maxmalkin! - Adds a new getDbError() helper exported from astro:db. It walks the error .cause chain and returns the underlying LibsqlError, or undefined if the error did not originate from libSQL. This is needed because drizzle-orm 0.44+ wraps query errors in a DrizzleQueryError whose .cause is the real LibsqlError.
Code that reads .code or .message after catching a database error should migrate from isDbError() to getDbError():
// Before
import { isDbError } from 'astro:db';
try {
await db.insert(MyTable).values({ ... });
} catch (e) {
if (isDbError(e)) {
console.error(e.code, e.message);
}
}
// After
import { getDbError } from 'astro:db';
try {
await db.insert(MyTable).values({ ... });
} catch (e) {
const dbError = getDbError(e);
if (dbError) {
console.error(dbError.code, dbError.message);
}
}
isDbError() is still exported and still returns true for wrapped errors, but its return type is now boolean instead of the err is LibsqlError type predicate. Code that relied on the narrowing to access .code or .message directly will now produce a TypeScript error pointing you to getDbError().
5d580c0 Thanks @maxmalkin! - Fixes a SQL injection vulnerability by updating drizzle-orm to ^0.45.2, patching GHSA-gpj5-g38j-94v9 (CVE-2026-39356).release notes
Published 4/28/2026
Contains breaking changes#16289 5d580c0 Thanks @maxmalkin! - Adds a new getDbError() helper exported from astro:db. It walks the error .cause chain and returns the underlying LibsqlError, or undefined if the error did not originate from libSQL. This is needed because drizzle-orm 0.44+ wraps query errors in a DrizzleQueryError whose .cause is the real LibsqlError.
Code that reads .code or .message after catching a database error should migrate from isDbError() to getDbError():
// Before
import { isDbError } from 'astro:db';
try {
await db.insert(MyTable).values({ ... });
} catch (e) {
if (isDbError(e)) {
console.error(e.code, e.message);
}
}
// After
import { getDbError } from 'astro:db';
try {
await db.insert(MyTable).values({ ... });
} catch (e) {
const dbError = getDbError(e);
if (dbError) {
console.error(dbError.code, dbError.message);
}
}
isDbError() is still exported and still returns true for wrapped errors, but its return type is now boolean instead of the err is LibsqlError type predicate. Code that relied on the narrowing to access .code or .message directly will now produce a TypeScript error pointing you to getDbError().
5d580c0 Thanks @maxmalkin! - Fixes a SQL injection vulnerability by updating drizzle-orm to ^0.45.2, patching GHSA-gpj5-g38j-94v9 (CVE-2026-39356).The web framework for content-driven websites. ⭐️ Star to support our work!