/* eslint-disable */
/* prettier-ignore */
// Generated by elegant-router
// Read more: https://github.com/soybeanjs/elegant-router

declare module "@elegant-router/types" {
  type ElegantConstRoute = import('@elegant-router/vue').ElegantConstRoute;

  /**
   * route layout
   */
  export type RouteLayout = "base" | "blank";

  /**
   * route map
   */
  export type RouteMap = {
    "root": "/";
    "not-found": "/:pathMatch(.*)*";
    "exception": "/exception";
    "exception_403": "/exception/403";
    "exception_404": "/exception/404";
    "exception_500": "/exception/500";
    "403": "/403";
    "404": "/404";
    "500": "/500";
    "feedback": "/feedback";
    "iframe-page": "/iframe-page/:url";
    "infra": "/infra";
    "infra_log-management": "/infra/log-management";
    "infra_log-management_api-access-log": "/infra/log-management/api-access-log";
    "infra_log-management_api-error-log": "/infra/log-management/api-error-log";
    "infra_log-management_login-log": "/infra/log-management/login-log";
    "infra_log-management_operate-log": "/infra/log-management/operate-log";
    "infra_rd-code": "/infra/rd-code";
    "infra_state-machine": "/infra/state-machine";
    "login": "/login/:module(pwd-login|reset-pwd)?";
    "metrics": "/metrics";
    "metrics_member-efficiency": "/metrics/member-efficiency";
    "metrics_project-progress": "/metrics/project-progress";
    "metrics_worktime": "/metrics/worktime";
    "personal-center": "/personal-center";
    "personal-center_my-application": "/personal-center/my-application";
    "personal-center_my-item": "/personal-center/my-item";
    "personal-center_my-performance": "/personal-center/my-performance";
    "personal-center_my-profile": "/personal-center/my-profile";
    "personal-center_overtime-application": "/personal-center/overtime-application";
    "personal-center_pending-approval": "/personal-center/pending-approval";
    "personal-center_work-report": "/personal-center/work-report";
    "personal-center_work-report_monthly": "/personal-center/work-report/monthly";
    "personal-center_work-report_project": "/personal-center/work-report/project";
    "personal-center_work-report_weekly": "/personal-center/work-report/weekly";
    "product": "/product";
    "product_dashboard": "/product/dashboard";
    "product_list": "/product/list";
    "product_requirement": "/product/requirement";
    "product_setting": "/product/setting";
    "project": "/project";
    "project_list": "/project/list";
    "project_project": "/project/project";
    "project_project_execution": "/project/project/execution";
    "project_project_overview": "/project/project/overview";
    "project_project_requirement": "/project/project/requirement";
    "project_project_setting": "/project/project/setting";
    "system": "/system";
    "system_dict": "/system/dict";
    "system_menu": "/system/menu";
    "system_post": "/system/post";
    "system_role": "/system/role";
    "system_user": "/system/user";
    "system_user-detail": "/system/user-detail/:id";
    "system_user-management-relation": "/system/user-management-relation";
    "ticket": "/ticket";
    "ticket_my-pending": "/ticket/my-pending";
    "ticket_my-submitted": "/ticket/my-submitted";
    "workbench": "/workbench";
  };

  /**
   * route key
   */
  export type RouteKey = keyof RouteMap;

  /**
   * route path
   */
  export type RoutePath = RouteMap[RouteKey];

  /**
   * custom route key
   */
  export type CustomRouteKey = Extract<
    RouteKey,
    | "root"
    | "not-found"
    | "exception"
    | "exception_403"
    | "exception_404"
    | "exception_500"
  >;

  /**
   * the generated route key
   */
  export type GeneratedRouteKey = Exclude<RouteKey, CustomRouteKey>;

  /**
   * the first level route key, which contain the layout of the route
   */
  export type FirstLevelRouteKey = Extract<
    RouteKey,
    | "403"
    | "404"
    | "500"
    | "feedback"
    | "iframe-page"
    | "infra"
    | "login"
    | "metrics"
    | "personal-center"
    | "product"
    | "project"
    | "system"
    | "ticket"
    | "workbench"
  >;

  /**
   * the custom first level route key
   */
  export type CustomFirstLevelRouteKey = Extract<
    CustomRouteKey,
    | "root"
    | "not-found"
    | "exception"
  >;

  /**
   * the last level route key, which has the page file
   */
  export type LastLevelRouteKey = Extract<
    RouteKey,
    | "403"
    | "404"
    | "500"
    | "iframe-page"
    | "login"
    | "feedback"
    | "infra_log-management_api-access-log"
    | "infra_log-management_api-error-log"
    | "infra_log-management"
    | "infra_log-management_login-log"
    | "infra_log-management_operate-log"
    | "infra_rd-code"
    | "infra_state-machine"
    | "metrics_member-efficiency"
    | "metrics_project-progress"
    | "metrics_worktime"
    | "personal-center_my-application"
    | "personal-center_my-item"
    | "personal-center_my-performance"
    | "personal-center_my-profile"
    | "personal-center_overtime-application"
    | "personal-center_pending-approval"
    | "personal-center_work-report"
    | "personal-center_work-report_monthly"
    | "personal-center_work-report_project"
    | "personal-center_work-report_weekly"
    | "product_dashboard"
    | "product_list"
    | "product_requirement"
    | "product_setting"
    | "project_list"
    | "project_project_execution"
    | "project_project_overview"
    | "project_project_requirement"
    | "project_project_setting"
    | "system_dict"
    | "system_menu"
    | "system_post"
    | "system_role"
    | "system_user-detail"
    | "system_user-management-relation"
    | "system_user"
    | "ticket_my-pending"
    | "ticket_my-submitted"
    | "workbench"
  >;

