import { defineConfig } from '#q-app/wrappers'; import { fileURLToPath } from 'node:url'; import path from 'path'; export default defineConfig((ctx) => { return { boot: [ 'i18n', 'axios', 'pinia', 'vee-validate', 'myconfig', 'local-storage', 'globalroutines', 'calendar', 'social-sharing', 'timeago', 'guard', 'trackPageViews', ], css: ['app.scss'], extras: [ 'ionicons-v4', 'fontawesome-v5', 'roboto-font', 'material-icons', 'material-icons-outlined', ], build: { target: { browser: ['es2021', 'chrome100', 'firefox100', 'safari14'], node: 'node20', }, // ✅ AGGIUNTO: Importa automaticamente variables.scss ovunque sassVariables: 'src/css/variables.scss', vueRouterMode: 'history', analyze: false, transpile: true, transpileDependencies: [/quasar-ui-qcalendar[\\/]src/], typescript: { strict: false, vueShim: true, }, // ✅ AGGIUNTO: Config SCSS globale per Vite extendViteConf(viteConf, { isServer, isClient }) { // Alias puliti viteConf.resolve = { ...(viteConf.resolve || {}), alias: { ...viteConf.resolve.alias, '#q-app': path.resolve(__dirname, 'node_modules/quasar/app'), // Alias essenziali (rimuovi duplicati) '@': path.resolve(__dirname, 'src'), '@components': path.resolve(__dirname, 'src/components'), '@views': path.resolve(__dirname, 'src/views'), '@boot': path.resolve(__dirname, 'src/boot'), '@store': path.resolve(__dirname, 'src/store'), '@storemod': path.resolve(__dirname, 'src/store/Modules'), '@tools': path.resolve(__dirname, 'src/store/Modules/tools.ts'), // ✅ AGGIUNTO '@costanti': path.resolve(__dirname, 'src/store/Modules/costanti.ts'), // ✅ AGGIUNTO '@api': path.resolve(__dirname, 'src/store/Api'), '@utils': path.resolve(__dirname, 'src/utils'), '@model': path.resolve(__dirname, 'src/model'), '@classes': path.resolve(__dirname, 'src/classes'), '@router': path.resolve(__dirname, 'src/router'), '@css': path.resolve(__dirname, 'src/css'), '@paths': path.resolve(__dirname, 'src/store/Api/ApiRoutes.ts'), '@images': path.resolve(__dirname, 'src/assets/images'), '@icons': path.resolve(__dirname, 'src/public/myicons'), }, }; // ✅ AGGIUNTO: SCSS preprocessor con variables.scss globale viteConf.css = { ...(viteConf.css || {}), preprocessorOptions: { scss: { additionalData: `@use "sass:color"; @use "@/css/variables.scss" as *;`, }, }, }; }, viteConf: { server: { hmr: { protocol: 'wss', host: 'localhost', port: 8094, }, }, }, beforeDev(api) { if (process.env.SKIP_TSC === 'true') { console.log('⚠️ TypeScript type checking is disabled'); if (api && api.chainWebpack) { api.chainWebpack((chain) => { chain.plugin('fork-ts-checker').tap((args) => { args[0].typescript = false; return args; }); }); } } }, envFilter(originalEnv) { return originalEnv; // Ritorna tutto per semplicità }, vitePlugins: [ [ '@intlify/unplugin-vue-i18n/vite', { ssr: ctx.modeName === 'ssr', include: [fileURLToPath(new URL('./src/i18n', import.meta.url))], }, ], [ 'vite-plugin-checker', { vueTsc: false, OFF_eslint: { lintCommand: 'eslint -c ./eslint.config.js "./src*/**/*.{ts,js,mjs,cjs,vue}"', useFlatConfig: true, }, }, { server: false }, ], ], }, devServer: { https: { key: path.resolve(__dirname, 'localhost-key.pem'), cert: path.resolve(__dirname, 'localhost.pem'), }, port: parseInt(process.env.PORT, 10), vueDevtools: false, open: false, hot: true, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': '*', }, }, framework: { config: {}, components: [ 'QLayout', 'QDrawer', 'QItemSection', 'QHeader', 'QFooter', 'QPageContainer', 'QPage', 'QPopupProxy', 'QToolbar', 'QToolbarTitle', 'QBtn', 'QBtnDropdown', 'QColor', 'QIcon', 'QList', 'QKnob', 'QItemLabel', 'QItem', 'QCard', 'QMarkupTable', 'QSpace', 'QDialog', 'QBadge', 'QForm', 'QCardSection', 'QCardActions', 'QField', 'QInput', 'QSelect', 'QMenu', 'QToggle', 'QFab', 'QInfiniteScroll', 'QAjaxBar', 'QChip', 'QExpansionItem', 'QCheckbox', 'QBanner', 'QInnerLoading', 'QSpinnerGears', 'QSpinnerDots', 'QDate', 'QTime', 'QSlideTransition', 'QTable', 'QTh', 'QTr', 'QTd', 'QLinearProgress', 'QSlider', 'QPopupEdit', 'QCarousel', 'QCarouselControl', 'QCarouselSlide', 'QPageScroller', 'QAvatar', 'QImg', 'QSplitter', 'QRating', 'QParallax', 'QTab', 'QTabs', 'QTabPanels', 'QTabPanel', 'QTree', 'QSeparator', 'QPageSticky', ], directives: ['Ripple', 'ClosePopup'], plugins: [ 'Meta', 'Dialog', 'Notify', 'Cookies', 'Loading', 'AppVisibility', 'LocalStorage', 'SessionStorage', ], iconSet: 'material-icons', lang: 'it', }, animations: 'all', ssr: { pwa: false, prodPort: 3000, maxAge: 1000 * 60 * 60 * 24 * 30, middlewares: [ctx.prod ? 'compression' : '', 'render'], }, pwa: { workboxMode: 'InjectManifest', swFilename: 'sw-' + process.env.APP_VERSION + '.js', workboxOptions: { swSrc: 'src-pwa/custom-service-worker.js', include: [/\.html$/, /\.js$/, /\.css$/, /\.png$/, /\.svg$/, /\.json$/], }, suppressWarnings: true, }, sourceFiles: { pwaRegisterServiceWorker: 'src-pwa/register-service-worker', pwaServiceWorker: 'src-pwa/custom-service-worker', pwaManifestFile: 'src-pwa/manifest.json', }, cordova: {}, capacitor: { hideSplashscreen: true }, electron: { bundler: 'packager', packager: {}, builder: { appId: '-' }, }, }; });