Skip to content

Zod PocketBase

Astro PocketBase gives you access to everything from Zod PocketBase

Schemas Helpers

Instead of this:

import {AuthorRecord, ImageRecord, PostRecord} from "src/lib/pocketbase/schemas";
const Post = PostRecord.pick({ content: true, title: true, updated: true })
.extend({
expand: z.object({
author: AuthorRecord.pick({ name: true })
.extend({
expand: z.object({
image: ImageRecord.pick({ alt: true, src: true }),
}),
})
.transform(({ expand, ...rest }) => ({ ...rest, ...expand })),
image: ImageRecord.pick({ alt: true, src: true }),
}),
})
.transform(({ expand, ...rest }) => ({ ...rest, ...expand }));

Write this:

import { select } from "astro-pocketbase";
import {AuthorRecord, ImageRecord, PostRecord} from "src/lib/pocketbase/schemas";
const Post = select(PostRecord, ["content", "title", "updated"], {
author: select(AuthorRecord, ["name"], {
image: select(ImageRecord, ["alt", "src"])
}),
image: select(ImageRecord, ["alt", "src"])
});

Fetch Helpers

Instead of this:

import { listOptionsFrom, select } from "astro-pocketbase";
import { AuthorRecord, PostRecord } from "src/lib/pocketbase/schemas";
const Post = select(PostRecord, ["content", "title"], {
author: select(AuthorRecord, ["name"])
});
const options = listOptionsFrom(Post, { sort: "-updated" });
const unsafeData = await Astro.locals.pocketbase.collection("posts").getList(1, 10, options);
const firstPosts = Post.array().parse(unsafeData);

Write this:

import { helpersFrom, select } from "astro-pocketbase";
import { AuthorRecord, PostRecord } from "src/lib/pocketbase/schemas";
const { getRecords } = helpersFrom({ pocketbase: Astro.locals.pocketbase, cache: "1d" });
const Post = select(PostRecord, ["content", "title"], {
author: select(AuthorRecord, ["name"])
});
const firstPosts = getRecords("posts", { perPage: 10, schema: Post, sort: "-updated" });