import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import electron from 'vite-plugin-electron'; import renderer from 'vite-plugin-electron-renderer'; import { resolve } from 'path'; import { existsSync, readFileSync } from 'fs'; function getExtensionPackages(): Set { try { const manifestPath = resolve(__dirname, 'clawx-extensions.json'); if (!existsSync(manifestPath)) return new Set(); const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')); const allIds: string[] = [ ...(manifest.extensions?.main ?? []), ...(manifest.extensions?.renderer ?? []), ]; const pkgs = new Set(); for (const id of allIds) { if (id.startsWith('builtin/')) continue; const parts = id.split('/'); pkgs.add(parts[0].startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]); } return pkgs; } catch { return new Set(); } } const extensionPackages = getExtensionPackages(); function isMainProcessExternal(id: string): boolean { if (!id || id.startsWith('\0')) return false; if (id.startsWith('.') || id.startsWith('/') || /^[A-Za-z]:[\\/]/.test(id)) return false; if (id.startsWith('@/') || id.startsWith('@electron/')) return false; for (const pkg of extensionPackages) { if (id === pkg || id.startsWith(pkg + '/')) return false; } return true; } // https://vitejs.dev/config/ export default defineConfig({ // Required for Electron: all asset URLs must be relative because the renderer // loads via file:// in production. vite-plugin-electron-renderer sets this // automatically, but we declare it explicitly so the intent is clear and the // build remains correct even if plugin order ever changes. base: './', plugins: [ react(), electron([ { // Main process entry file entry: 'electron/main/index.ts', onstart(options) { options.startup(); }, vite: { build: { outDir: 'dist-electron/main', rollupOptions: { external: isMainProcessExternal, }, }, }, }, { // Preload scripts entry file entry: 'electron/preload/index.ts', onstart(options) { options.reload(); }, vite: { build: { outDir: 'dist-electron/preload', rollupOptions: { external: ['electron'], }, }, }, }, ]), renderer(), ], resolve: { alias: { '@': resolve(__dirname, 'src'), '@electron': resolve(__dirname, 'electron'), }, }, server: { port: 5173, }, build: { outDir: 'dist', emptyOutDir: true, }, });