import { resolve } from 'path' import { defineConfig, externalizeDepsPlugin, loadEnv } from 'electron-vite' import react from '@vitejs/plugin-react' const sharedAlias = { '@d3ro/core': resolve(__dirname, '../../packages/core/src'), '@d3ro/ui': resolve(__dirname, '../../packages/ui/src'), '@d3ro/i18n': resolve(__dirname, '../../packages/i18n/src/index.tsx') } const workspaceExclude = ['@d3ro/core', '@d3ro/ui', '@d3ro/i18n'] // SaaS 데스크톱 클라이언트: Supabase 연결 정보를 빌드 타임에 박는다. // `apps/desktop/.env` (committed shared defaults) + `.env.local` (gitignored, 개인/비공개 키) // 우선순위는 vite/electron-vite의 dotenv 로드 규칙: .env.local > .env.[mode] > .env // 환경 변수에 값이 없으면 빈 문자열로 박혀, 런타임에 ConfigService가 fallback(설정 UI 입력)으로 동작. function loadSupabaseEnv(mode: string): { url: string; anonKey: string } { const env = loadEnv(mode, process.cwd(), 'D3RO_') return { url: env.D3RO_SUPABASE_URL ?? '', anonKey: env.D3RO_SUPABASE_ANON_KEY ?? '' } } export default defineConfig(({ mode }) => { const supabase = loadSupabaseEnv(mode) const supabaseDefine = { 'process.env.D3RO_SUPABASE_URL': JSON.stringify(supabase.url), 'process.env.D3RO_SUPABASE_ANON_KEY': JSON.stringify(supabase.anonKey) } return { main: { plugins: [ externalizeDepsPlugin({ exclude: ['nanoid', 'electron-store', ...workspaceExclude] }) ], resolve: { alias: sharedAlias }, define: supabaseDefine }, preload: { plugins: [externalizeDepsPlugin({ exclude: workspaceExclude })], build: { rollupOptions: { input: { index: resolve(__dirname, 'src/preload/index.ts'), popup: resolve(__dirname, 'src/preload/popup.ts') } } }, resolve: { alias: sharedAlias } }, renderer: { build: { rollupOptions: { input: { index: resolve(__dirname, 'src/renderer/index.html'), 'popups/recording-tip': resolve( __dirname, 'src/renderer/popups/recording-tip/index.html' ), 'popups/result-popup': resolve( __dirname, 'src/renderer/popups/result-popup/index.html' ), 'popups/history-popup': resolve( __dirname, 'src/renderer/popups/history-popup/index.html' ), 'popups/command-popup': resolve( __dirname, 'src/renderer/popups/command-popup/index.html' ), 'popups/caption-overlay': resolve( __dirname, 'src/renderer/popups/caption-overlay/index.html' ) } } }, resolve: { alias: sharedAlias }, plugins: [react()] } } })