astro-loader-prismic
Version:
A simple loader to load data from a Prismic CMS into Astro using the Astro Loader API introduced in Astro 5.
57 lines (48 loc) • 2.08 kB
text/typescript
import { z } from "zod";
import type { Client } from "@prismicio/client";
import type { Loader, LoaderContext } from 'astro/loaders';
import { parsePrismicDoc } from "./parser.ts";
export function pageLoader(
client: Client, pages: TypeResponse[]
): Loader {
return {
name: "page", schema: z.any(),
load: async ({ store, parseData }: LoaderContext) => {
for (let page of pages) {
const metadata = page.json.Main;
const result = await client.getSingle(page.id);
const id = result.id
const [slug] = result.slugs;
const created_at = result.first_publication_date
const updated_at = result.last_publication_date
const data_ = result.data;
const predata = parsePrismicDoc(data_, metadata)
const data = { id, slug, created_at, updated_at, ...predata }
const body = data_.body
const entry = await parseData({ id: slug, data });
store.set({ id: slug, data: entry, body });
}
}
}
}
export function collectionLoader(
client: Client, name: string, metaschema: Record<string, any>
): Loader {
return {
name,
load: async ({ store, parseData }: LoaderContext) => {
const results = await client.getAllByType(name);
for (let result of results) {
const id = result.id
const [slug] = result.slugs;
const created_at = result.first_publication_date
const updated_at = result.last_publication_date
const data_ = result.data;
const predata = parsePrismicDoc(data_, metaschema)
const data = { id, slug, created_at, updated_at, ...predata }
const entry = await parseData({ id: slug, data });
store.set({ id: slug, data: entry });
}
}
}
}