UNPKG

astro-integration-pocketbase

Version:

An Astro integration to support developers working with astro-loader-pocketbase.

53 lines (52 loc) 1.65 kB
import { z } from "astro/zod"; import { defineMiddleware } from "astro/middleware"; //#region src/middleware/is-pocketbase-entry.ts /** * Schema for a PocketBase entry created with [astro-loader-pocketbase](https://github.com/pawcoding/astro-loader-pocketbase) */ const pocketbaseEntrySchema = z.object({ id: z.string(), data: z.object({ id: z.string(), collectionId: z.string(), collectionName: z.string() }), digest: z.string().length(16), collection: z.string() }); /** * Checks if the given data is a PocketBase entry. */ function isPocketbaseEntry(data) { try { pocketbaseEntrySchema.parse(data); return true; } catch { return false; } } //#endregion //#region src/middleware/index.ts const onRequest = defineMiddleware(async (context, next) => { const entities = findEntitiesRecursive(Object.values(context.props)).map((entity) => entity.data); const response = await next(); if (!response.headers.get("content-type")?.includes("text/html")) return response; const body = await response.text(); const entitiesJson = JSON.stringify(entities); const newBody = body.replace("</head>", `<script>window.__astro_entities__ = ${entitiesJson}<\/script></head>`); return new Response(newBody, response); }); /** * Find PocketBase entities in the given data. */ function findEntitiesRecursive(data) { if (Array.isArray(data)) return data.flatMap((item) => findEntitiesRecursive(item)); if (typeof data === "object" && data !== null) { if (isPocketbaseEntry(data)) return [data]; return findEntitiesRecursive(Object.values(data)); } return []; } //#endregion export { onRequest }; //# sourceMappingURL=middleware.mjs.map