import type { default as Pocketbase, SendOptions } from "pocketbase"; import { fullListOptionsFrom, optionsFrom } from "@/options.ts"; import type { AnyZodRecord, RecordFullListOpts, RecordIdRef, RecordRef, RecordSlugRef } from "@/types.ts"; import { AnyRecordsList } from "@/schemas.ts"; import type { RecordsList } from "@/schemas.ts"; export function helpersFrom({ fetch, pocketbase }: HelpersFromOpts) { async function getRecord(ref: RecordSlugRef, opts: GetRecordOpts): Promise; async function getRecord(ref: RecordIdRef, opts: GetRecordOpts): Promise; async function getRecord(ref: RecordRef, opts: GetRecordOpts) { const { schema } = opts; const sdkOpts = { ...optionsFrom(schema), ...(fetch ? { fetch } : {}) }; const unsafeRecord = await ("id" in ref ? pocketbase.collection(ref.collection).getOne(ref.id, sdkOpts) : pocketbase.collection(ref.collection).getFirstListItem(`slug = "${ref.slug}"`, sdkOpts)); return schema.parseAsync(unsafeRecord); } async function getRecords(collection: C, opts: GetRecordsOpts): Promise> { const { schema, ...otherOpts } = opts; const sdkOpts = { ...fullListOptionsFrom(schema, otherOpts), ...(fetch ? { fetch } : {}) }; const recordsList = await pocketbase.collection(collection).getList(sdkOpts.page, sdkOpts.perPage, sdkOpts); return AnyRecordsList.extend({ items: schema.array() }).parseAsync(recordsList); } return { getRecord, getRecords }; } export type GetRecordOpts = { schema: S }; export type GetRecordsOpts = RecordFullListOpts & { schema: S }; export type HelpersFromOpts = { fetch?: SendOptions["fetch"]; pocketbase: Pocketbase };