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