astro-maintenance
Version:
Maintenance and Coming Soon integration for Astro
105 lines (98 loc) • 2.7 kB
text/typescript
import type { AstroIntegration } from "astro";
export interface Socials {
facebook?: string;
x?: string;
instagram?: string;
youtube?: string;
linkedin?: string;
mastodon?: string;
github?: string;
pinterest?: string;
tiktok?: string;
discord?: string;
slack?: string;
twitch?: string;
reddit?: string;
}
export interface MaintenanceOptions {
enabled?: boolean;
/**
* Template to use for the maintenance page.
* - Use "simple", "countdown", or "construction" for built-in templates
* - For custom templates, import them using ?raw and pass the content directly:
* ```
* import customTemplate from "./src/templates/custom.hbs?raw";
* maintenance({ template: customTemplate })
* ```
* - File paths are no longer supported to ensure serverless compatibility
*/
template?: "simple" | "countdown" | "construction" | string;
logo?: string;
title?: string;
description?: string;
emailAddress?: string;
emailText?: string;
copyright?: string;
countdown?: string;
allowedPaths?: string[];
override?: string;
cookieName?: string;
cookieMaxAge?: number;
socials?: Socials;
}
export default function maintenance(
options?: MaintenanceOptions,
): AstroIntegration {
const resolvedOptions: MaintenanceOptions = {
enabled: true,
template: "simple",
title: "Site under maintenance",
description: "We’ll be back shortly!",
override: "bypass",
...options, // user-provided options override defaults
};
return {
name: "astro-maintenance",
hooks: {
"astro:config:setup": ({ addMiddleware, updateConfig }) => {
// Skip if static output
if (
resolvedOptions.enabled !== false &&
process.env.OUTPUT === "static"
) {
console.warn(
"[astro-maintenance] Static output does not support middleware.",
);
return;
}
// Add middleware with pre/post order
addMiddleware({
entrypoint: new URL("./middleware.ts", import.meta.url), // Reference the middleware file
order: "pre", // Run before other middlewares
});
// Inject virtual module using Vite plugin
updateConfig({
vite: {
plugins: [
{
name: "astro-maintenance:virtual-options",
resolveId(id) {
if (id === "virtual:astro-maintenance/options") {
return id;
}
return undefined; // Explicitly return undefined for other IDs
},
load(id) {
if (id === "virtual:astro-maintenance/options") {
return `export const options = ${JSON.stringify(resolvedOptions, null, 2)};`;
}
return undefined; // Explicitly return undefined for other IDs
},
},
],
},
});
},
},
};
}