import { createRouter, createWebHistory, isNavigationFailure, NavigationFailureType } from 'vue-router'; import configuracoesRoutes from './routes.configs'; import meRoutes from './routes.account'; import adminRoutes from './routes.clinic'; import authRoutes from './routes.auth'; import billingRoutes from './routes.billing'; import miscRoutes from './routes.misc'; import portalRoutes from './routes.portal'; import publicRoutes from './routes.public'; import saasRoutes from './routes.saas'; import therapistRoutes from './routes.therapist'; import supervisorRoutes from './routes.supervisor'; import editorRoutes from './routes.editor'; import featuresRoutes from './routes.features'; import { pinia } from '@/plugins/pinia' // ← singleton compartilhado import { supportGuard } from '@/support/supportGuard' import { applyGuards } from './guards'; const routes = [ ...(Array.isArray(publicRoutes) ? publicRoutes : [publicRoutes]), ...(Array.isArray(authRoutes) ? authRoutes : [authRoutes]), ...(Array.isArray(miscRoutes) ? miscRoutes : [miscRoutes]), ...(Array.isArray(billingRoutes) ? billingRoutes : [billingRoutes]), ...(Array.isArray(saasRoutes) ? saasRoutes : [saasRoutes]), ...(Array.isArray(meRoutes) ? meRoutes : [meRoutes]), ...(Array.isArray(adminRoutes) ? adminRoutes : [adminRoutes]), ...(Array.isArray(therapistRoutes) ? therapistRoutes : [therapistRoutes]), ...(Array.isArray(supervisorRoutes) ? supervisorRoutes : [supervisorRoutes]), ...(Array.isArray(editorRoutes) ? editorRoutes : [editorRoutes]), ...(Array.isArray(portalRoutes) ? portalRoutes : [portalRoutes]), ...(Array.isArray(configuracoesRoutes) ? configuracoesRoutes : [configuracoesRoutes]), ...(Array.isArray(featuresRoutes) ? featuresRoutes : [featuresRoutes]), // ✅ compat: rota antiga /login → /auth/login { path: '/login', redirect: (to) => ({ path: '/auth/login', query: to.query || {} }) }, ]; const router = createRouter({ history: createWebHistory(), routes, scrollBehavior(to, from, savedPosition) { if (savedPosition) return savedPosition; return false; } }); /* 🔎 DEBUG: listar todas as rotas registradas */ console.log( '[ROUTES]', router.getRoutes().map((r) => r.path).sort() ); // ===== DEBUG NAV + TRACE (remover depois) ===== const _push = router.push.bind(router); router.push = async (loc) => { console.log('[router.push]', loc); console.trace('[push caller]'); const res = await _push(loc); if (isNavigationFailure(res, NavigationFailureType.duplicated)) console.warn('[NAV FAIL] duplicated', res); else if (isNavigationFailure(res, NavigationFailureType.cancelled)) console.warn('[NAV FAIL] cancelled', res); else if (isNavigationFailure(res, NavigationFailureType.aborted)) console.warn('[NAV FAIL] aborted', res); else if (isNavigationFailure(res, NavigationFailureType.redirected)) console.warn('[NAV FAIL] redirected', res); return res; }; const _replace = router.replace.bind(router); router.replace = async (loc) => { console.log('[router.replace]', loc); console.trace('[replace caller]'); const res = await _replace(loc); if (isNavigationFailure(res, NavigationFailureType.cancelled)) console.warn('[NAV FAIL replace] cancelled', res); else if (isNavigationFailure(res, NavigationFailureType.aborted)) console.warn('[NAV FAIL replace] aborted', res); else if (isNavigationFailure(res, NavigationFailureType.redirected)) console.warn('[NAV FAIL replace] redirected', res); return res; }; router.onError((e) => console.error('[router.onError]', e)); // ✅ support guard — passa pinia para garantir acesso ao store antes do app.use(pinia) router.beforeEach(async (to) => { await supportGuard(to, pinia) }) router.beforeEach((to, from) => { console.log('[beforeEach]', from.fullPath, '->', to.fullPath); return true; }); router.afterEach((to, from, failure) => { if (failure) console.warn('[afterEach failure]', failure); else console.log('[afterEach ok]', from.fullPath, '->', to.fullPath); }); // ===== /DEBUG NAV + TRACE ===== applyGuards(router); export default router;