Files
Starseed/frontend/nuxt.config.ts
T
Matthieu 6ee332757c
Auto Tag Develop / tag (push) Successful in 14s
feat(infra) : branche le SDK Sentry (back + front) vers GlitchTip + CA racine MALIO
Error tracking centralise : remontee des erreurs back (Symfony) et front (Nuxt)
vers l'instance GlitchTip auto-hebergee. DSN vides par defaut => SDK inerte.

Backend :
- sentry/sentry-symfony ^5.10, bundle enregistre prod-only
- config/packages/sentry.yaml : handler Monolog niveau ERROR+, ignore 4xx/AccessDenied,
  pas d'APM, release = %app.version%
- .env : bloc SENTRY_DSN documente (vide => inerte)

Frontend :
- @sentry/nuxt ^10.61, module charge uniquement si NUXT_PUBLIC_SENTRY_DSN defini
- runtimeConfig.public.sentry + source maps (hidden) + options d'upload
- sentry.client.config.ts : init cote client gardee par if (dsn)

Deploiement :
- Dockerfile : ARG Sentry au build front (prefixe inline du RUN, token non persiste)
  + CA racine interne MALIO (update-ca-certificates) pour le handshake HTTPS GlitchTip back
- build-docker.yml : --build-arg depuis les secrets Gitea
- .env.prod.example : SENTRY_DSN (back, runtime)
2026-06-29 17:43:35 +02:00

118 lines
3.7 KiB
TypeScript

import { readdirSync, existsSync } from 'node:fs'
import { resolve } from 'node:path'
// Auto-detect module layers: every directory under frontend/modules/ becomes a Nuxt layer.
const modulesDir = resolve(__dirname, 'modules')
const moduleDirs = existsSync(modulesDir)
? readdirSync(modulesDir, { withFileTypes: true })
.filter(d => d.isDirectory())
.map(d => d.name)
: []
const moduleLayers = moduleDirs.map(name => `./modules/${name}`)
// Auto-detect composables dirs pour chaque layer module. Necessaire car le
// `imports.dirs` explicite ci-dessous override le comportement par defaut
// de Nuxt (qui scannerait composables/ de chaque layer automatiquement).
// Sans ca, useCurrentSite / autres composables des modules ne seraient pas
// resolus a l'execution — cf. ticket 3 bug detecte apres review.
const moduleComposableDirs = moduleDirs
.map(name => `./modules/${name}/composables`)
.filter(path => existsSync(resolve(__dirname, path)))
export default defineNuxtConfig({
compatibilityDate: '2025-07-15',
devtools: {enabled: false},
ssr: false,
srcDir: '.',
css: ['~/assets/css/main.css'],
app: {
baseURL: process.env.NODE_ENV === 'production'
? (process.env.NUXT_PUBLIC_APP_BASE || '/')
: '/'
},
extends: [
'@malio/layer-ui',
...moduleLayers,
],
modules: [
'@nuxtjs/tailwindcss',
'@pinia/nuxt',
'nuxt-toast',
'@nuxtjs/i18n',
'@nuxt/icon',
// Error tracking → GlitchTip. Module charge uniquement si un DSN est fourni
// (build prod) ; en dev sans DSN, aucun overhead Sentry. Les options d'upload
// des source maps sont passees en ligne (fournies au build via secrets CI).
...(process.env.NUXT_PUBLIC_SENTRY_DSN
? [['@sentry/nuxt/module', {
sourceMapsUploadOptions: {
url: process.env.SENTRY_URL,
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
authToken: process.env.SENTRY_AUTH_TOKEN,
},
}] as [string, Record<string, unknown>]]
: []),
],
runtimeConfig: {
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE,
sentry: {
// DSN du projet GlitchTip "starseed-front" (vide => SDK inerte).
dsn: process.env.NUXT_PUBLIC_SENTRY_DSN || '',
environment: process.env.NODE_ENV || 'development',
},
}
},
// Source maps "hidden" : generees et uploadees vers GlitchTip pour des stacktraces
// lisibles, sans exposer les .map au navigateur.
sourcemap: {client: 'hidden'},
devServer: {
port: 3004,
},
dir: {
layouts: 'app/layouts',
middleware: 'app/middleware',
},
components: [
{path: '~/shared/components', pathPrefix: false},
],
imports: {
dirs: [
'shared/composables',
'shared/utils',
'shared/stores',
...moduleComposableDirs,
],
},
vite: {
server: {
allowedHosts: true,
proxy: {
'/api': {
target: 'http://nginx',
changeOrigin: true,
},
},
},
},
toast: {
settings: {
timeout: 2000,
closeOnClick: true,
progressBar: false
}
},
i18n: {
strategy: 'no_prefix',
defaultLocale: 'fr',
langDir: 'locales',
locales: [
{code: 'fr', file: 'fr.json', name: 'Français'}
],
},
typescript: {
strict: true
},
})