Files
chore/frontend/vite.config.ts
Ryan Kegel ab0d32c6b0
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 2m22s
feat: enhance push notification service worker for chore expirations and update related configurations
2026-05-01 15:34:56 -04:00

62 lines
2.1 KiB
TypeScript

import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import fs from 'fs'
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), '')
const backendHost = env.VITE_BACKEND_HOST ?? '127.0.0.1'
// Use a trusted mkcert cert when present; otherwise fall back to plain HTTP.
// Browsers treat localhost as a secure context even over HTTP, so service
// workers and push notifications work without any cert on localhost.
//
// For cross-device LAN testing (e.g. from a phone), run mkcert once per
// network — the IP in the cert doesn't matter to Vite, just drop the files
// in frontend/ and they'll be picked up automatically:
//
// mkcert localhost <your-current-lan-ip>
// # files are auto-detected; no renaming needed
//
// All *.pem files are gitignored so they stay machine-local.
const httpsConfig = (() => {
// Prefer explicit key.pem / cert.pem (e.g. custom or renamed certs)
if (fs.existsSync('./key.pem') && fs.existsSync('./cert.pem'))
return { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') }
// Auto-detect any mkcert-generated *-key.pem / *.pem pair in this directory.
// mkcert always names files <host>[-key].pem regardless of which IPs are included.
const keyFile = fs.readdirSync('.').find((f) => f.endsWith('-key.pem'))
if (keyFile) {
const certFile = keyFile.replace('-key.pem', '.pem')
if (fs.existsSync(certFile))
return { key: fs.readFileSync(keyFile), cert: fs.readFileSync(certFile) }
}
return undefined
})()
return {
plugins: [vue()],
server: {
host: '0.0.0.0',
https: httpsConfig,
proxy: {
'/api': {
target: `http://${backendHost}:5000`,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
'/events': {
target: `http://${backendHost}:5000`,
changeOrigin: true,
secure: false,
},
},
},
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
}
})