transform.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /* eslint-disable */
  2. /* prettier-ignore */
  3. // Generated by elegant-router
  4. // Read more: https://github.com/soybeanjs/elegant-router
  5. import type { RouteRecordRaw, RouteComponent } from 'vue-router';
  6. import type { ElegantConstRoute } from '@elegant-router/vue';
  7. import type { RouteMap, RouteKey, RoutePath } from '@elegant-router/types';
  8. /**
  9. * transform elegant const routes to vue routes
  10. * @param routes elegant const routes
  11. * @param layouts layout components
  12. * @param views view components
  13. */
  14. export function transformElegantRoutesToVueRoutes(
  15. routes: ElegantConstRoute[],
  16. layouts: Record<string, RouteComponent | (() => Promise<RouteComponent>)>,
  17. views: Record<string, RouteComponent | (() => Promise<RouteComponent>)>
  18. ) {
  19. return routes.flatMap(route => transformElegantRouteToVueRoute(route, layouts, views));
  20. }
  21. /**
  22. * transform elegant route to vue route
  23. * @param route elegant const route
  24. * @param layouts layout components
  25. * @param views view components
  26. */
  27. function transformElegantRouteToVueRoute(
  28. route: ElegantConstRoute,
  29. layouts: Record<string, RouteComponent | (() => Promise<RouteComponent>)>,
  30. views: Record<string, RouteComponent | (() => Promise<RouteComponent>)>
  31. ) {
  32. const LAYOUT_PREFIX = 'layout.';
  33. const VIEW_PREFIX = 'view.';
  34. const ROUTE_DEGREE_SPLITTER = '_';
  35. const FIRST_LEVEL_ROUTE_COMPONENT_SPLIT = '$';
  36. function isLayout(component: string) {
  37. return component.startsWith(LAYOUT_PREFIX);
  38. }
  39. function getLayoutName(component: string) {
  40. const layout = component.replace(LAYOUT_PREFIX, '');
  41. if(!layouts[layout]) {
  42. throw new Error(`Layout component "${layout}" not found`);
  43. }
  44. return layout;
  45. }
  46. function isView(component: string) {
  47. return component.startsWith(VIEW_PREFIX);
  48. }
  49. function getViewName(component: string) {
  50. const view = component.replace(VIEW_PREFIX, '');
  51. if(!views[view]) {
  52. throw new Error(`View component "${view}" not found`);
  53. }
  54. return view;
  55. }
  56. function isFirstLevelRoute(item: ElegantConstRoute) {
  57. return !item.name.includes(ROUTE_DEGREE_SPLITTER);
  58. }
  59. function isSingleLevelRoute(item: ElegantConstRoute) {
  60. return isFirstLevelRoute(item) && !item.children?.length;
  61. }
  62. function getSingleLevelRouteComponent(component: string) {
  63. const [layout, view] = component.split(FIRST_LEVEL_ROUTE_COMPONENT_SPLIT);
  64. return {
  65. layout: getLayoutName(layout),
  66. view: getViewName(view)
  67. };
  68. }
  69. const vueRoutes: RouteRecordRaw[] = [];
  70. // add props: true to route
  71. if (route.path.includes(':') && !route.props) {
  72. route.props = true;
  73. }
  74. const { name, path, component, children, ...rest } = route;
  75. const vueRoute = { name, path, ...rest } as RouteRecordRaw;
  76. try {
  77. if (component) {
  78. if (isSingleLevelRoute(route)) {
  79. const { layout, view } = getSingleLevelRouteComponent(component);
  80. const singleLevelRoute: RouteRecordRaw = {
  81. path,
  82. component: layouts[layout],
  83. meta: {
  84. title: route.meta?.title || ''
  85. },
  86. children: [
  87. {
  88. name,
  89. path: '',
  90. component: views[view],
  91. ...rest
  92. } as RouteRecordRaw
  93. ]
  94. };
  95. return [singleLevelRoute];
  96. }
  97. if (isLayout(component)) {
  98. const layoutName = getLayoutName(component);
  99. vueRoute.component = layouts[layoutName];
  100. }
  101. if (isView(component)) {
  102. const viewName = getViewName(component);
  103. vueRoute.component = views[viewName];
  104. }
  105. }
  106. } catch (error: any) {
  107. console.error(`Error transforming route "${route.name}": ${error.toString()}`);
  108. return [];
  109. }
  110. // add redirect to child
  111. if (children?.length && !vueRoute.redirect) {
  112. vueRoute.redirect = {
  113. name: children[0].name
  114. };
  115. }
  116. if (children?.length) {
  117. const childRoutes = children.flatMap(child => transformElegantRouteToVueRoute(child, layouts, views));
  118. if(isFirstLevelRoute(route)) {
  119. vueRoute.children = childRoutes;
  120. } else {
  121. vueRoutes.push(...childRoutes);
  122. }
  123. }
  124. vueRoutes.unshift(vueRoute);
  125. return vueRoutes;
  126. }
  127. /**
  128. * map of route name and route path
  129. */
  130. const routeMap: RouteMap = {
  131. "root": "/",
  132. "not-found": "/:pathMatch(.*)*",
  133. "exception": "/exception",
  134. "exception_403": "/exception/403",
  135. "exception_404": "/exception/404",
  136. "exception_500": "/exception/500",
  137. "document": "/document",
  138. "document_project": "/document/project",
  139. "document_project-link": "/document/project-link",
  140. "document_video": "/document/video",
  141. "document_vue": "/document/vue",
  142. "document_vite": "/document/vite",
  143. "document_unocss": "/document/unocss",
  144. "document_naive": "/document/naive",
  145. "document_pro-naive": "/document/pro-naive",
  146. "document_antd": "/document/antd",
  147. "document_alova": "/document/alova",
  148. "403": "/403",
  149. "404": "/404",
  150. "500": "/500",
  151. "goods-center": "/goods-center",
  152. "goods-center_store-goods": "/goods-center/store-goods",
  153. "goods-center_type-admin": "/goods-center/type-admin",
  154. "government": "/government",
  155. "government_government-list": "/government/government-list",
  156. "government_points": "/government/points",
  157. "government_user-list": "/government/user-list",
  158. "home": "/home",
  159. "iframe-page": "/iframe-page/:url",
  160. "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?",
  161. "manage": "/manage",
  162. "manage_config": "/manage/config",
  163. "manage_department": "/manage/department",
  164. "manage_dict": "/manage/dict",
  165. "manage_log": "/manage/log",
  166. "manage_menu": "/manage/menu",
  167. "manage_role": "/manage/role",
  168. "manage_schedule": "/manage/schedule",
  169. "manage_user": "/manage/user",
  170. "test": "/test",
  171. "user-center": "/user-center",
  172. "user-management": "/user-management",
  173. "user-management_user-list": "/user-management/user-list",
  174. "xsb-manage": "/xsb-manage",
  175. "xsb-manage_advertisement": "/xsb-manage/advertisement",
  176. "xsb-manage_fright-config": "/xsb-manage/fright-config",
  177. "xsb-manage_search": "/xsb-manage/search",
  178. "xsb-manage_store-info": "/xsb-manage/store-info"
  179. };
  180. /**
  181. * get route path by route name
  182. * @param name route name
  183. */
  184. export function getRoutePath<T extends RouteKey>(name: T) {
  185. return routeMap[name];
  186. }
  187. /**
  188. * get route name by route path
  189. * @param path route path
  190. */
  191. export function getRouteName(path: RoutePath) {
  192. const routeEntries = Object.entries(routeMap) as [RouteKey, RoutePath][];
  193. const routeName: RouteKey | null = routeEntries.find(([, routePath]) => routePath === path)?.[0] || null;
  194. return routeName;
  195. }