UNPKG

@withstudiocms/effect

Version:

Effect-TS Utilities for Astro

44 lines (43 loc) 1.4 kB
import { Context, Data, Effect, Option } from "./effect.js"; class LibSQLClientError extends Data.TaggedError("LibSQLClientError") { } const useWithErrorPromise = (_try) => Effect.tryPromise({ try: _try, catch: (cause) => new LibSQLClientError({ cause }) }); class TransactionContext extends Context.Tag("TransactionContext")() { static provide = (transaction) => Effect.provideService(this, transaction); } class DrizzleClient extends Context.Tag("DrizzleClient")() { } class DrizzleDBClientService extends Effect.Service()( "DrizzleDBClientService", { effect: Effect.gen(function* () { const { drizzle, schema = {} } = yield* DrizzleClient; const execute = Effect.fn( (fn) => useWithErrorPromise(() => fn(drizzle)) ); const makeQuery = (queryFn) => (...args) => { const input = args[0]; return Effect.serviceOption(TransactionContext).pipe( Effect.map(Option.getOrNull), Effect.flatMap((txOrNull) => queryFn(txOrNull ?? execute, input)) ); }; return { makeQuery, execute }; }) } ) { } const drizzleDBClientLive = (config) => DrizzleDBClientService.pipe( Effect.provide(DrizzleDBClientService.Default), Effect.provideService(DrizzleClient, DrizzleClient.of(config)) ); export { DrizzleClient, DrizzleDBClientService, LibSQLClientError, TransactionContext, drizzleDBClientLive };