export const makePgDatabase = <
Id extends string,
TSchema extends Record<string, unknown> = Record<string, never>,
>(
id: Id,
schema: TSchema
) =>
class PgDatabase extends Effect.Service<PgDatabase>()(
`@db/PgDatabase<${id}>`,
{
effect: PgDrizzle.make({
schema,
casing: 'snake_case',
}),
}
) {
static PgClient = (config: Config) =>
PgDatabase.Default.pipe(Layer.provide(PgClient.layer(config)))
static PgClientFromEnv = Effect.gen(function* () {
const config = yield* Config.all({
url: Config.redacted('DATABASE_URL'),
})
return PgDatabase.PgClient(config)
}).pipe(Layer.unwrapEffect)
}
class TestPgDatabase extends makePgDatabase('Test', schema) {}
Effect.gen(function* () {
const db = yield* TestPgDatabase
// db is now properly typed with the schema so stuff like db.query.someTable.findMany() will work
})
export const makePgDatabase = <
Id extends string,
TSchema extends Record<string, unknown> = Record<string, never>,
>(
id: Id,
schema: TSchema
) =>
class PgDatabase extends Effect.Service<PgDatabase>()(
`@db/PgDatabase<${id}>`,
{
effect: PgDrizzle.make({
schema,
casing: 'snake_case',
}),
}
) {
static PgClient = (config: Config) =>
PgDatabase.Default.pipe(Layer.provide(PgClient.layer(config)))
static PgClientFromEnv = Effect.gen(function* () {
const config = yield* Config.all({
url: Config.redacted('DATABASE_URL'),
})
return PgDatabase.PgClient(config)
}).pipe(Layer.unwrapEffect)
}
class TestPgDatabase extends makePgDatabase('Test', schema) {}
Effect.gen(function* () {
const db = yield* TestPgDatabase
// db is now properly typed with the schema so stuff like db.query.someTable.findMany() will work
})