From f6f6cd0515e3d61ac839a429c3a8d2a5799974d2 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Mon, 27 Apr 2026 22:32:10 -0400 Subject: [PATCH] fix(effect-drizzle-sqlite): simplify sqlite adapter --- packages/effect-drizzle-sqlite/src/index.ts | 24 ++++++++++--------- .../effect-drizzle-sqlite/test/sqlite.test.ts | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) 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" }])