adapt-authoring-server/lib/utils/generateRouterMap.js

/**
 * Generates a map for a given router
 * @param {Router} topRouter
 * @return {Object} The route map
 * @memberof server
 */
export function generateRouterMap (topRouter) {
  return topRouter.flattenRouters()
    .sort((a, b) => a.root.localeCompare(b.root))
    .reduce((m, r) => {
      const key = `${getRelativeRoute(topRouter, r)}endpoints`
      const endpoints = getEndpoints(r)
      return endpoints.length ? { ...m, [key]: endpoints } : m
    }, {})
}

/** @ignore */
function getEndpoints (r) {
  return r.routes.map(route => {
    return {
      url: `${r.url}${route.route}`,
      accepted_methods: Object.keys(route.handlers).reduce((memo, method) => {
        return {
          ...memo,
          [method]: route?.meta?.[method] ?? {}
        }
      }, {})
    }
  })
}

/** @ignore */
function getRelativeRoute (relFrom, relTo) {
  if (relFrom === relTo) {
    return `${relFrom.route}_`
  }
  let route = ''
  for (let r = relTo; r !== relFrom; r = r.parentRouter) route = `${r.root}_${route}`
  return route
}