import { defineConfig } from 'vite'; import { resolve } from 'path'; import handlebars from 'vite-plugin-handlebars'; import legacy from '@vitejs/plugin-legacy'; export default defineConfig({ root: 'src', base: './', publicDir: '../public', plugins: [ handlebars({ partialDirectory: resolve(__dirname, 'src/partials'), helpers: { json: (context) => JSON.stringify(context), eq: (a, b) => a === b, ne: (a, b) => a !== b, lt: (a, b) => a < b, gt: (a, b) => a > b, lte: (a, b) => a <= b, gte: (a, b) => a >= b }, context: (pagePath) => { // Add global context data return { title: 'Concept Dashboard', version: '3.0.0', year: new Date().getFullYear(), isDev: process.env.NODE_ENV === 'development' }; } }), legacy({ targets: ['defaults', 'not dead'] }) ], build: { outDir: '../dist', emptyOutDir: true, rollupOptions: { input: { main: resolve(__dirname, 'src/index.html'), // Dashboard pages 'dashboard-finance': resolve(__dirname, 'src/pages/dashboards/finance.html'), 'dashboard-sales': resolve(__dirname, 'src/pages/dashboards/sales.html'), 'dashboard-influencer': resolve(__dirname, 'src/pages/dashboards/influencer.html'), // UI Elements 'ui-cards': resolve(__dirname, 'src/pages/ui-elements/cards.html'), 'ui-general': resolve(__dirname, 'src/pages/ui-elements/general.html'), 'ui-typography': resolve(__dirname, 'src/pages/ui-elements/typography.html'), // Forms 'form-elements': resolve(__dirname, 'src/pages/form-elements.html'), 'form-validation': resolve(__dirname, 'src/pages/form-validation.html'), 'multiselect': resolve(__dirname, 'src/pages/multiselect.html'), // Charts 'charts': resolve(__dirname, 'src/pages/charts/index.html'), // Tables 'general-tables': resolve(__dirname, 'src/pages/tables/general-tables.html'), 'data-tables': resolve(__dirname, 'src/pages/tables/data-tables.html'), // E-Commerce 'products': resolve(__dirname, 'src/pages/ecommerce/products.html'), 'product-single': resolve(__dirname, 'src/pages/ecommerce/product-single.html'), 'checkout': resolve(__dirname, 'src/pages/ecommerce/checkout.html'), // Apps 'calendar': resolve(__dirname, 'src/pages/calendar.html'), 'chat': resolve(__dirname, 'src/pages/chat.html'), 'inbox': resolve(__dirname, 'src/pages/email/inbox.html'), 'compose': resolve(__dirname, 'src/pages/email/compose.html'), 'email-details': resolve(__dirname, 'src/pages/email/details.html'), 'influencer-finder': resolve(__dirname, 'src/pages/apps/influencer-finder.html'), 'influencer-profile': resolve(__dirname, 'src/pages/apps/influencer-profile.html'), // Settings 'settings': resolve(__dirname, 'src/pages/settings.html'), // User Management 'users': resolve(__dirname, 'src/pages/users.html'), 'timeline': resolve(__dirname, 'src/pages/timeline.html'), // Auth Pages 'login': resolve(__dirname, 'src/pages/auth/login.html'), 'signup': resolve(__dirname, 'src/pages/auth/signup.html'), 'forgot-password': resolve(__dirname, 'src/pages/auth/forgot-password.html'), // Misc Pages 'blank-page': resolve(__dirname, 'src/pages/misc/blank-page.html'), '404': resolve(__dirname, 'src/pages/misc/404.html'), }, output: { chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: (assetInfo) => { if (assetInfo.name.endsWith('.css')) { return 'assets/css/[name]-[hash][extname]'; } if (/\.(gif|jpe?g|png|svg|webp|ico)$/.test(assetInfo.name)) { return 'assets/images/[name]-[hash][extname]'; } if (/\.(woff2?|eot|ttf|otf)$/.test(assetInfo.name)) { return 'assets/fonts/[name]-[hash][extname]'; } return 'assets/[name]-[hash][extname]'; } } }, cssCodeSplit: false, sourcemap: true }, css: { preprocessorOptions: { scss: { additionalData: `@use "@/scss/variables" as *;` } } }, server: { port: 3000, hot: true, open: true }, resolve: { alias: { '@': resolve(__dirname, 'src'), '@scss': resolve(__dirname, 'src/scss'), '@js': resolve(__dirname, 'src/js'), '@assets': resolve(__dirname, 'src/assets'), '@components': resolve(__dirname, 'src/js/components'), '@utils': resolve(__dirname, 'src/js/utils') } } });