  /**
   * the custom last level route key
   */
  export type CustomLastLevelRouteKey = Extract<
    CustomRouteKey,
    | "root"
    | "not-found"
    | "exception_403"
    | "exception_404"
    | "exception_500"
  >;

  /**
   * the single level route key
   */
  export type SingleLevelRouteKey = FirstLevelRouteKey & LastLevelRouteKey;

  /**
   * the custom single level route key
   */
  export type CustomSingleLevelRouteKey = CustomFirstLevelRouteKey & CustomLastLevelRouteKey;

  /**
   * the first level route key, but not the single level
  */
  export type FirstLevelRouteNotSingleKey = Exclude<FirstLevelRouteKey, SingleLevelRouteKey>;

  /**
   * the custom first level route key, but not the single level
   */
  export type CustomFirstLevelRouteNotSingleKey = Exclude<CustomFirstLevelRouteKey, CustomSingleLevelRouteKey>;

  /**
   * the center level route key
   */
  export type CenterLevelRouteKey = Exclude<GeneratedRouteKey, FirstLevelRouteKey | LastLevelRouteKey>;

  /**
   * the custom center level route key
   */
  export type CustomCenterLevelRouteKey = Exclude<CustomRouteKey, CustomFirstLevelRouteKey | CustomLastLevelRouteKey>;

  /**
   * the center level route key
   */
  type GetChildRouteKey<K extends RouteKey, T extends RouteKey = RouteKey> = T extends `${K}_${infer R}`
    ? R extends `${string}_${string}`
      ? never
      : T
    : never;

  /**
   * the single level route
   */
  type SingleLevelRoute<K extends SingleLevelRouteKey = SingleLevelRouteKey> = K extends string
    ? Omit<ElegantConstRoute, 'children'> & {
        name: K;
        path: RouteMap[K];
        component: `layout.${RouteLayout}$view.${K}`;
      }
    : never;

  /**
   * the last level route
   */
  type LastLevelRoute<K extends GeneratedRouteKey> = K extends LastLevelRouteKey
    ? Omit<ElegantConstRoute, 'children'> & {
        name: K;
        path: RouteMap[K];
        component: `view.${K}`;
      }
    : never;
  
  /**
   * the center level route
   */
  type CenterLevelRoute<K extends GeneratedRouteKey> = K extends CenterLevelRouteKey
    ? Omit<ElegantConstRoute, 'component'> & {
        name: K;
        path: RouteMap[K];
        children: (CenterLevelRoute<GetChildRouteKey<K>> | LastLevelRoute<GetChildRouteKey<K>>)[];
      }
    : never;

  /**
   * the multi level route
   */
  type MultiLevelRoute<K extends FirstLevelRouteNotSingleKey = FirstLevelRouteNotSingleKey> = K extends string
    ? ElegantConstRoute & {
        name: K;
        path: RouteMap[K];
        component: `layout.${RouteLayout}`;
        children: (CenterLevelRoute<GetChildRouteKey<K>> | LastLevelRoute<GetChildRouteKey<K>>)[];
      }
    : never;
  
  /**
   * the custom first level route
   */
  type CustomSingleLevelRoute<K extends CustomFirstLevelRouteKey = CustomFirstLevelRouteKey> = K extends string
    ? Omit<ElegantConstRoute, 'children'> & {
        name: K;
        path: RouteMap[K];
        component?: `layout.${RouteLayout}$view.${LastLevelRouteKey}`;
      }
    : never;

  /**
   * the custom last level route
   */
  type CustomLastLevelRoute<K extends CustomRouteKey> = K extends CustomLastLevelRouteKey
    ? Omit<ElegantConstRoute, 'children'> & {
        name: K;
        path: RouteMap[K];
        component?: `view.${LastLevelRouteKey}`;
      }
    : never;

  /**
   * the custom center level route
   */
  type CustomCenterLevelRoute<K extends CustomRouteKey> = K extends CustomCenterLevelRouteKey
    ? Omit<ElegantConstRoute, 'component'> & {
        name: K;
        path: RouteMap[K];
        children: (CustomCenterLevelRoute<GetChildRouteKey<K>> | CustomLastLevelRoute<GetChildRouteKey<K>>)[];
      }
    : never;

  /**
   * the custom multi level route
   */
  type CustomMultiLevelRoute<K extends CustomFirstLevelRouteNotSingleKey = CustomFirstLevelRouteNotSingleKey> =
    K extends string
      ? ElegantConstRoute & {
          name: K;
          path: RouteMap[K];
          component: `layout.${RouteLayout}`;
          children: (CustomCenterLevelRoute<GetChildRouteKey<K>> | CustomLastLevelRoute<GetChildRouteKey<K>>)[];
        }
      : never;

  /**
   * the custom route
   */
  type CustomRoute = CustomSingleLevelRoute | CustomMultiLevelRoute;

  /**
   * the generated route
   */
  type GeneratedRoute = SingleLevelRoute | MultiLevelRoute;

  /**
   * the elegant route
   */
  type ElegantRoute = GeneratedRoute | CustomRoute;
}
