UNPKG

astro-loader-pocketbase

Version:

A content loader for Astro that uses the PocketBase API

78 lines (65 loc) 2.39 kB
import type { LoaderContext } from "astro/loaders"; import packageJson from "../../package.json"; import type { PocketBaseLoaderOptions } from "../types/pocketbase-loader-options.type"; import { shouldRefresh } from "../utils/should-refresh"; import { cleanupEntries } from "./cleanup-entries"; import { handleRealtimeUpdates } from "./handle-realtime-updates"; import { loadEntries } from "./load-entries"; /** * Load entries from a PocketBase collection. */ export async function loader( context: LoaderContext, options: PocketBaseLoaderOptions, token: string | undefined ): Promise<void> { context.logger.label = `pocketbase-loader:${options.collectionName}`; // Check if the collection should be refreshed. const refresh = shouldRefresh( context.refreshContextData, options.collectionName ); if (refresh === "skip") { return; } // Handle realtime updates const handled = await handleRealtimeUpdates(context, options); if (handled) { return; } // Get the date of the last fetch to only update changed entries. let lastModified = context.meta.get("last-modified"); // Force a full update if the refresh is forced if (refresh === "force") { lastModified = undefined; context.store.clear(); } // Check if the version has changed to force an update const lastVersion = context.meta.get("version"); if (lastVersion !== packageJson.version) { if (lastVersion) { context.logger.info( `PocketBase loader was updated from ${lastVersion} to ${packageJson.version}. All entries will be loaded again.` ); } // Disable incremental builds and clear the store lastModified = undefined; context.store.clear(); } // Disable incremental builds if no updated field is provided if (!options.updatedField) { context.logger.info( `No "updatedField" was provided. Incremental builds are disabled.` ); lastModified = undefined; } if (context.store.keys().length > 0) { // Cleanup entries that are no longer in the collection await cleanupEntries(options, context, token); } // Load the (modified) entries await loadEntries(options, context, token, lastModified); // Set the last modified date to the current date context.meta.set("last-modified", new Date().toISOString().replace("T", " ")); context.meta.set("version", packageJson.version); }