Files

61 lines
1.8 KiB
TypeScript
Raw Permalink Normal View History

import { defineConfig } from 'vitest/config';
import adapter from '@sveltejs/adapter-node';
import { sveltekit } from '@sveltejs/kit/vite';
// Sous-chemin de montage (YunoHost sert l'app sous https://domaine.tld/<path>).
// Injecté au build par le script d'install YNH (BASE_PATH=/veille-ia npm run build).
// Vide en dev local. Doit commencer par '/' et ne pas finir par '/'.
const envBasePath = process.env.BASE_PATH ?? '';
if (envBasePath !== '' && (!envBasePath.startsWith('/') || envBasePath.endsWith('/'))) {
throw new Error(`BASE_PATH invalide : "${envBasePath}" (doit commencer par '/' sans '/' final)`);
}
const basePath = envBasePath as '' | `/${string}`;
export default defineConfig({
plugins: [
sveltekit({
compilerOptions: {
// Force runes mode for the project, except for libraries. Can be removed in svelte 6.
runes: ({ filename }) =>
filename.split(/[/\\]/).includes('node_modules') ? undefined : true
},
adapter: adapter(),
paths: {
base: basePath,
// Obligatoire dès que paths.base est utilisé (évite les URLs relatives cassées).
relative: false
},
csp: {
mode: 'nonce',
directives: {
'default-src': ['self'],
'script-src': ['self'],
// Les transitions Svelte créent des <style> inline : unsafe-inline requis.
'style-src': ['self', 'unsafe-inline'],
'img-src': ['self', 'data:'],
'font-src': ['self'],
'connect-src': ['self'],
'frame-ancestors': ['none'],
'base-uri': ['self'],
'form-action': ['self'],
'object-src': ['none']
}
}
})
],
test: {
expect: { requireAssertions: true },
projects: [
{
extends: './vite.config.ts',
test: {
name: 'server',
environment: 'node',
include: ['src/**/*.{test,spec}.{js,ts}'],
exclude: ['src/**/*.svelte.{test,spec}.{js,ts}']
}
}
]
}
});