Add the web app manifest, icons and service worker via vite-plugin-pwa
CI / ci (push) Successful in 1m34s
Independent review Codex gpt-6-sol high: APPROVED (0 findings)
CI / ci (pull_request) Successful in 1m36s

vite-plugin-pwa runs in injectManifest mode over a minimal src/sw.ts that
caches the injected precache list on install. The manifest lives in
web/manifest.json (MealQuest, standalone at /, Grape theme over the page
background) with 192, 512 and maskable 512 PNG icons and a 180 px
apple-touch-icon, all generated from design/logos/logo_v1_2Oct2026.jpg by
web/scripts/generate-icons.py.

The plugin links the manifest and adds the registerSW.js script only in
production builds. src/pwa.test.ts builds and previews the app to assert
the shipped manifest, sw.js, icon sizes and registration, and checks that
the dev server registers nothing.

Maestro task: 58b74786-937a-45a5-850f-7913273beba2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 16:12:18 -04:00
co-authored by Claude Opus 5.5
parent d80012a821
commit 46cc7500de
14 changed files with 5488 additions and 4 deletions
+19 -1
View File
@@ -1,10 +1,28 @@
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
import { VitePWA, type ManifestOptions } from 'vite-plugin-pwa'
import manifest from './manifest.json' with { type: 'json' }
const backend = 'http://localhost:8080'
export default defineConfig({
plugins: [react()],
plugins: [
react(),
// The plugin writes manifest.webmanifest and sw.js, links the manifest
// from index.html and adds the registerSW.js script. It does both only
// in production builds: dev options stay off, so neither `vite` nor
// Vitest registers a service worker.
VitePWA({
strategies: 'injectManifest',
srcDir: 'src',
filename: 'sw.ts',
injectRegister: 'script',
// The web manifest lives in manifest.json: its theme and background
// colours are --color-accent and --color-bg from src/styles/tokens.css,
// and hex colours may not be written in TypeScript.
manifest: manifest as Partial<ManifestOptions>,
}),
],
server: {
proxy: {
'/api': backend,