@oj-module/runtime 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/api/notifications/index.d.ts +2 -0
  4. package/dist/api/system/menu/index.d.ts +6 -0
  5. package/dist/api/system/menu/types.d.ts +19 -0
  6. package/dist/api/system/role/api/client.d.ts +19 -0
  7. package/dist/api/system/role/api/client.schemas.d.ts +94 -0
  8. package/dist/api/system/role/index.d.ts +9 -0
  9. package/dist/api/system/role/types.d.ts +9 -0
  10. package/dist/api/user/index.d.ts +12 -0
  11. package/dist/api/user/types.d.ts +26 -0
  12. package/dist/components/access-control/index.d.ts +15 -0
  13. package/dist/components/basic-button/index.d.ts +7 -0
  14. package/dist/components/basic-content/index.d.ts +7 -0
  15. package/dist/components/basic-form/form-items/form-avatar-item.d.ts +6 -0
  16. package/dist/components/basic-form/form-items/form-tree-item.d.ts +13 -0
  17. package/dist/components/basic-form/form-items/index.d.ts +2 -0
  18. package/dist/components/basic-form/index.d.ts +1 -0
  19. package/dist/components/basic-table/constants.d.ts +1 -0
  20. package/dist/components/basic-table/index.d.ts +12 -0
  21. package/dist/components/basic-table/styles.d.ts +6 -0
  22. package/dist/components/exception-page/index.d.ts +3 -0
  23. package/dist/components/fullscreen-button/index.d.ts +17 -0
  24. package/dist/components/global-spin/index.d.ts +6 -0
  25. package/dist/components/iframe/index.d.ts +1 -0
  26. package/dist/components/jss-theme-provider/index.d.ts +26 -0
  27. package/dist/components/not-found/index.d.ts +6 -0
  28. package/dist/components/page-error/index.d.ts +2 -0
  29. package/dist/components/scrollbar/index.d.ts +7 -0
  30. package/dist/components/unknown-component/index.d.ts +6 -0
  31. package/dist/constants/options.d.ts +9 -0
  32. package/dist/contract/define-api.d.ts +43 -0
  33. package/dist/contract/define-api.js +44 -0
  34. package/dist/contract/errors.d.ts +16 -0
  35. package/dist/contract/errors.js +20 -0
  36. package/dist/contract/index.d.ts +15 -0
  37. package/dist/contract/index.js +13 -0
  38. package/dist/contract/scoped-request-like.d.ts +25 -0
  39. package/dist/contract/scoped-request-like.js +6 -0
  40. package/dist/hooks/use-access/constants.d.ts +24 -0
  41. package/dist/hooks/use-access/index.d.ts +9 -0
  42. package/dist/hooks/use-css-var/index.d.ts +17 -0
  43. package/dist/hooks/use-current-route/index.d.ts +6 -0
  44. package/dist/hooks/use-device-type/index.d.ts +9 -0
  45. package/dist/hooks/use-language/index.d.ts +5 -0
  46. package/dist/hooks/use-layout-menu/index.d.ts +6 -0
  47. package/dist/hooks/use-layout-style/index.d.ts +19 -0
  48. package/dist/hooks/use-preferences/index.d.ts +61 -0
  49. package/dist/icons/index.d.ts +3 -0
  50. package/dist/icons/local-icons.d.ts +17 -0
  51. package/dist/icons/menu-icons.d.ts +4 -0
  52. package/dist/icons/ri.d.ts +14 -0
  53. package/dist/icons/types.d.ts +9 -0
  54. package/dist/index.d.ts +44 -0
  55. package/dist/layout/constants.d.ts +50 -0
  56. package/dist/layout/container-layout/index.d.ts +11 -0
  57. package/dist/layout/fullscreen-layout/index.d.ts +9 -0
  58. package/dist/layout/hooks/index.d.ts +1 -0
  59. package/dist/layout/hooks/use-layout.d.ts +20 -0
  60. package/dist/layout/keep-alive-layer/index.d.ts +15 -0
  61. package/dist/layout/layout-content/index.d.ts +3 -0
  62. package/dist/layout/layout-effects/index.d.ts +9 -0
  63. package/dist/layout/layout-footer/index.d.ts +5 -0
  64. package/dist/layout/layout-header/components/fullscreen-button.d.ts +2 -0
  65. package/dist/layout/layout-header/components/language-button.d.ts +2 -0
  66. package/dist/layout/layout-header/components/theme-button.d.ts +9 -0
  67. package/dist/layout/layout-header/components/user-menu.d.ts +2 -0
  68. package/dist/layout/layout-header/index.d.ts +5 -0
  69. package/dist/layout/layout-menu/index.d.ts +17 -0
  70. package/dist/layout/layout-menu/style.d.ts +6 -0
  71. package/dist/layout/layout-menu/types.d.ts +26 -0
  72. package/dist/layout/layout-menu/use-menu.d.ts +7 -0
  73. package/dist/layout/layout-menu/utils.d.ts +49 -0
  74. package/dist/layout/layout-mixed-sidebar/first-column-menu.d.ts +9 -0
  75. package/dist/layout/layout-mixed-sidebar/index.d.ts +14 -0
  76. package/dist/layout/layout-mobile-menu/index.d.ts +1 -0
  77. package/dist/layout/layout-root/index.d.ts +5 -0
  78. package/dist/layout/layout-sidebar/index.d.ts +5 -0
  79. package/dist/layout/layout-tabbar/components/draggable-tab-bar.d.ts +16 -0
  80. package/dist/layout/layout-tabbar/components/tab-maximize.d.ts +10 -0
  81. package/dist/layout/layout-tabbar/components/tab-options.d.ts +17 -0
  82. package/dist/layout/layout-tabbar/hooks/use-dropdown-menu.d.ts +26 -0
  83. package/dist/layout/layout-tabbar/index.d.ts +5 -0
  84. package/dist/layout/layout-tabbar/style.d.ts +6 -0
  85. package/dist/layout/parent-layout/index.d.ts +1 -0
  86. package/dist/layout/widgets/breadcrumb-views/index.d.ts +1 -0
  87. package/dist/layout/widgets/global-search/components/search-footer.d.ts +5 -0
  88. package/dist/layout/widgets/global-search/components/search-panel.d.ts +11 -0
  89. package/dist/layout/widgets/global-search/index.d.ts +1 -0
  90. package/dist/layout/widgets/logo/index.d.ts +9 -0
  91. package/dist/layout/widgets/notification/index.d.ts +19 -0
  92. package/dist/layout/widgets/notification/notification-container.d.ts +2 -0
  93. package/dist/layout/widgets/notification/types.d.ts +7 -0
  94. package/dist/layout/widgets/preferences/blocks/animation/index.d.ts +1 -0
  95. package/dist/layout/widgets/preferences/blocks/footer/index.d.ts +1 -0
  96. package/dist/layout/widgets/preferences/blocks/general/index.d.ts +1 -0
  97. package/dist/layout/widgets/preferences/blocks/general/utils.d.ts +1 -0
  98. package/dist/layout/widgets/preferences/blocks/index.d.ts +7 -0
  99. package/dist/layout/widgets/preferences/blocks/layout/constants.d.ts +4 -0
  100. package/dist/layout/widgets/preferences/blocks/layout/index.d.ts +1 -0
  101. package/dist/layout/widgets/preferences/blocks/sidebar/index.d.ts +1 -0
  102. package/dist/layout/widgets/preferences/blocks/tabbar/index.d.ts +1 -0
  103. package/dist/layout/widgets/preferences/blocks/theme/builtin.d.ts +1 -0
  104. package/dist/layout/widgets/preferences/blocks/theme/index.d.ts +2 -0
  105. package/dist/layout/widgets/preferences/blocks/theme/theme.d.ts +1 -0
  106. package/dist/layout/widgets/preferences/index.d.ts +2 -0
  107. package/dist/layout/widgets/preferences/number-input-spinner.d.ts +10 -0
  108. package/dist/layout/widgets/preferences/select-item.d.ts +9 -0
  109. package/dist/layout/widgets/preferences/switch-item.d.ts +8 -0
  110. package/dist/layout/widgets/preferences/text-input.d.ts +8 -0
  111. package/dist/layout/widgets/sider-trigger/index.d.ts +5 -0
  112. package/dist/locales/helper.d.ts +15 -0
  113. package/dist/locales/index.d.ts +18 -0
  114. package/dist/locales/t.d.ts +10 -0
  115. package/dist/module-loader/define-module.d.ts +11 -0
  116. package/dist/module-loader/index.d.ts +20 -0
  117. package/dist/module-loader/keep-alive.d.ts +18 -0
  118. package/dist/module-loader/semver.d.ts +8 -0
  119. package/dist/module-loader/slots.d.ts +9 -0
  120. package/dist/module-loader/types.d.ts +91 -0
  121. package/dist/pages/login/index.d.ts +1 -0
  122. package/dist/plugins/hide-loading.d.ts +1 -0
  123. package/dist/plugins/loading.d.ts +7 -0
  124. package/dist/router/constants.d.ts +1 -0
  125. package/dist/router/extra-info/index.d.ts +1 -0
  126. package/dist/router/extra-info/route-path.d.ts +22 -0
  127. package/dist/router/guard/auth-guard.d.ts +21 -0
  128. package/dist/router/guard/index.d.ts +1 -0
  129. package/dist/router/guard/utils.d.ts +2 -0
  130. package/dist/router/index.d.ts +12 -0
  131. package/dist/router/routes/config.d.ts +7 -0
  132. package/dist/router/routes/core/auth.d.ts +13 -0
  133. package/dist/router/routes/core/exception.d.ts +12 -0
  134. package/dist/router/routes/core/fallback.d.ts +3 -0
  135. package/dist/router/routes/core/index.d.ts +2 -0
  136. package/dist/router/routes/index.d.ts +118 -0
  137. package/dist/router/types.d.ts +90 -0
  138. package/dist/router/utils/add-route-id-by-path.d.ts +81 -0
  139. package/dist/router/utils/ascending.d.ts +99 -0
  140. package/dist/router/utils/flatten-routes.d.ts +5 -0
  141. package/dist/router/utils/generate-menu-items-from-routes.d.ts +10 -0
  142. package/dist/router/utils/generate-routes-from-backend.d.ts +79 -0
  143. package/dist/router/utils/generate-routes-from-frontend.d.ts +5 -0
  144. package/dist/router/utils/merge-route-modules.d.ts +2 -0
  145. package/dist/router/utils/remove-trailing-slash.d.ts +10 -0
  146. package/dist/router/utils/resolve-layout.d.ts +17 -0
  147. package/dist/router/utils/resolve-login-route.d.ts +31 -0
  148. package/dist/runtime.js +27121 -0
  149. package/dist/store/access.d.ts +14 -0
  150. package/dist/store/api-provider.d.ts +47 -0
  151. package/dist/store/auth-provider.d.ts +19 -0
  152. package/dist/store/auth.d.ts +20 -0
  153. package/dist/store/global.d.ts +12 -0
  154. package/dist/store/preferences/index.d.ts +80 -0
  155. package/dist/store/preferences/types.d.ts +254 -0
  156. package/dist/store/tabs.d.ts +343 -0
  157. package/dist/store/user.d.ts +7 -0
  158. package/dist/types/app-info.d.ts +18 -0
  159. package/dist/utils/cn/index.d.ts +2 -0
  160. package/dist/utils/dom/index.d.ts +14 -0
  161. package/dist/utils/get-all-expanded-keys/index.d.ts +1 -0
  162. package/dist/utils/get-app-info/index.d.ts +13 -0
  163. package/dist/utils/get-app-namespace/index.d.ts +1 -0
  164. package/dist/utils/get-redirect-path.d.ts +8 -0
  165. package/dist/utils/iframe-guard.d.ts +18 -0
  166. package/dist/utils/is/index.d.ts +56 -0
  167. package/dist/utils/is-dark-theme/index.d.ts +7 -0
  168. package/dist/utils/is-light-theme/index.d.ts +7 -0
  169. package/dist/utils/is-windows-os/index.d.ts +6 -0
  170. package/dist/utils/progress/index.d.ts +3 -0
  171. package/dist/utils/remember-route/index.d.ts +1 -0
  172. package/dist/utils/request/constants.d.ts +5 -0
  173. package/dist/utils/request/envelope.d.ts +5 -0
  174. package/dist/utils/request/error-response.d.ts +12 -0
  175. package/dist/utils/request/global-progress.d.ts +21 -0
  176. package/dist/utils/request/go-login.d.ts +6 -0
  177. package/dist/utils/request/header-safe.d.ts +1 -0
  178. package/dist/utils/request/index.d.ts +1 -0
  179. package/dist/utils/request/refresh.d.ts +11 -0
  180. package/dist/utils/request/scoped.d.ts +17 -0
  181. package/dist/utils/request/whitelist.d.ts +1 -0
  182. package/dist/utils/static-antd/index.d.ts +12 -0
  183. package/dist/utils/toggle-html-class/index.d.ts +9 -0
  184. package/dist/utils/tree/index.d.ts +35 -0
  185. package/package.json +71 -0
