Files
ponomar-pwa/vite.config.ts
T
catarrh f49735b360 feat: explicit PWA update prompt with build stamp
- registerType 'prompt' + skipWaiting/clientsClaim false: new SW waits
  instead of silently hijacking running sessions
- main.ts registers via virtual:pwa-register; onNeedRefresh shows
  dismissible toast (i18n en/ru/cu) with Update button -> updateSW(true)
- No polling — update check only on navigation, zero extra traffic
- Settings About shows __BUILD_DATE__ build stamp for remote debugging
2026-08-24 11:39:47 +03:00

72 lines
2.1 KiB
TypeScript

import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
import { resolve } from 'path';
import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({
plugins: [
tailwindcss(),
VitePWA({ registerType: 'prompt',
workbox: {
skipWaiting: false,
clientsClaim: false,
globPatterns: ['**/*.{js,css,html,woff,png}'],
globIgnores: ['**/data/**'],
maximumFileSizeToCacheInBytes: 20 * 1024 * 1024,
runtimeCaching: [
{
urlPattern: /\/data\/.*\.json$/,
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'ponomar-data',
expiration: { maxEntries: 200, maxAgeSeconds: 60 * 60 * 24 * 30 },
},
},
{
urlPattern: /\/data\/.*\.text$/,
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'ponomar-bible',
expiration: { maxEntries: 100, maxAgeSeconds: 60 * 60 * 24 * 30 },
},
},
{
urlPattern: /\/fonts\/.*\.woff2?$/,
handler: 'CacheFirst',
options: {
cacheName: 'ponomar-fonts',
expiration: { maxEntries: 10, maxAgeSeconds: 60 * 60 * 24 * 365 },
},
},
],
},
manifest: {
id: '/',
name: 'Ponomar — Orthodox Calendar',
short_name: 'Ponomar',
description: 'Orthodox Church calendar and liturgical information',
start_url: '/',
display: 'standalone',
background_color: '#f5f0e8',
theme_color: '#1a1a2e',
orientation: 'portrait',
icons: [
{ src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png', purpose: 'any maskable' },
{ src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'any maskable' },
],
},
}),
],
server: {
port: 5173,
strictPort: false,
},
build: {
outDir: 'dist',
sourcemap: true,
},
define: {
__BUILD_DATE__: JSON.stringify(new Date().toISOString().slice(0, 10)),
},
publicDir: 'static',
});