import {
BuildQueryResult,
DBQueryConfig,
KnownKeysOnly,
TableRelationalConfig,
TablesRelationalConfig,
} from "drizzle-orm"
import { RelationalQueryBuilder } from "drizzle-orm/pg-core/query-builders/query"
export class FindFirstError extends Error {
constructor(config?: Record<string, unknown>) {
super(
`findFirst query yielded no results. Query config: ${JSON.stringify(config)}`
)
this.name = "FindFirstError"
}
}
export async function findFirstOrThrow<
TSchema extends TablesRelationalConfig,
TFields extends TableRelationalConfig,
TConfig extends DBQueryConfig<"one", TSchema, TFields>,
>(
table: RelationalQueryBuilder<TSchema, TFields>,
config?: KnownKeysOnly<TConfig, DBQueryConfig<"one", TSchema, TFields>>
): Promise<BuildQueryResult<TSchema, TFields, TConfig>> {
const result = await table.findFirst(config)
const isResult = (
value: BuildQueryResult<TSchema, TFields, TConfig> | undefined
): value is BuildQueryResult<TSchema, TFields, TConfig> => !!value
if (!isResult(result)) {
throw new FindFirstError(config)
}
return result
}