@@ -0,0 +1,13 @@
1
+ import type { AppRouteRecordRaw } from "../../types";
2
+ /**
3
+ * 内置登录兜底路由(P2,login 模块化)。
4
+ *
5
+ * 与模块形态运行时同构:fullscreen 外壳 + children 内容区。
6
+ * baseRoutes 不经 resolveRouteLayouts 注入(router/index.ts 直接消费),
7
+ * 故内核路由显式挂 FullscreenLayout;模块侧则声明 `layout: "fullscreen"` 由框架注入。
8
+ *
9
+ * handle.login/internal 供 resolveLoginRoute(P3)识别:存在外部 login
10
+ * 模块路由时剔除本条内置兜底。
11
+ */
12
+ declare const routes: AppRouteRecordRaw[];
13
+ export default routes;
@@ -0,0 +1,12 @@
1
+ import type { AppRouteRecordRaw } from "../../types";
2
+ /**
3
+ * P7.14 / 评审 F11:框架内置 /exception/403|404|500 兜底路由。
4
+ *
5
+ * 守卫硬编码向这三个路径跳转,它们因此是框架契约的一部分,必须由框架
6
+ * 自己兜底(此前依赖可禁用的 modules/exception 提供)。exception 模块
7
+ * 启用时其同路径路由优先——auth-guard 只在路径未被任何来源覆盖时
8
+ * 注入本兜底(见 ensureBuiltinExceptionRoutes)。
9
+ */
10
+ export declare const builtinExceptionRoutes: AppRouteRecordRaw[];
11
+ /** 目标路径未被覆盖时注入内置异常页兜底;返回新数组,不改入参 */
12
+ export declare function ensureBuiltinExceptionRoutes(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[];
@@ -0,0 +1,3 @@
1
+ import type { RouteObject } from "react-router";
2
+ declare const routes: RouteObject[];
3
+ export default routes;
@@ -0,0 +1,2 @@
1
+ /** 核心路由 */
2
+ export declare const coreRoutes: any;
@@ -0,0 +1,118 @@
1
+ import type { AppRouteRecordRaw, RouteFileModule } from "../types";
2
+ export declare const externalRouteFiles: RouteFileModule;
3
+ export declare const staticRouteFiles: RouteFileModule;
4
+ /**
5
+ * 外部路由 1. 不进行权限校验, 2. 不会触发请求,例如用户信息接口
6
+ * @example "privacy-policy", "terms-of-service" 等
7
+ */
8
+ export declare const externalRoutes: AppRouteRecordRaw[];
9
+ /** 静态路由 */
10
+ export declare const staticRoutes: AppRouteRecordRaw[];
11
+ /**
12
+ * 基本路由列表,由核心路由、外部路由组成,会一直存在系统中
13
+ */
14
+ declare const baseRoutes: ({
15
+ handle: {
16
+ order: number;
17
+ title: import("#node_modules/@types/react").ReactNode;
18
+ icon?: import("#node_modules/@types/react").ReactNode;
19
+ roles?: string[];
20
+ permissions?: string[];
21
+ keepAlive?: boolean;
22
+ layout?: "container" | "parent" | "fullscreen" | "none";
23
+ login?: boolean;
24
+ internal?: boolean;
25
+ hideInMenu?: boolean;
26
+ iframeLink?: string;
27
+ externalLink?: string;
28
+ ignoreAccess?: boolean;
29
+ currentActiveMenu?: string;
30
+ backstage?: boolean;
31
+ };
32
+ redirect?: string;
33
+ caseSensitive?: boolean | undefined;
34
+ path?: string | undefined;
35
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
36
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
37
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
38
+ hasErrorBoundary?: boolean | undefined;
39
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
40
+ lazy?: ({
41
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
42
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
43
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
44
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
45
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
46
+ handle?: (() => Promise<any>) | undefined;
47
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
48
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
49
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
50
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
51
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
52
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
53
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
54
+ Component?: (React.ComponentType | null) | undefined;
55
+ element?: import("#node_modules/@types/react").ReactNode;
56
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
57
+ errorElement?: import("#node_modules/@types/react").ReactNode;
58
+ HydrateFallback?: (React.ComponentType | null) | undefined;
59
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
60
+ children?: undefined | undefined;
61
+ index: true;
62
+ } | {
63
+ handle: {
64
+ order: number;
65
+ title: import("#node_modules/@types/react").ReactNode;
66
+ icon?: import("#node_modules/@types/react").ReactNode;
67
+ roles?: string[];
68
+ permissions?: string[];
69
+ keepAlive?: boolean;
70
+ layout?: "container" | "parent" | "fullscreen" | "none";
71
+ login?: boolean;
72
+ internal?: boolean;
73
+ hideInMenu?: boolean;
74
+ iframeLink?: string;
75
+ externalLink?: string;
76
+ ignoreAccess?: boolean;
77
+ currentActiveMenu?: string;
78
+ backstage?: boolean;
79
+ };
80
+ redirect?: string;
81
+ children?: AppRouteRecordRaw[];
82
+ caseSensitive?: boolean | undefined;
83
+ path?: string | undefined;
84
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
85
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
86
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
87
+ hasErrorBoundary?: boolean | undefined;
88
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
89
+ lazy?: ({
90
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
91
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
92
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
93
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
94
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
95
+ handle?: (() => Promise<any>) | undefined;
96
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
97
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
98
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
99
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
100
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
101
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
102
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
103
+ Component?: (React.ComponentType | null) | undefined;
104
+ element?: import("#node_modules/@types/react").ReactNode;
105
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
106
+ errorElement?: import("#node_modules/@types/react").ReactNode;
107
+ HydrateFallback?: (React.ComponentType | null) | undefined;
108
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
109
+ index?: false | undefined;
110
+ })[];
111
+ /** 权限路由列表(静态路由,模块路由由 module-loader 动态提供) */
112
+ declare const accessRoutes: AppRouteRecordRaw[];
113
+ /**
114
+ * 路由白名单 1. 不进行权限校验, 2. 不会触发请求,例如用户信息接口
115
+ * @example "privacy-policy", "terms-of-service" 等
116
+ */
117
+ declare const whiteRouteNames: (string | undefined)[];
118
+ export { accessRoutes, baseRoutes, whiteRouteNames, };
@@ -0,0 +1,90 @@
1
+ import type { ReactNode } from "react";
2
+ import type { IndexRouteObject, NonIndexRouteObject, createBrowserRouter as RemixRouter } from "react-router";
3
+ export interface IndexRouteMeta extends Omit<IndexRouteObject, "id"> {
4
+ redirect?: string;
5
+ handle: RouteMeta;
6
+ }
7
+ export interface NonIndexRouteMeta extends Omit<NonIndexRouteObject, "id"> {
8
+ redirect?: string;
9
+ handle: RouteMeta;
10
+ children?: AppRouteRecordRaw[];
11
+ }
12
+ export type AppRouteRecordRaw = IndexRouteMeta | NonIndexRouteMeta;
13
+ export interface RouteMeta {
14
+ /**
15
+ * 路由标题,通常用于页面标题或者侧边栏菜单显示
16
+ */
17
+ title: ReactNode;
18
+ /**
19
+ * 菜单图标,用于侧边栏菜单项的图标显示
20
+ */
21
+ icon?: ReactNode;
22
+ /**
23
+ * 菜单排序,用于控制侧边栏菜单的显示顺序
24
+ */
25
+ order?: number;
26
+ /**
27
+ * 用于配置页面的权限,只有拥有对应权限的用户才能访问页面,不配置则不需要权限。
28
+ */
29
+ roles?: string[];
30
+ /**
31
+ * 页面内按钮级别的权限,用于控制页面内按钮的显示和隐藏
32
+ */
33
+ permissions?: string[];
34
+ /**
35
+ * 设置页面是否开启缓存,开启后页面会缓存,不会重新加载,仅在标签页启用时有效。
36
+ * @default true
37
+ */
38
+ keepAlive?: boolean;
39
+ /**
40
+ * 布局包裹方式(P2.2,设计文档 D9)。显式声明,不做隐式推导。
41
+ * - `"container"`:套完整 chrome(header / sidebar / tabbar / content)
42
+ * - `"parent"`:套父级布局(自身含 Outlet,用于嵌套菜单场景)
43
+ * - `"fullscreen"`:套全屏外壳(视口 + 品牌区 + 角落工具 + 页脚,无 chrome),登录页用(P1)
44
+ * - `"none"`:不套任何布局,页面/子路由直接渲染
45
+ * @default "container"(迁移期向后兼容,目标在 P2.7 补全显式声明后改为 `"none"`)
46
+ */
47
+ layout?: "container" | "parent" | "fullscreen" | "none";
48
+ /**
49
+ * 登录页标记(login 模块化,P1):声明在 `path: "/login"` 的模块路由上,
50
+ * 供 resolveLoginRoute 识别并剔除内置兜底。仅模块路由受信,后端路由忽略。
51
+ */
52
+ login?: boolean;
53
+ /**
54
+ * 内置兜底标记(login 模块化,P1):框架内置登录页专用,
55
+ * 存在外部 login 模块路由时被 resolveLoginRoute 剔除。
56
+ */
57
+ internal?: boolean;
58
+ /**
59
+ * 是否在菜单中隐藏,用于控制某些路由不在侧边栏菜单中显示
60
+ */
61
+ hideInMenu?: boolean;
62
+ /**
63
+ * iframe链接,如果路由需要在iframe中加载外部页面时使用
64
+ */
65
+ iframeLink?: string;
66
+ /**
67
+ * 外部链接,点击后直接在新标签页中打开
68
+ */
69
+ externalLink?: string;
70
+ /**
71
+ * 用于配置页面是否忽略权限,直接可以访问
72
+ */
73
+ ignoreAccess?: boolean;
74
+ /**
75
+ * @description 指定当前激活的菜单,适用于动态路由情景下激活父菜单
76
+ * @example 从父路由 '/user/info' 导航到子路由 '/user/info/1' 时,可以手动手动指定以高亮显示父菜单 '/user/info'
77
+ */
78
+ currentActiveMenu?: string;
79
+ /**
80
+ * 当前路由为请求后端接口得到的
81
+ */
82
+ backstage?: boolean;
83
+ }
84
+ export type ReactRouterType = ReturnType<typeof RemixRouter>;
85
+ export type RouterSubscriber = Parameters<ReactRouterType["subscribe"]>[0];
86
+ export type RouterState = ReactRouterType["state"];
87
+ export type RouterNavigate = ReactRouterType["navigate"];
88
+ export type RouteFileModule = Record<string, {
89
+ default: AppRouteRecordRaw[];
90
+ }>;
@@ -0,0 +1,81 @@
1
+ import type { AppRouteRecordRaw } from "../types";
2
+ /**
3
+ * 为路由对象添加一个唯一的 ID,替代路由自动生成的 id,该 ID 默认为路由的路径(path)
4
+ * {
5
+ * path: '/dashboard',
6
+ * }
7
+ *
8
+ * 转化后
9
+ *
10
+ * {
11
+ * path: '/dashboard',
12
+ * id: '/dashboard',
13
+ * }
14
+ */
15
+ export declare function addRouteIdByPath(routes: AppRouteRecordRaw[], parentId?: string): ({
16
+ id: string | undefined;
17
+ redirect?: string;
18
+ handle: import("../types").RouteMeta;
19
+ caseSensitive?: boolean | undefined;
20
+ path?: string | undefined;
21
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
22
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
23
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
24
+ hasErrorBoundary?: boolean | undefined;
25
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
26
+ lazy?: ({
27
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
28
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
29
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
30
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
31
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
32
+ handle?: (() => Promise<any>) | undefined;
33
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
34
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
35
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
36
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
37
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
38
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
39
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
40
+ Component?: (React.ComponentType | null) | undefined;
41
+ element?: import("#node_modules/@types/react").ReactNode;
42
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
43
+ errorElement?: import("#node_modules/@types/react").ReactNode;
44
+ HydrateFallback?: (React.ComponentType | null) | undefined;
45
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
46
+ children?: undefined | undefined;
47
+ index: true;
48
+ } | {
49
+ id: string | undefined;
50
+ redirect?: string;
51
+ handle: import("../types").RouteMeta;
52
+ children?: AppRouteRecordRaw[];
53
+ caseSensitive?: boolean | undefined;
54
+ path?: string | undefined;
55
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
56
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
57
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
58
+ hasErrorBoundary?: boolean | undefined;
59
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
60
+ lazy?: ({
61
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
62
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
63
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
64
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
65
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
66
+ handle?: (() => Promise<any>) | undefined;
67
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
68
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
69
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
70
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
71
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
72
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
73
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
74
+ Component?: (React.ComponentType | null) | undefined;
75
+ element?: import("#node_modules/@types/react").ReactNode;
76
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
77
+ errorElement?: import("#node_modules/@types/react").ReactNode;
78
+ HydrateFallback?: (React.ComponentType | null) | undefined;
79
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
80
+ index?: false | undefined;
81
+ })[];
@@ -0,0 +1,99 @@
1
+ import type { AppRouteRecordRaw } from "../types";
2
+ /** 按照路由中 order 升序来排序路由 */
3
+ export declare function ascending(arr: AppRouteRecordRaw[]): ({
4
+ handle: {
5
+ order: number;
6
+ title: import("#node_modules/@types/react").ReactNode;
7
+ icon?: import("#node_modules/@types/react").ReactNode;
8
+ roles?: string[];
9
+ permissions?: string[];
10
+ keepAlive?: boolean;
11
+ layout?: "container" | "parent" | "fullscreen" | "none";
12
+ login?: boolean;
13
+ internal?: boolean;
14
+ hideInMenu?: boolean;
15
+ iframeLink?: string;
16
+ externalLink?: string;
17
+ ignoreAccess?: boolean;
18
+ currentActiveMenu?: string;
19
+ backstage?: boolean;
20
+ };
21
+ redirect?: string;
22
+ caseSensitive?: boolean | undefined;
23
+ path?: string | undefined;
24
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
25
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
26
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
27
+ hasErrorBoundary?: boolean | undefined;
28
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
29
+ lazy?: ({
30
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
31
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
32
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
33
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
34
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
35
+ handle?: (() => Promise<any>) | undefined;
36
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
37
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
38
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
39
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
40
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
41
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
42
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
43
+ Component?: (React.ComponentType | null) | undefined;
44
+ element?: import("#node_modules/@types/react").ReactNode;
45
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
46
+ errorElement?: import("#node_modules/@types/react").ReactNode;
47
+ HydrateFallback?: (React.ComponentType | null) | undefined;
48
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
49
+ children?: undefined | undefined;
50
+ index: true;
51
+ } | {
52
+ handle: {
53
+ order: number;
54
+ title: import("#node_modules/@types/react").ReactNode;
55
+ icon?: import("#node_modules/@types/react").ReactNode;
56
+ roles?: string[];
57
+ permissions?: string[];
58
+ keepAlive?: boolean;
59
+ layout?: "container" | "parent" | "fullscreen" | "none";
60
+ login?: boolean;
61
+ internal?: boolean;
62
+ hideInMenu?: boolean;
63
+ iframeLink?: string;
64
+ externalLink?: string;
65
+ ignoreAccess?: boolean;
66
+ currentActiveMenu?: string;
67
+ backstage?: boolean;
68
+ };
69
+ redirect?: string;
70
+ children?: AppRouteRecordRaw[];
71
+ caseSensitive?: boolean | undefined;
72
+ path?: string | undefined;
73
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
74
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
75
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
76
+ hasErrorBoundary?: boolean | undefined;
77
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
78
+ lazy?: ({
79
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
80
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
81
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
82
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
83
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
84
+ handle?: (() => Promise<any>) | undefined;
85
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
86
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
87
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
88
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
89
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
90
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
91
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
92
+ Component?: (React.ComponentType | null) | undefined;
93
+ element?: import("#node_modules/@types/react").ReactNode;
94
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
95
+ errorElement?: import("#node_modules/@types/react").ReactNode;
96
+ HydrateFallback?: (React.ComponentType | null) | undefined;
97
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
98
+ index?: false | undefined;
99
+ })[];
@@ -0,0 +1,5 @@
1
+ import type { AppRouteRecordRaw } from "../types";
2
+ /**
3
+ * 将路由扁平化为一个对象,键为路由的 path,值为路由对象
4
+ */
5
+ export declare function flattenRoutes(routes: AppRouteRecordRaw[]): Record<string, AppRouteRecordRaw>;
@@ -0,0 +1,10 @@
1
+ import type { MenuItemType } from "../../layout/layout-menu/types";
2
+ import type { AppRouteRecordRaw } from "../types";
3
+ /**
4
+ * 根据路由列表生成菜单项数组
5
+ *
6
+ * @param routeList 路由列表,类型为 AppRouteRecordRaw 数组
7
+ * @param parentPath 父路由绝对路径(递归用,顶层为 "/")
8
+ * @returns 返回菜单项数组,数组元素类型为 MenuItemType
9
+ */
10
+ export declare function generateMenuItemsFromRoutes(routeList: AppRouteRecordRaw[], parentPath?: string): MenuItemType[];
@@ -0,0 +1,79 @@
1
+ import type { AppRouteRecordRaw } from "../types";
2
+ /**
3
+ * @zh 根据路由获取框架页面组件路径(仅 src/pages;模块页面不在此解析)
4
+ * @en Get framework page component path by route (src/pages only; module pages are resolved elsewhere)
5
+ */
6
+ export declare function getComponentPathByRoute(route: AppRouteRecordRaw & {
7
+ component?: string;
8
+ }): string;
9
+ /**
10
+ * @zh 根据后端路由配置生成前端路由
11
+ * @en Generate frontend routes based on backend route configurations
12
+ */
13
+ export declare function generateRoutesFromBackend(backendRoutes: Array<AppRouteRecordRaw>): Promise<({
14
+ id: string | undefined;
15
+ redirect?: string;
16
+ handle: import("../types").RouteMeta;
17
+ caseSensitive?: boolean | undefined;
18
+ path?: string | undefined;
19
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
20
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
21
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
22
+ hasErrorBoundary?: boolean | undefined;
23
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
24
+ lazy?: ({
25
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
26
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
27
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
28
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
29
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
30
+ handle?: (() => Promise<any>) | undefined;
31
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
32
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
33
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
34
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
35
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
36
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
37
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
38
+ Component?: (React.ComponentType | null) | undefined;
39
+ element?: import("#node_modules/@types/react").ReactNode;
40
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
41
+ errorElement?: import("#node_modules/@types/react").ReactNode;
42
+ HydrateFallback?: (React.ComponentType | null) | undefined;
43
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
44
+ children?: undefined | undefined;
45
+ index: true;
46
+ } | {
47
+ id: string | undefined;
48
+ redirect?: string;
49
+ handle: import("../types").RouteMeta;
50
+ children?: AppRouteRecordRaw[];
51
+ caseSensitive?: boolean | undefined;
52
+ path?: string | undefined;
53
+ middleware?: import("react-router").MiddlewareFunction[] | undefined;
54
+ loader?: (import("react-router").LoaderFunction | boolean) | undefined;
55
+ action?: (import("react-router").ActionFunction | boolean) | undefined;
56
+ hasErrorBoundary?: boolean | undefined;
57
+ shouldRevalidate?: import("react-router").ShouldRevalidateFunction | undefined;
58
+ lazy?: ({
59
+ middleware?: (() => Promise<import("react-router").MiddlewareFunction<unknown>[] | null | undefined>) | undefined;
60
+ loader?: (() => Promise<boolean | import("react-router").LoaderFunction<any> | null | undefined>) | undefined;
61
+ action?: (() => Promise<boolean | import("react-router").ActionFunction<any> | null | undefined>) | undefined;
62
+ hasErrorBoundary?: (() => Promise<boolean | null | undefined>) | undefined;
63
+ shouldRevalidate?: (() => Promise<import("react-router").ShouldRevalidateFunction | null | undefined>) | undefined;
64
+ handle?: (() => Promise<any>) | undefined;
65
+ Component?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
66
+ element?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
67
+ ErrorBoundary?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
68
+ errorElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
69
+ HydrateFallback?: (() => Promise<import("#node_modules/@types/react").ComponentType<{}> | null | undefined>) | undefined;
70
+ hydrateFallbackElement?: (() => Promise<import("#node_modules/@types/react").ReactNode>) | undefined;
71
+ } | import("react-router").LazyRouteFunction<import("react-router").BaseRouteObject>) | undefined;
72
+ Component?: (React.ComponentType | null) | undefined;
73
+ element?: import("#node_modules/@types/react").ReactNode;
74
+ ErrorBoundary?: (React.ComponentType | null) | undefined;
75
+ errorElement?: import("#node_modules/@types/react").ReactNode;
76
+ HydrateFallback?: (React.ComponentType | null) | undefined;
77
+ hydrateFallbackElement?: import("#node_modules/@types/react").ReactNode;
78
+ index?: false | undefined;
79
+ })[]>;
@@ -0,0 +1,5 @@
1
+ import type { AppRouteRecordRaw } from "../types";
2
+ /**
3
+ * 动态生成路由 - 前端方式
4
+ */
5
+ export declare function generateRoutesByFrontend(routes: AppRouteRecordRaw[], roles: string[]): AppRouteRecordRaw[];
@@ -0,0 +1,2 @@
1
+ import type { AppRouteRecordRaw, RouteFileModule } from "../types";
2
+ export declare function mergeRouteModules(...routes: RouteFileModule[]): AppRouteRecordRaw[];
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @zh 移除路径末尾的斜杠
3
+ * @en Remove trailing slashes from a path
4
+ * @param {string} pathname - The path to remove trailing slashes from
5
+ * @returns {string} The path with trailing slashes removed
6
+ * @example
7
+ * removeTrailingSlash('/about/') // return '/about'
8
+ * removeTrailingSlash('/about') // return '/about'
9
+ */
10
+ export declare function removeTrailingSlash(pathname: string): string;
@@ -0,0 +1,17 @@
1
+ import type { ComponentType } from "react";
2
+ import type { AppRouteRecordRaw, RouteMeta } from "../types";
3
+ /**
4
+ * 根据路由 `handle.layout` 解析所用布局组件(P2.2,设计文档 D9)。
5
+ *
6
+ * 未声明即 `none` 是 D9 的目标态(P2.7 dogfooding 验证后自迁移期默认 `container` 翻转):
7
+ * 布局必须显式声明,框架不做隐式推导;后端下发的父级路由需在 handle 中携带 layout。
8
+ */
9
+ export declare function resolveLayoutComponent(handle?: Partial<RouteMeta>): ComponentType;
10
+ /**
11
+ * 递归为缺少 Component 的父级路由按 `handle.layout` 注入布局组件(P2.7,US-8)。
12
+ *
13
+ * 模块路由不再直接 import ContainerLayout / ParentLayout,由框架在
14
+ * module-loader 出口统一包裹;已有 Component 的路由(页面组件)不受影响。
15
+ * 纯函数:返回新路由树,不修改模块 definition 中的原对象。
16
+ */
17
+ export declare function resolveRouteLayouts(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[];
@@ -0,0 +1,31 @@
1
+ import type { RouteObject } from "react-router";
2
+ import type { AppRouteRecordRaw } from "../types";
3
+ /**
4
+ * 结构性 router 接口(DIP):不 import router 单例——
5
+ * 那会引入 router/index → layout → store → 本模块 的循环依赖(P3 实测 +98 环)。
6
+ */
7
+ interface RouterLike {
8
+ routes: RouteObject[];
9
+ _internalSetRoutes: (routes: RouteObject[]) => void;
10
+ patchRoutes: (routeId: string, children: any[]) => void;
11
+ }
12
+ /**
13
+ * 内外 login 路由去重(P3,login 模块化):唯一合成入口(SRP/DRY),
14
+ * 启动引导(index.tsx)与 setAccessStore 两处调用,无内部状态、可重入。
15
+ *
16
+ * 规则:
17
+ * - `handle.login` 只信**模块路由**(后端下发路由不参与);
18
+ * - 契约路径固定 `/login`,非该路径的标记拒绝并告警;
19
+ * - 多模块声明时按(拓扑)序先到先得,其余告警忽略;
20
+ * - 存在有效外部 login 时:内置兜底(`internal: true`)从合成结果剔除,
21
+ * 并重建根路由 + 立即补 patch 获胜的外部 login 路由——
22
+ * `patchRoutes` 只能增不能删,而 `_internalSetRoutes`(RR 7.18 起落入
23
+ * HMR 树)会丢弃已 patch 的动态路由,故获胜路由须在同一调用内回补,
24
+ * 否则直接落地 /login 会闪现 404。
25
+ *
26
+ * 注意:**不能**放进 module-loader 的 `getRoutes()`(每次实时计算,会让模块看不到自己)。
27
+ *
28
+ * @returns 合成用的有效 base 列表(无外部 login 时原样返回 `base`)
29
+ */
30
+ export declare function resolveLoginRoute(base: AppRouteRecordRaw[], incoming: AppRouteRecordRaw[], router: RouterLike, rootRoute: RouteObject[]): AppRouteRecordRaw[];
31
+ export {};