107 lines
3.3 KiB
TypeScript
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'],
|
|
},
|
|
}
|
|
})
|