112 lines
2.6 KiB
TypeScript
112 lines
2.6 KiB
TypeScript
import { defineConfig } from 'vitest/config';
|
|
import { playwright } from '@vitest/browser-playwright';
|
|
import tailwindcss from '@tailwindcss/vite';
|
|
import { sveltekit } from '@sveltejs/kit/vite';
|
|
import { VitePWA } from 'vite-plugin-pwa';
|
|
|
|
const backendTarget = process.env.BACKEND_URL ?? 'http://localhost:3000';
|
|
const enableProxy = process.env.USE_VITE_PROXY === 'true';
|
|
|
|
const proxiedPaths = [
|
|
'/api',
|
|
'/devices',
|
|
'/device-links',
|
|
'/streams',
|
|
'/events',
|
|
'/recordings',
|
|
'/videos',
|
|
'/push-notifications',
|
|
'/socket.io'
|
|
] as const;
|
|
|
|
const proxy = Object.fromEntries(
|
|
proxiedPaths.map((path) => [
|
|
path,
|
|
{
|
|
target: backendTarget,
|
|
changeOrigin: true,
|
|
ws: path === '/socket.io'
|
|
}
|
|
])
|
|
);
|
|
|
|
export default defineConfig({
|
|
plugins: [
|
|
tailwindcss(),
|
|
sveltekit(),
|
|
VitePWA({
|
|
registerType: 'autoUpdate',
|
|
includeAssets: ['icons/apple-touch-icon.png', 'icons/pwa-192x192.png', 'icons/pwa-512x512.png'],
|
|
manifest: {
|
|
name: 'PhoneCam Web Dashboard',
|
|
short_name: 'PhoneCam',
|
|
description: 'Monitor camera devices, motion events, and recordings from an installable web dashboard.',
|
|
theme_color: '#0a0a0c',
|
|
background_color: '#0a0a0c',
|
|
display: 'standalone',
|
|
start_url: '/',
|
|
scope: '/',
|
|
orientation: 'portrait-primary',
|
|
icons: [
|
|
{
|
|
src: 'icons/pwa-192x192.png',
|
|
sizes: '192x192',
|
|
type: 'image/png',
|
|
purpose: 'any'
|
|
},
|
|
{
|
|
src: 'icons/pwa-512x512.png',
|
|
sizes: '512x512',
|
|
type: 'image/png',
|
|
purpose: 'any'
|
|
},
|
|
{
|
|
src: 'icons/maskable-512x512.png',
|
|
sizes: '512x512',
|
|
type: 'image/png',
|
|
purpose: 'maskable'
|
|
}
|
|
]
|
|
},
|
|
workbox: {
|
|
globPatterns: ['**/*.{js,css,html,ico,png,svg,webmanifest}'],
|
|
navigateFallbackDenylist: [/^\/api\//, /^\/devices/, /^\/device-links/, /^\/streams/, /^\/events/, /^\/recordings/, /^\/videos/, /^\/push-notifications/, /^\/socket\.io\//]
|
|
},
|
|
devOptions: {
|
|
enabled: true
|
|
}
|
|
})
|
|
],
|
|
server: {
|
|
proxy: enableProxy ? proxy : undefined
|
|
},
|
|
test: {
|
|
expect: { requireAssertions: true },
|
|
projects: [
|
|
{
|
|
extends: './vite.config.ts',
|
|
test: {
|
|
name: 'client',
|
|
browser: {
|
|
enabled: true,
|
|
provider: playwright(),
|
|
instances: [{ browser: 'chromium', headless: true }]
|
|
},
|
|
include: ['src/**/*.svelte.{test,spec}.{js,ts}'],
|
|
exclude: ['src/lib/server/**']
|
|
}
|
|
},
|
|
|
|
{
|
|
extends: './vite.config.ts',
|
|
test: {
|
|
name: 'server',
|
|
environment: 'node',
|
|
include: ['src/**/*.{test,spec}.{js,ts}'],
|
|
exclude: ['src/**/*.svelte.{test,spec}.{js,ts}']
|
|
}
|
|
}
|
|
]
|
|
}
|
|
});
|