import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
import CONFIG from './gitprofile.config';
import { createHtmlPlugin } from 'vite-plugin-html';
// https://vitejs.dev/config/
export default defineConfig({
base: CONFIG.base || '/',
plugins: [
react(),
createHtmlPlugin({
inject: {
data: {
metaTitle: CONFIG.seo.title,
metaDescription: CONFIG.seo.description,
metaImageURL: CONFIG.seo.imageURL,
googleAnalyticsScript: CONFIG.googleAnalytics.id
? `
`
: '',
},
},
}),
...(CONFIG.enablePWA
? [
VitePWA({
registerType: 'autoUpdate',
workbox: {
// Ship new SW immediately so deploys are not stuck behind the old cache.
skipWaiting: true,
clientsClaim: true,
cleanupOutdatedCaches: true,
// Omitting navigateFallback can still let some hosts/SW setups treat PDF
// navigations like SPA routes; denylist keeps real files out of the fallback.
navigateFallback: 'index.html',
navigateFallbackDenylist: [/\.pdf$/i],
// Large binaries in precache inflate Workbox memory during `vite build` on small VPSs.
globIgnores: ['**/*.pdf'],
runtimeCaching: [
{
urlPattern: ({ request }) => request.mode === 'navigate',
handler: 'NetworkFirst',
options: {
cacheName: 'pages',
networkTimeoutSeconds: 3,
expiration: { maxEntries: 32, maxAgeSeconds: 24 * 60 * 60 },
},
},
],
},
// resume.pdf: serve from /resume.pdf; do not precache (cache quota + build RAM).
includeAssets: ['logo.png'],
manifest: {
name: 'Portfolio',
short_name: 'Portfolio',
description: 'Personal Portfolio',
icons: [
{
src: 'logo.png',
sizes: '64x64 32x32 24x24 16x16 192x192 512x512',
type: 'image/png',
},
],
},
}),
]
: []),
],
define: {
CONFIG: CONFIG,
},
});