From a2eab58dde0b41628d7d0adf0bb98d59a3ba4db6 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Sun, 9 Aug 2026 09:51:30 -0300 Subject: [PATCH] fix(types): expose SQLite transaction state (#9848) Co-authored-by: backryun --- src/lib/db/adapters/betterSqliteAdapter.ts | 4 ++++ src/lib/db/adapters/types.ts | 2 ++ tests/unit/db-adapters/betterSqliteAdapter.test.ts | 12 ++++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/lib/db/adapters/betterSqliteAdapter.ts b/src/lib/db/adapters/betterSqliteAdapter.ts index 899ae99d49..20290d345d 100644 --- a/src/lib/db/adapters/betterSqliteAdapter.ts +++ b/src/lib/db/adapters/betterSqliteAdapter.ts @@ -12,6 +12,10 @@ export function createBetterSqliteAdapter(db: import("better-sqlite3").Database) return db.name; }, + get inTransaction() { + return db.inTransaction; + }, + prepare(sql: string): PreparedStatement { const stmt = db.prepare(sql); return { diff --git a/src/lib/db/adapters/types.ts b/src/lib/db/adapters/types.ts index 41e049b203..76cbb90327 100644 --- a/src/lib/db/adapters/types.ts +++ b/src/lib/db/adapters/types.ts @@ -13,6 +13,8 @@ export interface SqliteAdapter { readonly driver: "better-sqlite3" | "node:sqlite" | "bun:sqlite" | "sql.js"; readonly open: boolean; readonly name: string; + /** Driver transaction state when exposed by the underlying SQLite implementation. */ + readonly inTransaction?: boolean; prepare(sql: string): PreparedStatement; exec(sql: string): void; diff --git a/tests/unit/db-adapters/betterSqliteAdapter.test.ts b/tests/unit/db-adapters/betterSqliteAdapter.test.ts index 0281d04331..72c1634e53 100644 --- a/tests/unit/db-adapters/betterSqliteAdapter.test.ts +++ b/tests/unit/db-adapters/betterSqliteAdapter.test.ts @@ -78,4 +78,16 @@ describe("betterSqliteAdapter", () => { assert.equal(count.cnt, 0, "Rollback deve ter desfeito o insert"); adapter.close(); }); + + test("expõe o estado da transação sem vazar o driver bruto", () => { + const adapter = tryOpenSync(":memory:"); + if (!adapter || adapter.driver !== "better-sqlite3") return; + + assert.equal(adapter.inTransaction, false); + const inspect = adapter.transaction(() => adapter.inTransaction); + assert.equal(inspect(), true); + assert.equal(adapter.inTransaction, false); + + adapter.close(); + }); });