t3-code-android-nightly/.repos/effect-smol/packages/sql/pg/test/utils.ts
Julius Marminge 6f9cea00ae
chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 (#16170)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 13:22:30 -07:00

80 lines
2.5 KiB
TypeScript

import { PgClient } from "@effect/sql-pg"
import { PostgreSqlContainer } from "@testcontainers/postgresql"
import { Context, Data, Effect, Layer, Redacted, String } from "effect"
export class ContainerError extends Data.TaggedError("ContainerError")<{
cause: unknown
}> {}
export class PgContainer extends Context.Service<PgContainer>()("test/PgContainer", {
make: Effect.acquireRelease(
Effect.tryPromise({
try: () => new PostgreSqlContainer("postgres:alpine").start(),
catch: (cause) => new ContainerError({ cause })
}),
(container) => Effect.promise(() => container.stop())
)
}) {
static readonly layer = Layer.effect(this)(this.make)
static layerClient = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layer({
url: Redacted.make(container.getConnectionUri())
})
})
).pipe(Layer.provide(this.layer))
static layerMakeClient = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layerFrom(PgClient.makeClient({
url: Redacted.make(container.getConnectionUri())
}))
})
).pipe(Layer.provide(this.layer))
static layerMakeClientUnprepared = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layerFrom(PgClient.makeClient({
url: Redacted.make(container.getConnectionUri()),
prepare: false
}))
})
).pipe(Layer.provide(this.layer))
static layerMakeClientAcquireForStream = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layerFrom(PgClient.makeClient({
url: Redacted.make(container.getConnectionUri()),
applicationName: "side-default",
acquireForStream: true
}))
})
).pipe(Layer.provide(this.layer))
static layerClientWithTransforms = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layer({
url: Redacted.make(container.getConnectionUri()),
transformResultNames: String.snakeToCamel,
transformQueryNames: String.camelToSnake
})
})
).pipe(Layer.provide(this.layer))
static layerClientForListen = Layer.unwrap(
Effect.gen(function*() {
const container = yield* PgContainer
return PgClient.layer({
url: Redacted.make(container.getConnectionUri()),
maxConnections: 2,
multiplex: true
})
})
).pipe(Layer.provide(this.layer))
}