Files
miracles_in_motion/vite.config.ts
T
defiQUGandCursor e24cb6379a Fix stale home copy, enlarge nav logo, and refresh PWA cache
Replace student/counselor sections with foundation messaging; show nav from md breakpoint; workbox skipWaiting so deploys reach browsers faster.

Co-authored-by: Cursor <[email protected]>
2026-05-26 22:00:39 -07:00

133 lines
3.5 KiB
TypeScript

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { resolve } from 'path'
import { VitePWA } from 'vite-plugin-pwa'
// Optimized Vite Configuration with PWA Support
export default defineConfig({
plugins: [
react(),
VitePWA({
registerType: 'prompt',
includeAssets: [
'favicon.svg',
'favicon.ico',
'logo.png',
'logo-horizontal.png',
'logo-symbol.png',
'robots.txt',
'site.webmanifest',
'brand/**/*',
'photos/**/*',
],
manifest: {
name: 'Miracles in Motion Foundation',
short_name: 'MiM',
description: 'Restoring hope through compassion, community, and faith in Los Angeles County',
theme_color: '#1a3c34',
background_color: '#1a3c34',
display: 'standalone',
scope: '/',
start_url: '/',
icons: [
{
src: '/favicon.svg',
sizes: 'any',
type: 'image/svg+xml',
purpose: 'any',
},
{
src: '/brand/favicon-192.png',
sizes: '192x192',
type: 'image/png',
purpose: 'any maskable',
},
{
src: '/brand/favicon-512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
},
],
},
workbox: {
skipWaiting: true,
clientsClaim: true,
cleanupOutdatedCaches: true,
globPatterns: ['**/*.{js,css,html,ico,png,svg,webp,jpg}'],
maximumFileSizeToCacheInBytes: 3 * 1024 * 1024,
runtimeCaching: [
{
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
handler: 'CacheFirst',
options: {
cacheName: 'google-fonts-cache',
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24 * 365 // 1 year
}
}
},
{
urlPattern: /\.(png|jpg|jpeg|svg|gif|webp)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24 * 30 // 30 days
}
}
}
]
},
devOptions: {
enabled: true
}
})
],
resolve: {
alias: {
'@': resolve(__dirname, './src'),
},
},
server: {
port: 3000,
open: true,
},
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
// Core React libraries
vendor: ['react', 'react-dom'],
// UI and animations
ui: ['framer-motion', 'lucide-react'],
// AI libraries (browser-compatible)
ai: ['@tensorflow/tfjs'],
// Utilities and i18n
utils: ['date-fns', 'react-helmet-async', 'i18next', 'react-i18next'],
// Stripe and payment
payments: ['@stripe/stripe-js', '@stripe/react-stripe-js']
},
chunkFileNames: 'js/[name]-[hash].js'
}
},
// Enable compression
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
},
},
// Optimize chunks
chunkSizeWarningLimit: 500,
},
})