import { existsSync, readFileSync } from "node:fs"; import { resolve } from "node:path"; import { parse as parseDotenv } from "dotenv"; import { defineConfig, type Plugin } from "vite"; function loadExtensionEnv(mode: string): NodeJS.ProcessEnv { const fileEnv: Record = {}; for (const fileName of [".env", ".env.local", `.env.${mode}`, `.env.${mode}.local`]) { const path = resolve(process.cwd(), fileName); if (existsSync(path)) { Object.assign(fileEnv, parseDotenv(readFileSync(path))); } } return { ...fileEnv, ...process.env }; } function getGiteaHostPermissions(baseUrl?: string): string[] { if (!baseUrl?.trim()) { return []; } try { const url = new URL(baseUrl); return [`${url.protocol}//${url.host}/*`]; } catch { console.warn(`VITE_GITEA_BASE_URL is not a valid URL: ${baseUrl}`); return []; } } function chromeExtensionManifest(mode: string): Plugin { return { name: "chrome-extension-manifest", generateBundle() { const env = loadExtensionEnv(mode); const manifest = { manifest_version: 3, name: "Silma AI Aide", version: "0.1.0", description: "A Vite-powered popup for Gitea-backed Silma AI aide workflows.", action: { default_title: "Silma AI Aide", default_popup: "index.html" }, permissions: ["storage"], host_permissions: getGiteaHostPermissions(env.VITE_GITEA_BASE_URL) }; this.emitFile({ type: "asset", fileName: "manifest.json", source: `${JSON.stringify(manifest, null, 2)}\n` }); } }; } export default defineConfig(({ mode }) => ({ plugins: [chromeExtensionManifest(mode)], build: { outDir: "dist", emptyOutDir: true, rollupOptions: { input: { popup: resolve(__dirname, "index.html") } } } }));