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]] : []), ], 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 }, })