@withstudiocms/effect
Version:
Effect-TS Utilities for Astro
44 lines (43 loc) • 1.4 kB
JavaScript
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
};