astro-integration-pocketbase
Version:
An Astro integration to support developers working with astro-loader-pocketbase.
53 lines (52 loc) • 1.65 kB
JavaScript
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