import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import { resolve } from 'path'; import { quasar, transformAssetUrls } from '@quasar/vite-plugin'; import path from 'path'; import fs from 'fs'; const mode = process.env.BUILD_TARGET; const standaloneDir = path.resolve(__dirname, `includes/${mode}/app/standalone`); function getStandaloneEntries(): Record { const entries: Record = {}; const types = ['.ts', '.js', '.scss']; const scanDir = (dir: string, prefix = '') => { if (!fs.existsSync(dir)) return; fs.readdirSync(dir).forEach((file) => { const fullPath = path.join(dir, file); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { scanDir(fullPath, path.join(prefix, file)); } else { const ext = path.extname(file); const name = path.basename(file, ext); if (types.includes(ext)) { const key = ext === '.scss' ? `${name}Styles` : name; entries[key] = fullPath; } } }); }; scanDir(standaloneDir); return entries; } const standaloneEntries = getStandaloneEntries(); export default defineConfig({ base: `/wp-content/plugins/loyalty-suite/includes/${mode}/dist/`, plugins: [ vue({ template: { transformAssetUrls } }), quasar({ sassVariables: mode === 'Admin' ? resolve(__dirname, `includes/${mode}/app/styles/quasar-variables.scss`) : undefined }) ], resolve: { alias: { '@': path.resolve(__dirname, `includes/${mode}/app`) } }, publicDir: `includes/${mode}/app/assets`, build: { outDir: resolve(__dirname, `includes/${mode}/dist`), emptyOutDir: true, rollupOptions: { input: { app: resolve(__dirname, `includes/${mode}/app/main.ts`), ...standaloneEntries, }, output: { entryFileNames: 'js/[name].js', chunkFileNames: 'js/[name].js', assetFileNames: (assetInfo) => { const fileName = assetInfo?.name || 'default'; if (fileName.includes('.woff2') || fileName.includes('.woff')) { return 'fonts/[name][extname]'; } if (fileName.includes('.css')) { return 'css/[name][extname]'; } return 'assets/[name][extname]'; } } } } });