import type { Plugin } from "vite";
import { writeFileSync, readFileSync } from "fs";
import { resolve } from "path";
interface PageConfig {
/** Page name (used for filename and script name) */
name: string;
/** Page title */
title: string;
/** Script filename (e.g., 'homepage.min.js') */
script: string;
/** Optional CSS filename */
css?: string;
/** Target filename (defaults to name + '.html') */
filename?: string;
}
// Load the favicon SVG from assets
function getFaviconSVG(): string {
const logoPath = resolve(__dirname, "..", "assets", "logo.svg");
return readFileSync(logoPath, "utf-8");
}
// Create favicon data URL for inline usage
function getFaviconDataURL(): string {
const svg = getFaviconSVG();
const encoded = encodeURIComponent(svg)
.replace(/'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29");
return `data:image/svg+xml;utf8,${encoded}`;
}
// Generate HTML content for a page
function generatePageHTML(config: PageConfig): string {
const cssLink = config.css
? ``
: "";
return `
${config.title}
${cssLink}
`;
}
/**
* Vite plugin to generate dumb:// protocol pages
* Supports multiple pages like homepage, config, about, etc.
*/
export function pageGenerator(pages: PageConfig[]): Plugin {
return {
name: "dumb-page-generator",
writeBundle() {
const assetsDir = resolve(__dirname, "..", "assets", "gui");
try {
// Generate HTML files for each page
for (const page of pages) {
const htmlContent = generatePageHTML(page);
const filename = page.filename || `${page.name}.html`;
writeFileSync(resolve(assetsDir, filename), htmlContent);
console.log(`✓ Generated ${filename} for dumb://${page.name}`);
}
// Generate favicon.svg for scheme handler lookups
const faviconContent = getFaviconSVG();
writeFileSync(resolve(assetsDir, "favicon.svg"), faviconContent);
console.log("✓ Generated favicon.svg");
} catch (error) {
console.error("✗ Failed to generate page files:", error);
throw error;
}
},
};
}
/**
* Convenience function for homepage generation
* @deprecated Use pageGenerator with homepage config instead
*/
export function homepageGenerator(): Plugin {
return pageGenerator([
{
name: "homepage",
title: "Dumber Browser",
script: "homepage.min.js",
filename: "index.html", // Special case: homepage uses index.html
},
]);
}