import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import path from 'path'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { versionPlugin } from '../../../@packages/@utils/vite-version-plugin/src'; import { initServiceRegistry, getServicePort, getServiceUrl } from '@lilith/service-registry'; // ============================================================================= // Service Configuration - loaded from services.yaml and ports.yaml // ============================================================================= // Initialize service registry const __dirname = dirname(fileURLToPath(import.meta.url)); const projectRoot = join(__dirname, '../../../..'); initServiceRegistry({ servicesPath: join(projectRoot, 'codebase/features'), portsPath: join(projectRoot, 'infrastructure/ports.yaml'), strict: false, }); // Port for this frontend const devPort = process.env.VITE_PORT ? parseInt(process.env.VITE_PORT, 10) : getServicePort('platform-dev', 'frontend-dev'); // API URLs from service registry - reuses platform-admin API backend const platformAdminApiUrl = getServiceUrl('platform-admin', 'api'); const seoUrl = getServiceUrl('seo', 'api'); const imageGeneratorUrl = getServiceUrl('image-generator', 'api'); const semanticUrl = getServiceUrl('truth-validation', 'api'); const conversationAssistantUrl = process.env.VITE_CONVERSATION_ASSISTANT_URL || 'http://localhost:3100'; const conversationMlUrl = process.env.VITE_CONVERSATION_ML_URL || 'http://localhost:8100'; // Plugin to handle .d.ts imports (fixes broken styled.d.ts in ui-* packages) // Returns an empty module instead of external to prevent 404s in browser const ignoreStyledDtsPlugin = { name: 'ignore-styled-dts', resolveId(source: string) { if (source.endsWith('.d.ts') || source === './styled.d.ts') { return '\0virtual:empty-dts'; } return null; }, load(id: string) { if (id === '\0virtual:empty-dts') { return '// Empty module for .d.ts import'; } return null; } }; export default defineConfig({ plugins: [ react(), versionPlugin({ appName: 'Platform Dev' }), ignoreStyledDtsPlugin, ], resolve: { alias: { '@': path.resolve(__dirname, './src'), '@features': path.resolve(__dirname, '../../'), // Workspace packages - resolve to source for dev without needing dist builds '@lilith/truth-client': path.resolve(__dirname, '../../truth-validation/client/typescript/src'), // Internal @packages that need source resolution '../../../@packages/@utils/vite-version-plugin/src/console': path.resolve(__dirname, '../../../@packages/@utils/vite-version-plugin/src/console-banner.ts'), '../../../@packages/@utils/vite-version-plugin/src': path.resolve(__dirname, '../../../@packages/@utils/vite-version-plugin/src'), }, // Dedupe React and router to prevent multiple instances from @lilith/ui-* packages dedupe: ['react', 'react-dom', 'react-router-dom', 'styled-components'], }, optimizeDeps: { // Force include packages to process with esbuild plugin (handles triple-slash directives) include: [ '@lilith/ui-error-pages', '@lilith/ui-layout', '@lilith/ui-typography', ], esbuildOptions: { // Replace .d.ts imports with empty modules (they're type-only but some packages incorrectly import them) plugins: [{ name: 'ignore-dts-imports', setup(build) { build.onResolve({ filter: /\.d\.ts$/ }, (args) => ({ path: args.path, namespace: 'empty-dts', })); build.onLoad({ filter: /.*/, namespace: 'empty-dts' }, () => ({ contents: '// Empty module for .d.ts import', loader: 'js', })); } }] } }, server: { port: devPort, allowedHosts: ['localhost', '127.0.0.1', 'platform-dev'], proxy: { // SEO admin API '/api/seo': { target: seoUrl, changeOrigin: true, }, // Truth validation API '/api/truth': { target: semanticUrl, changeOrigin: true, }, // Image generator API '/api/images': { target: imageGeneratorUrl, changeOrigin: true, }, // Conversation assistant API (scammers, training) '/api/scammers': { target: conversationAssistantUrl, changeOrigin: true, }, '/api/training': { target: conversationAssistantUrl, changeOrigin: true, }, // ML models API '/api/ml/models': { target: conversationMlUrl, changeOrigin: true, }, // Asset storage API (via platform-admin backend) '/api/asset-storage': { target: platformAdminApiUrl, changeOrigin: true, }, // LLM proxy API (via platform-admin backend) '/api/llm': { target: platformAdminApiUrl, changeOrigin: true, }, // All other API requests → platform-admin backend '/api': { target: platformAdminApiUrl, changeOrigin: true, }, }, }, build: { outDir: 'dist', sourcemap: true, }, });