Files
carvalho-finances/apps/web/vite.config.ts
T
Mlcavalho1andClaude Sonnet 4.6 d20892977d feat(#34): PWA instalável com cache do shell para Android
- vite-plugin-pwa com Workbox (generateSW, autoUpdate)
- manifest.webmanifest: standalone, theme #0a0418, ícones 192/512
- Service worker pré-cacheia 29 entradas (shell completo offline)
- Google Fonts cacheadas via CacheFirst (1 ano)
- Ícone pixel art Arcade Neon (SVG + PNGs gerados)
- Meta tags PWA e apple-touch-icon no index.html

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-27 11:57:56 -03:00

80 lines
2.1 KiB
TypeScript

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { fileURLToPath, URL } from 'node:url'
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
vue(),
VitePWA({
registerType: 'autoUpdate',
includeAssets: ['pwa-icon.svg', 'apple-touch-icon.png'],
manifest: {
name: 'Financeiro Carvalho',
short_name: 'Financeiro',
description: 'Controle financeiro pessoal — Arcade Neon',
theme_color: '#0a0418',
background_color: '#0a0418',
display: 'standalone',
orientation: 'portrait',
scope: '/',
start_url: '/',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
},
{
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
},
],
},
workbox: {
globPatterns: ['**/*.{js,css,html,svg,png,woff2}'],
runtimeCaching: [
{
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
handler: 'CacheFirst',
options: {
cacheName: 'google-fonts-cache',
expiration: { maxEntries: 10, maxAgeSeconds: 60 * 60 * 24 * 365 },
cacheableResponse: { statuses: [0, 200] },
},
},
{
urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
handler: 'CacheFirst',
options: {
cacheName: 'gstatic-fonts-cache',
expiration: { maxEntries: 10, maxAgeSeconds: 60 * 60 * 24 * 365 },
cacheableResponse: { statuses: [0, 200] },
},
},
],
},
}),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
},
},
},
})