All files / src/router index.ts

0% Statements 0/71
0% Branches 0/1
0% Functions 0/1
0% Lines 0/71

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83                                                                                                                                                                     
import {createRouter, createWebHistory, type RouteRecordRaw} from 'vue-router'
import {routes as baseRoutes } from './config'
import {useAuth} from '@/composables/useAuth'
import {useSchemaLogger} from '@/libs/logger/logger'
import {useLoadingStore} from '@/stores/loading'
 
function normalizeRoutes(routes: RouteRecordRaw[]): RouteRecordRaw[] {
  routes.forEach((route) => {
    // meta補完(そのままミューテート)
    route.meta ??= {}
    if (route.meta.requiredAuth === undefined) {
      route.meta.requiredAuth = true
    }
 
    // 子も再帰的に
    if (route.children?.length) {
      normalizeRoutes(route.children)
    }
  })
  return routes
}
 
const routes = normalizeRoutes(baseRoutes)
const router = createRouter({
  history: createWebHistory(),
  linkActiveClass: 'active',
  routes,
})
 
const logger = useSchemaLogger({ module: 'router' })
 
router.beforeEach(async (to, from, next) => {
  const s = useLoadingStore()
  ;(router as any).__loadingToken = s.start('route')
  logger.debug('beforeEach', {
    from: from,
    to: to,
  })
  // const isLoggedIn = !!auth.currentUser
  const { isAuthenticated, refreshIdToken } = useAuth()
  console.log(`is logged in : ${isAuthenticated}`)
  if (to.meta.requiresAuth && !isAuthenticated) {
    logger.warn('blocked (unauthorized.)', { from: from,to: to, })
    next({ name: 'Forbidden' })
  } else if (to.meta.requiresAuth && !await refreshIdToken(false)) {
    logger.warn('blocked (can not refresh idToken.)', { from: from,to: to, })
    next({ name: 'Home' })
  }
  if (to.meta.guestOnly && isAuthenticated) {
    logger.warn('blocked guest Only (authorized)', { from: from,to: to, })
    next({ name: 'Dashboard' })
  }
  next()
})
 
router.afterEach(async (to, from, failure) => {
  if (failure) {
    logger.error('afterEach (failed)', {
      from: from,
      to: to,
      failure,
    })
  } else {
    logger.debug('afterEach (success)', {
      from: from,
      to: to,
    })
  }
  const s = useLoadingStore()
  const token: symbol | undefined = (router as any).__loadingToken
  if (token) s.stop(token)
  ;(router as any).__loadingToken = undefined
})
 
// エラーハンドリング
router.onError((err, to) => {
  logger.error('router error', {
    to: to,
    error: err,
  })
})
export default router