import { createResolver, defineIntegration } from "astro-integration-kit"; import dotenv from "dotenv"; import { readFileSync, writeFileSync, existsSync } from "node:fs"; import type { CollectionModel } from "pocketbase"; import { Config, Credentials, defaultConfig, fetchCollections } from "zod-pocketbase-continue"; import { generate } from "zod-pocketbase-continue/server"; dotenv.config(); export const integration = defineIntegration({ name: "astro-pocketbase-continue", optionsSchema: Config.omit({ adminEmail: true, adminPassword: true, output: true, url: true }).default(defaultConfig), setup({ options }) { const { resolve } = createResolver(import.meta.url); let collections: CollectionModel[] = []; return { hooks: { "astro:config:setup": async (params) => { const { addDevToolbarApp, addMiddleware, config, logger } = params; const { srcDir } = config; const { ASTRO_POCKETBASE_ADMIN_EMAIL: adminEmail, ASTRO_POCKETBASE_ADMIN_PASSWORD: adminPassword, PUBLIC_ASTRO_POCKETBASE_URL: url, } = process.env; try { const output = `${srcDir.pathname}lib/pocketbase/schemas.ts`; const config = Config.parse({ ...options, adminEmail, adminPassword, url, output }); const credentials = Credentials.parse(config); const allCollections = await fetchCollections(credentials); collections = allCollections.filter(({ name }) => !config.ignore.includes(name)); await generate(collections, config); } catch (error) { logger.error(error instanceof Error ? error.message : "unknown error"); } if (!existsSync(new URL("lib/pocketbase/loader.ts", srcDir))) { const loaderContent = readFileSync(resolve("../assets/loader.ts"), "utf-8"); writeFileSync(new URL("lib/pocketbase/loader.ts", srcDir), loaderContent); } if (!existsSync(new URL("lib/pocketbase/middleware.ts", srcDir))) { const middlewareContent = readFileSync(resolve("../assets/middleware.ts"), "utf-8"); writeFileSync(new URL("lib/pocketbase/middleware.ts", srcDir), middlewareContent); } addMiddleware({ entrypoint: new URL("lib/pocketbase/middleware.ts", srcDir), order: "pre" }); addDevToolbarApp({ id: "astro-pocketbase-continue", name: "Astro PocketBase Continued", icon: `PocketBase`, entrypoint: resolve("../assets/toolbar.ts"), }); }, "astro:config:done": ({ injectTypes }) => { const content = readFileSync(resolve("../assets/env.d.ts"), "utf-8"); injectTypes({ filename: "env.d.ts", content }); }, "astro:server:setup": ({ refreshContent, toolbar }) => { toolbar.on("astro-pocketbase-continue:refresh", async () => { if (!refreshContent) console.warn("Content can only be refreshed in Astro v5.0.0 or higher"); await refreshContent?.({ loaders: ["pocketbase-loader"] }); }); }, }, }; }, });