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 }, ]); }