import { existsSync } from 'node:fs'; import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import path from 'path'; import { resolve } from 'path'; import tailwindcss from '@tailwindcss/vite'; import salesforce from '@salesforce/vite-plugin-ui-bundle'; import codegen from 'vite-plugin-graphql-codegen'; const schemaPath = resolve(__dirname, '../../../../../schema.graphql'); const schemaExists = existsSync(schemaPath); export default defineConfig(({ mode }) => { return { base: './', plugins: [ tailwindcss(), react(), salesforce(), // Only add codegen when schema exists (e.g. after `npm run graphql:schema`). // In CI or when schema is not checked in, skip codegen so build succeeds. ...(schemaExists ? [ codegen({ configFilePathOverride: resolve(__dirname, 'codegen.yml'), runOnStart: true, runOnBuild: true, enableWatcher: true, throwOnBuild: true, }), ] : []), ] as import('vite').PluginOption[], // Build configuration for MPA build: { outDir: resolve(__dirname, 'dist'), assetsDir: 'assets', sourcemap: false, }, // Resolve aliases (shared between build and test) resolve: { dedupe: ['react', 'react-dom'], alias: { '@': path.resolve(__dirname, './src'), '@api': path.resolve(__dirname, './src/api'), '@components': path.resolve(__dirname, './src/components'), '@utils': path.resolve(__dirname, './src/utils'), '@styles': path.resolve(__dirname, './src/styles'), '@assets': path.resolve(__dirname, './src/assets'), }, }, // Vitest configuration test: { // Override root for tests (build uses src/pages as root) root: resolve(__dirname), // Use jsdom environment for React component testing environment: 'jsdom', // Setup files to run before each test setupFiles: ['./src/test/setup.ts'], // Global test patterns include: [ 'src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}', 'src/**/__tests__/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}', ], // Coverage configuration coverage: { provider: 'v8', reporter: ['text', 'html', 'clover', 'json'], exclude: [ 'node_modules/', 'src/test/', 'src/**/*.d.ts', 'src/main.tsx', 'src/vite-env.d.ts', 'src/components/**/index.ts', '**/*.config.ts', 'build/', 'dist/', 'coverage/', 'eslint.config.js', ], thresholds: { global: { branches: 85, functions: 85, lines: 85, statements: 85, }, }, }, // Test timeout testTimeout: 10000, // Globals for easier testing globals: true, }, }; });