diff --git a/packages/effect-drizzle-sqlite/src/index.ts b/packages/effect-drizzle-sqlite/src/index.ts
index 868dc23274..33293b11d6 100644
--- a/packages/effect-drizzle-sqlite/src/index.ts
+++ b/packages/effect-drizzle-sqlite/src/index.ts
@@ -65,7 +65,10 @@ type MutationLike = EffectLikeQuery & {
readonly config?: { readonly returning?: unknown }
}
-type CountLike = EffectLikeQuery & PromiseLike
+type CountLike = EffectLikeQuery & {
+ readonly session: { readonly values: (sql: unknown) => unknown[][] }
+ readonly sql: unknown
+}
class TransactionFailure extends Error {
constructor(readonly effectCause: Cause.Cause) {
@@ -105,6 +108,8 @@ const fromSync = (query: EffectLikeQuery, run: () => A) =>
const fromMutation = (query: MutationLike) => fromSync(query, () => (query.config?.returning ? query.all() : query.run()))
+const fromCount = (query: CountLike) => fromSync(query, () => Number(query.session.values(query.sql)[0]?.[0] ?? 0))
+
const fromExecuteResult = (result: unknown) => {
if (result && typeof result === "object" && "sync" in result && typeof result.sync === "function") {
return result.sync()
@@ -163,12 +168,7 @@ const patchQueryBuilders = (() => {
patchClass(SQLiteSyncRelationalQuery, (query: EffectLikeQuery & { readonly executeRaw: () => unknown }) =>
fromSync(query, () => query.executeRaw()),
)
- patchClass(SQLiteCountBuilder, (query: CountLike) =>
- Effect.tryPromise({
- try: () => Promise.resolve(query),
- catch: (cause) => queryError(query, cause),
- }),
- )
+ patchClass(SQLiteCountBuilder, fromCount)
}
})()
@@ -215,8 +215,9 @@ const attachTransaction = <
if (property === "withTransaction") return withTransaction
if (property === "$client") return db.$client
- const value = Reflect.get(current(), property)
- return typeof value === "function" ? value.bind(current()) : value
+ const target = current()
+ const value = Reflect.get(target, property)
+ return typeof value === "function" ? value.bind(target) : value
},
}) as EffectSQLiteDatabase
}
@@ -226,10 +227,11 @@ export const make = <
TRelations extends AnyRelations = EmptyRelations,
>(config: MakeConfig = {}): EffectSQLiteDatabase => {
patchQueryBuilders()
+ const { client, filename, ...drizzleConfig } = config
return attachTransaction(
drizzleBun({
- ...config,
- client: config.client ?? new Database(config.filename ?? ":memory:"),
+ ...drizzleConfig,
+ client: client ?? new Database(filename ?? ":memory:"),
}),
)
}
diff --git a/packages/effect-drizzle-sqlite/test/sqlite.test.ts b/packages/effect-drizzle-sqlite/test/sqlite.test.ts
index 6e26bca2ba..5c02c18c5f 100644
--- a/packages/effect-drizzle-sqlite/test/sqlite.test.ts
+++ b/packages/effect-drizzle-sqlite/test/sqlite.test.ts
@@ -152,6 +152,7 @@ describe("effect drizzle sqlite", () => {
yield* Effect.gen(function* () {
yield* db.insert(users).values({ id: 2, name: "Grace" })
+ expect(yield* db.$count(users)).toBe(1)
}).pipe(db.withTransaction)
expect(yield* db.select().from(users)).toEqual([{ id: 2, name: "Grace" }])