73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
|
|
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<string, string> = {};
|
||
|
|
|
||
|
|
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")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}));
|