You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							147 lines
						
					
					
						
							4.7 KiB
						
					
					
				
								import { defineConfig, UserConfig } from "vite";
							 | 
						|
								import vue from "@vitejs/plugin-vue";
							 | 
						|
								import dotenv from "dotenv";
							 | 
						|
								import { loadAppConfig } from "./vite.config.utils.mts";
							 | 
						|
								import path from "path";
							 | 
						|
								import { fileURLToPath } from 'url';
							 | 
						|
								
							 | 
						|
								// Load environment variables
							 | 
						|
								dotenv.config();
							 | 
						|
								
							 | 
						|
								const __filename = fileURLToPath(import.meta.url);
							 | 
						|
								const __dirname = path.dirname(__filename);
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Optimized Vite configuration for Vue 3 + vue-facing-decorator
							 | 
						|
								 * with enhanced code splitting and lazy loading capabilities
							 | 
						|
								 * 
							 | 
						|
								 * @author Matthew Raymer
							 | 
						|
								 * @version 1.0.0
							 | 
						|
								 */
							 | 
						|
								export async function createOptimizedBuildConfig(mode: string): Promise<UserConfig> {
							 | 
						|
								  const appConfig = await loadAppConfig();
							 | 
						|
								  const isCapacitor = mode === "capacitor";
							 | 
						|
								  const isElectron = mode === "electron";
							 | 
						|
								  const isNative = isCapacitor || isElectron;
							 | 
						|
								
							 | 
						|
								  // Set platform - PWA is always enabled for web platforms
							 | 
						|
								  process.env.VITE_PLATFORM = mode;
							 | 
						|
								
							 | 
						|
								  return {
							 | 
						|
								    base: "/",
							 | 
						|
								    plugins: [vue()],
							 | 
						|
								    server: {
							 | 
						|
								      port: parseInt(process.env.VITE_PORT || "8080"),
							 | 
						|
								      fs: { strict: false },
							 | 
						|
								      // CORS headers disabled to allow images from any domain
							 | 
						|
								      // This means SharedArrayBuffer is unavailable, but absurd-sql
							 | 
						|
								      // will automatically fall back to IndexedDB mode which still works
							 | 
						|
								    },
							 | 
						|
								    build: {
							 | 
						|
								      outDir: "dist",
							 | 
						|
								      assetsDir: 'assets',
							 | 
						|
								      chunkSizeWarningLimit: 1000,
							 | 
						|
								      rollupOptions: {
							 | 
						|
								        external: isNative 
							 | 
						|
								          ? ['@capacitor/app'] 
							 | 
						|
								          : [],
							 | 
						|
								        output: {
							 | 
						|
								          format: 'esm',
							 | 
						|
								          generatedCode: {
							 | 
						|
								            preset: 'es2015'
							 | 
						|
								          },
							 | 
						|
								          // Enhanced manual chunks for better code splitting
							 | 
						|
								          manualChunks: {
							 | 
						|
								            // Vendor chunks for better caching
							 | 
						|
								            'vue-vendor': ['vue', 'vue-router', 'pinia'],
							 | 
						|
								            'ui-vendor': ['@fortawesome/fontawesome-svg-core', '@fortawesome/vue-fontawesome'],
							 | 
						|
								            'crypto-vendor': ['@ethersproject/wallet', '@ethersproject/hdnode', 'ethereum-cryptography'],
							 | 
						|
								            'sql-vendor': ['@jlongster/sql.js', 'absurd-sql', 'dexie'],
							 | 
						|
								            'qr-vendor': ['qrcode', 'jsqr', 'vue-qrcode-reader'],
							 | 
						|
								            'three-vendor': ['three', '@tweenjs/tween.js'],
							 | 
						|
								            'utils-vendor': ['luxon', 'ramda', 'zod', 'axios'],
							 | 
						|
								            // Platform-specific chunks
							 | 
						|
								            ...(isCapacitor && {
							 | 
						|
								              'capacitor-vendor': ['@capacitor/core', '@capacitor/app', '@capacitor/camera']
							 | 
						|
								            }),
							 | 
						|
								            ...(isElectron && {
							 | 
						|
								              'electron-vendor': ['electron']
							 | 
						|
								            })
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								      },
							 | 
						|
								      // Optimize chunk loading
							 | 
						|
								      target: 'es2015',
							 | 
						|
								      minify: 'terser',
							 | 
						|
								      terserOptions: {
							 | 
						|
								        compress: {
							 | 
						|
								          drop_console: process.env.NODE_ENV === 'production',
							 | 
						|
								          drop_debugger: true
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    },
							 | 
						|
								    worker: {
							 | 
						|
								      format: 'es',
							 | 
						|
								      plugins: () => []
							 | 
						|
								    },
							 | 
						|
								    define: {
							 | 
						|
								      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
							 | 
						|
								      'process.env.VITE_PLATFORM': JSON.stringify(mode),
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								      __dirname: JSON.stringify(process.cwd()),
							 | 
						|
								      __IS_MOBILE__: JSON.stringify(isCapacitor),
							 | 
						|
								      __IS_ELECTRON__: JSON.stringify(isElectron),
							 | 
						|
								      __USE_QR_READER__: JSON.stringify(!isCapacitor),
							 | 
						|
								      'process.platform': JSON.stringify('browser'),
							 | 
						|
								      'process.version': JSON.stringify('v16.0.0'),
							 | 
						|
								      'process.env.NODE_DEBUG': JSON.stringify(false),
							 | 
						|
								      'global.process': JSON.stringify({
							 | 
						|
								        platform: 'browser',
							 | 
						|
								        version: 'v16.0.0',
							 | 
						|
								        env: { NODE_DEBUG: false }
							 | 
						|
								      })
							 | 
						|
								    },
							 | 
						|
								    resolve: {
							 | 
						|
								      alias: {
							 | 
						|
								        '@': path.resolve(__dirname, 'src'),
							 | 
						|
								        '@nostr/tools': path.resolve(__dirname, 'node_modules/@nostr/tools'),
							 | 
						|
								        '@nostr/tools/nip06': path.resolve(__dirname, 'node_modules/@nostr/tools/nip06'),
							 | 
						|
								        ...appConfig.aliasConfig,
							 | 
						|
								        'path': path.resolve(__dirname, './src/utils/node-modules/path.js'),
							 | 
						|
								        'fs': path.resolve(__dirname, './src/utils/node-modules/fs.js'),
							 | 
						|
								        'crypto': path.resolve(__dirname, './src/utils/node-modules/crypto.js'),
							 | 
						|
								        'dexie-export-import': path.resolve(__dirname, 'node_modules/dexie-export-import')
							 | 
						|
								      }
							 | 
						|
								    },
							 | 
						|
								    optimizeDeps: {
							 | 
						|
								      include: [
							 | 
						|
								        '@nostr/tools',
							 | 
						|
								        '@nostr/tools/nip06',
							 | 
						|
								        'vue',
							 | 
						|
								        'vue-router',
							 | 
						|
								        'pinia',
							 | 
						|
								        'vue-facing-decorator'
							 | 
						|
								      ],
							 | 
						|
								      exclude: isNative ? [
							 | 
						|
								        'register-service-worker',
							 | 
						|
								        'workbox-window',
							 | 
						|
								        'web-push',
							 | 
						|
								        'serviceworker-webpack-plugin'
							 | 
						|
								      ] : []
							 | 
						|
								    },
							 | 
						|
								    // Enhanced performance optimizations
							 | 
						|
								    esbuild: {
							 | 
						|
								      target: 'es2015',
							 | 
						|
								      supported: {
							 | 
						|
								        'bigint': true
							 | 
						|
								      },
							 | 
						|
								      // Fail on any ESBuild errors
							 | 
						|
								      logLevel: 'error',
							 | 
						|
								      // Ensure build fails on syntax errors
							 | 
						|
								      logOverride: { 'duplicate-export': 'error' }
							 | 
						|
								    }
							 | 
						|
								  };
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								export default defineConfig(async () => createOptimizedBuildConfig('web')); 
							 |