Skip to content

Commit 4f79e58

Browse files
mikearnaldiLaureRC
andauthored
Rethrow original cause from makeRemoteCallback (#5503)
Co-authored-by: Laure Retru-Chavastel <laure.retruchavastel@gmail.com>
1 parent aa0b4c8 commit 4f79e58

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

packages/sql-drizzle/src/internal/patch.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,24 @@ export const makeRemoteCallback = Effect.gen(function*() {
4949
const runPromise = Runtime.runPromise(currentRuntime ? currentRuntime : constructionRuntime)
5050
const statement = client.unsafe(sql, params)
5151
if (method === "execute") {
52-
return runPromise(Effect.map(statement.raw, (header) => ({ rows: [header] })))
52+
return runPromise(Effect.either(Effect.map(statement.raw, (header) => ({ rows: [header] })))).then((res) => {
53+
if (res._tag === "Left") {
54+
throw res.left.cause
55+
}
56+
return res.right
57+
})
5358
}
5459
let effect: Effect.Effect<any, SqlError> = method === "all" || method === "values"
5560
? statement.values
5661
: statement.withoutTransform
5762
if (method === "get") {
5863
effect = Effect.map(effect, (rows) => rows[0] ?? [])
5964
}
60-
return runPromise(Effect.map(effect, (rows) => ({ rows })))
65+
return runPromise(Effect.either(Effect.map(effect, (rows) => ({ rows })))).then((res) => {
66+
if (res._tag === "Left") {
67+
throw res.left.cause
68+
}
69+
return res.right
70+
})
6171
}
6272
})

packages/sql-drizzle/test/Pg.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import * as Pg from "@effect/sql-drizzle/Pg"
33
import { assert, describe, it } from "@effect/vitest"
44
import * as D from "drizzle-orm/pg-core"
55
import { Effect, Layer } from "effect"
6+
import * as Logger from "effect/Logger"
7+
import * as LogLevel from "effect/LogLevel"
68
import { PgContainer } from "./utils-pg.js"
79
import { DrizzlePgLive } from "./utils.js"
810

@@ -63,4 +65,30 @@ describe.sequential("Pg", () => {
6365
), {
6466
timeout: 60000
6567
})
68+
69+
it.effect("fail properly for conflict issues", () => {
70+
const logs: Array<unknown> = []
71+
const logger = Logger.make((opts) => {
72+
globalThis.console.log(opts)
73+
return logs.push(opts.message)
74+
})
75+
return Effect.gen(function*() {
76+
const sql = yield* SqlClient.SqlClient
77+
const db = yield* Pg.PgDrizzle
78+
79+
yield* sql`CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, snake_case TEXT NOT NULL)`
80+
yield* db.insert(users).values({ name: "Alice", snakeCase: "test" })
81+
yield* Effect.flip(
82+
db.insert(users).values({ name: "Alice", snakeCase: "test" })
83+
)
84+
assert.deepEqual(logs, [])
85+
}).pipe(
86+
Effect.provide([
87+
DrizzlePgLive,
88+
Logger.replace(Logger.defaultLogger, logger),
89+
Logger.minimumLogLevel(LogLevel.Debug)
90+
]),
91+
Effect.catchTag("ContainerError", () => Effect.void)
92+
)
93+
}, { timeout: 60000 })
6694
})

0 commit comments

Comments
 (0)