Files
dyncoll-dev/frontend/vite.config.ts
Giuseppe Naponiello 36bcc9a842 first commit
2026-06-14 19:01:02 +02:00

107 lines
3.3 KiB
TypeScript

import { defineConfig } from 'vitest/config'
import type { Plugin } from 'vite'
import { fileURLToPath } from 'node:url'
import { readdirSync } from 'node:fs'
import tailwindcss from '@tailwindcss/vite'
import { visualizer } from 'rollup-plugin-visualizer'
// MPA: raccoglie automaticamente ogni *.html nella root di frontend/ come entry di build.
// { 'index': '/app/index.html', 'scheda': '/app/scheda.html', ... }
const frontendRoot = fileURLToPath(new URL('.', import.meta.url))
const htmlEntries = Object.fromEntries(
readdirSync(frontendRoot)
.filter((file) => file.endsWith('.html'))
.map((file) => [file.slice(0, -'.html'.length), fileURLToPath(new URL(file, import.meta.url))])
)
function mpaRewritePlugin(): Plugin {
return {
name: 'mpa-rewrite',
configureServer(server: any) {
server.middlewares.use((req: any, _res: any, next: any) => {
if (
req.url &&
!req.url.includes('.') &&
!req.url.startsWith('/@') &&
!req.url.startsWith('/api') &&
!req.url.startsWith('/sanctum') &&
!req.url.startsWith('/storage') &&
!req.url.startsWith('/documentation') &&
!req.url.startsWith('/api-docs') &&
req.url !== '/'
) {
// Mappa il primo segmento del path sul relativo .html.
// Es: /scheda/uno-slug -> /scheda.html (lo slug resta leggibile da location.pathname)
const firstSegment = req.url.split('?')[0].split('/')[1]
req.url = `/${firstSegment}.html`
}
next()
})
}
}
}
export default defineConfig({
plugins: [
tailwindcss(),
visualizer(),
mpaRewritePlugin()
],
resolve: {
// Alias lato Vite/bundler: tsconfig `paths` vale solo per il type-check, Vite
// ha bisogno del proprio alias per risolvere `@/...` a runtime e in build.
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
build: {
rollupOptions: {
// MPA: auto-detect delle pagine. Ogni *.html nella root di frontend/ è un entry
// (nome = file senza estensione). Aggiungere una pagina = creare il suo .html,
// nessuna modifica qui. Vedi htmlEntries sotto.
input: htmlEntries,
}
},
server: {
host: '0.0.0.0',
allowedHosts: ['dyncoll-dev.local'],
port: 5173,
proxy: {
'/api-docs': {
target: 'http://backend:8000',
changeOrigin: true,
secure: false,
rewrite: (path: string) => path.replace(/^\/api-docs/, '/docs')
},
'/api': {
target: 'http://backend:8000',
changeOrigin: true,
secure: false // accetta certificati self-signed
},
'/sanctum': {
target: 'http://backend:8000',
changeOrigin: true,
secure: false,
},
'/storage': {
target: 'http://backend:8000',
changeOrigin: true,
secure: false // accetta certificati self-signed
},
// Documentazione utente (MkDocs) — servizio docker `docs`
'/documentation': {
target: 'http://docs:8000',
changeOrigin: true,
secure: false,
rewrite: (path: string) => path.replace(/^\/documentation/, '') || '/'
}
}
},
test: {
coverage: {
provider: 'v8',
reporter: ['text', 'html', 'lcov'],
},
}
})