@vlian/framework 1.2.16 → 1.2.19
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.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/router/RouterManager.cjs +52 -3
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.d.ts +5 -0
- package/dist/core/router/RouterManager.js +53 -4
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
- package/dist/core/router/dev/RouterDevTools.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +24 -4
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +1 -0
- package/dist/core/router/middleware/RouterMiddlewareManager.js +24 -4
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/types.cjs.map +1 -1
- package/dist/core/router/middleware/types.d.ts +1 -1
- package/dist/core/router/middleware/types.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +69 -14
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts +3 -0
- package/dist/core/router/navigation/RouterNavigation.js +69 -14
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +34 -13
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.d.ts +8 -2
- package/dist/core/router/performance/RouteCache.js +34 -13
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +89 -22
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.d.ts +9 -1
- package/dist/core/router/performance/RoutePreloader.js +89 -22
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/types.d.ts +31 -5
- package/dist/core/router/types.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +43 -65
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.d.ts +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +43 -60
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +79 -70
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.d.ts +1 -1
- package/dist/core/router/utils/transform.js +80 -71
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts +68 -4
- package/dist/core/router/validation/schema.cjs +72 -2
- package/dist/core/router/validation/schema.cjs.map +1 -1
- package/dist/core/router/validation/schema.d.ts +105 -6
- package/dist/core/router/validation/schema.js +72 -2
- package/dist/core/router/validation/schema.js.map +1 -1
- package/dist/index.umd.js +705 -431
- package/dist/index.umd.js.map +1 -1
- package/dist/request.umd.js +1 -1
- package/dist/state.umd.js +1 -1
- package/package.json +1 -1
|
@@ -9,15 +9,10 @@ Object.defineProperty(exports, "transformRoutesToReactRoutes", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _jsxruntime = require("react/jsx-runtime");
|
|
12
|
-
const _react = /*#__PURE__*/ _interop_require_default(require("react"));
|
|
13
12
|
const _reactrouterdom = require("react-router-dom");
|
|
14
13
|
const _RouteErrorBoundary = require("./RouteErrorBoundary");
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
default: obj
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
function DefaultRouteLoading() {
|
|
14
|
+
const _utils = require("../../../../../utils");
|
|
15
|
+
function DefaultRouteHydrateFallback() {
|
|
21
16
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
22
17
|
style: {
|
|
23
18
|
padding: 16,
|
|
@@ -27,7 +22,7 @@ function DefaultRouteLoading() {
|
|
|
27
22
|
children: "Loading..."
|
|
28
23
|
});
|
|
29
24
|
}
|
|
30
|
-
const transformRoutesToReactRoutes = async (routes, transformResult, defaultRouteErrorComponent, defaultRouteLoadingComponent)=>{
|
|
25
|
+
const transformRoutesToReactRoutes = async (routes, transformResult, defaultRouteErrorComponent, defaultRouteLoadingComponent, enableHydrateFallback = false)=>{
|
|
31
26
|
/**
|
|
32
27
|
* 批量处理路由
|
|
33
28
|
* @param routes 路由组
|
|
@@ -38,18 +33,19 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
38
33
|
* 处理单个路由
|
|
39
34
|
* @param route 路由
|
|
40
35
|
*/ function transformRouteToReactRoute(route) {
|
|
41
|
-
const { isGroup = false, enableRedirection = false, name, path, handle, children, page, layout,
|
|
36
|
+
const { isGroup = false, enableRedirection = false, name, path, handle, children, page, layout, error, errors, loading } = route;
|
|
37
|
+
const routeError = error ?? errors;
|
|
42
38
|
// 获取错误组件
|
|
43
39
|
async function getErrorComponent() {
|
|
44
|
-
// 如果 errors 是函数,直接使用
|
|
45
|
-
if (typeof
|
|
46
|
-
return
|
|
40
|
+
// 如果 error/errors 是函数,直接使用
|
|
41
|
+
if (typeof routeError === 'function') {
|
|
42
|
+
return routeError();
|
|
47
43
|
}
|
|
48
44
|
const errorsMap = transformResult.errors;
|
|
49
|
-
// 判断 errors 是否为 string 且不是空字符串
|
|
50
|
-
if (typeof
|
|
51
|
-
// 使用
|
|
52
|
-
const errorResolver = errorsMap.get(
|
|
45
|
+
// 判断 error/errors 是否为 string 且不是空字符串
|
|
46
|
+
if (typeof routeError === 'string' && routeError !== '') {
|
|
47
|
+
// 使用 routeError 作为 key 获取 transformResult.errors 的值
|
|
48
|
+
const errorResolver = errorsMap.get(routeError);
|
|
53
49
|
// 如果获取不到,返回 null
|
|
54
50
|
if (!errorResolver) {
|
|
55
51
|
return null;
|
|
@@ -74,52 +70,6 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
74
70
|
default: _RouteErrorBoundary.RouteErrorBoundary
|
|
75
71
|
};
|
|
76
72
|
}
|
|
77
|
-
// 获取默认加载组件(配置的或内置的 Spin)
|
|
78
|
-
function getDefaultLoadingComponent() {
|
|
79
|
-
if (defaultRouteLoadingComponent) {
|
|
80
|
-
// 如果配置了默认加载组件,使用 React.lazy 包装
|
|
81
|
-
// 使用懒加载是因为用户可能希望自定义组件支持代码分割
|
|
82
|
-
return /*#__PURE__*/ _react.default.lazy(()=>defaultRouteLoadingComponent().then((module)=>({
|
|
83
|
-
default: module.default || module
|
|
84
|
-
})));
|
|
85
|
-
}
|
|
86
|
-
// 如果没有配置默认加载组件,使用框架内置 Loading 组件
|
|
87
|
-
// 直接导入而非懒加载,因为:
|
|
88
|
-
// 1. 内置 Loading 组件无外部依赖
|
|
89
|
-
// 2. 加载组件需要快速显示,直接导入速度更快
|
|
90
|
-
// 3. 作为基础设施组件,应该保证可用性
|
|
91
|
-
return DefaultRouteLoading;
|
|
92
|
-
}
|
|
93
|
-
// 获取加载组件
|
|
94
|
-
function getLoadingComponent() {
|
|
95
|
-
// 如果 loading 是函数,直接使用 React.lazy 包装
|
|
96
|
-
if (typeof loading === 'function') {
|
|
97
|
-
return /*#__PURE__*/ _react.default.lazy(()=>loading().then((module)=>({
|
|
98
|
-
default: module.default || module
|
|
99
|
-
})));
|
|
100
|
-
}
|
|
101
|
-
const loadingsMap = transformResult.loadings;
|
|
102
|
-
// 判断 loading 是否为 string 且不是空字符串
|
|
103
|
-
if (typeof loading === 'string' && loading !== '') {
|
|
104
|
-
// 使用 loading 作为 key 获取 transformResult.loadings 的值
|
|
105
|
-
const loadingResolver = loadingsMap.get(loading);
|
|
106
|
-
// 如果获取不到,使用默认加载组件
|
|
107
|
-
if (!loadingResolver) {
|
|
108
|
-
return getDefaultLoadingComponent();
|
|
109
|
-
}
|
|
110
|
-
// 如果获取到,使用 React.lazy 包装动态导入函数
|
|
111
|
-
// loadingResolver 是一个返回 Promise 的函数,Promise resolve 后的值是组件模块
|
|
112
|
-
if (typeof loadingResolver === 'function') {
|
|
113
|
-
return /*#__PURE__*/ _react.default.lazy(()=>loadingResolver().then((module)=>({
|
|
114
|
-
default: module.default || module
|
|
115
|
-
})));
|
|
116
|
-
}
|
|
117
|
-
// 如果 loadingResolver 不是函数,使用默认加载组件
|
|
118
|
-
return getDefaultLoadingComponent();
|
|
119
|
-
}
|
|
120
|
-
// 如果 loading 为空,使用默认加载组件
|
|
121
|
-
return getDefaultLoadingComponent();
|
|
122
|
-
}
|
|
123
73
|
// 获取转换配置
|
|
124
74
|
function convertConfig(m) {
|
|
125
75
|
if (!m) {
|
|
@@ -128,7 +78,7 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
128
78
|
const { action, loader, shouldRevalidate, default: Component } = m;
|
|
129
79
|
// 如果 Component 不存在,记录警告
|
|
130
80
|
if (!Component) {
|
|
131
|
-
|
|
81
|
+
_utils.logger.warn(`路由组件未找到 default 导出: ${name}`, m);
|
|
132
82
|
}
|
|
133
83
|
return {
|
|
134
84
|
action,
|
|
@@ -137,6 +87,22 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
137
87
|
Component
|
|
138
88
|
};
|
|
139
89
|
}
|
|
90
|
+
// 获取加载组件
|
|
91
|
+
async function getLoadingComponent() {
|
|
92
|
+
if (typeof loading === 'function') {
|
|
93
|
+
return loading();
|
|
94
|
+
}
|
|
95
|
+
if (typeof loading === 'string' && loading !== '') {
|
|
96
|
+
const loadingResolver = transformResult.loadings.get(loading);
|
|
97
|
+
if (typeof loadingResolver === 'function') {
|
|
98
|
+
return loadingResolver();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (defaultRouteLoadingComponent) {
|
|
102
|
+
return defaultRouteLoadingComponent();
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
140
106
|
// 获取配置
|
|
141
107
|
async function getConfig(index = false) {
|
|
142
108
|
// 如果有layout和不是index,返回布局配置
|
|
@@ -192,25 +158,31 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
192
158
|
}
|
|
193
159
|
const reactRoute = {
|
|
194
160
|
children: [],
|
|
195
|
-
HydrateFallback: getLoadingComponent(),
|
|
196
161
|
id: name,
|
|
197
162
|
handle: getHandle(),
|
|
198
163
|
lazy: async ()=>{
|
|
199
164
|
const ErrorBoundary = await getErrorComponent();
|
|
200
165
|
const config = await getConfig();
|
|
166
|
+
const LoadingComponent = await getLoadingComponent();
|
|
167
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
201
168
|
// 如果配置为空,确保至少返回一个空对象,避免展开 undefined
|
|
202
169
|
if (!config) {
|
|
203
170
|
return {
|
|
204
|
-
ErrorBoundary: ErrorBoundary?.default
|
|
171
|
+
ErrorBoundary: ErrorBoundary?.default,
|
|
172
|
+
HydrateFallback
|
|
205
173
|
};
|
|
206
174
|
}
|
|
207
175
|
return {
|
|
208
176
|
ErrorBoundary: ErrorBoundary?.default,
|
|
177
|
+
HydrateFallback,
|
|
209
178
|
...config
|
|
210
179
|
};
|
|
211
180
|
},
|
|
212
181
|
path
|
|
213
182
|
};
|
|
183
|
+
if (enableHydrateFallback) {
|
|
184
|
+
reactRoute.hydrateFallbackElement = /*#__PURE__*/ (0, _jsxruntime.jsx)(DefaultRouteHydrateFallback, {});
|
|
185
|
+
}
|
|
214
186
|
// 处理子路由
|
|
215
187
|
if (children?.length) {
|
|
216
188
|
reactRoute.children = children.flatMap((child)=>transformRouteToReactRoute(child)).sort((a, b)=>{
|
|
@@ -224,8 +196,11 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
224
196
|
index: true,
|
|
225
197
|
lazy: async ()=>{
|
|
226
198
|
const ErrorBoundary = await getErrorComponent();
|
|
199
|
+
const LoadingComponent = await getLoadingComponent();
|
|
200
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
227
201
|
return {
|
|
228
202
|
ErrorBoundary: ErrorBoundary?.default,
|
|
203
|
+
HydrateFallback,
|
|
229
204
|
...await getConfig(true)
|
|
230
205
|
};
|
|
231
206
|
}
|
|
@@ -254,8 +229,11 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
|
|
|
254
229
|
index: true,
|
|
255
230
|
lazy: async ()=>{
|
|
256
231
|
const ErrorBoundary = await getErrorComponent();
|
|
232
|
+
const LoadingComponent = await getLoadingComponent();
|
|
233
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
257
234
|
return {
|
|
258
235
|
ErrorBoundary: ErrorBoundary?.default,
|
|
236
|
+
HydrateFallback,
|
|
259
237
|
...await getConfig(true)
|
|
260
238
|
};
|
|
261
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport React from \"react\";\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\n\nfunction DefaultRouteLoading() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n loading,\n errors\n } = route;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 errors 是函数,直接使用\n if (typeof errors === 'function') {\n return errors();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 errors 是否为 string 且不是空字符串\n if (typeof errors === 'string' && errors !== '') {\n // 使用 errors 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(errors);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取默认加载组件(配置的或内置的 Spin)\n function getDefaultLoadingComponent() {\n if (defaultRouteLoadingComponent) {\n // 如果配置了默认加载组件,使用 React.lazy 包装\n // 使用懒加载是因为用户可能希望自定义组件支持代码分割\n return React.lazy(() => defaultRouteLoadingComponent().then(module => ({ default: module.default || module })));\n }\n // 如果没有配置默认加载组件,使用框架内置 Loading 组件\n // 直接导入而非懒加载,因为:\n // 1. 内置 Loading 组件无外部依赖\n // 2. 加载组件需要快速显示,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return DefaultRouteLoading;\n }\n\n // 获取加载组件\n function getLoadingComponent() {\n // 如果 loading 是函数,直接使用 React.lazy 包装\n if (typeof loading === 'function') {\n return React.lazy(() => loading().then(module => ({ default: module.default || module })));\n }\n\n const loadingsMap = transformResult.loadings;\n\n // 判断 loading 是否为 string 且不是空字符串\n if (typeof loading === 'string' && loading !== '') {\n // 使用 loading 作为 key 获取 transformResult.loadings 的值\n const loadingResolver = loadingsMap.get(loading);\n\n // 如果获取不到,使用默认加载组件\n if (!loadingResolver) {\n return getDefaultLoadingComponent();\n }\n\n // 如果获取到,使用 React.lazy 包装动态导入函数\n // loadingResolver 是一个返回 Promise 的函数,Promise resolve 后的值是组件模块\n if (typeof loadingResolver === 'function') {\n return React.lazy(() => loadingResolver().then(module => ({ default: module.default || module })));\n }\n\n // 如果 loadingResolver 不是函数,使用默认加载组件\n return getDefaultLoadingComponent();\n }\n\n // 如果 loading 为空,使用默认加载组件\n return getDefaultLoadingComponent();\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n console.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n HydrateFallback: getLoadingComponent(),\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...config\n };\n },\n path\n };\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n\n\n\n"],"names":["transformRoutesToReactRoutes","DefaultRouteLoading","div","style","padding","textAlign","color","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","loading","errors","getErrorComponent","errorsMap","errorResolver","get","default","RouteErrorBoundary","getDefaultLoadingComponent","React","lazy","then","module","getLoadingComponent","loadingsMap","loadings","loadingResolver","convertConfig","m","action","loader","shouldRevalidate","Component","console","warn","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","HydrateFallback","id","ErrorBoundary","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","Navigate","to","replace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["transformRoutesToReactRoutes","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","RouteErrorBoundary","convertConfig","m","action","loader","shouldRevalidate","Component","logger","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","Navigate","to","replace"],"mappings":"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"}
|
|
@@ -2,4 +2,4 @@ import type { RouteConfig } from '../../../types';
|
|
|
2
2
|
import { type RouteObject } from 'react-router-dom';
|
|
3
3
|
import type { TransformRoutesResult } from '../../transform';
|
|
4
4
|
import type { ComponentImport } from '../../../types';
|
|
5
|
-
export declare const transformRoutesToReactRoutes: (routes: RouteConfig[], transformResult: TransformRoutesResult, defaultRouteErrorComponent?: ComponentImport, defaultRouteLoadingComponent?: ComponentImport) => Promise<RouteObject[]>;
|
|
5
|
+
export declare const transformRoutesToReactRoutes: (routes: RouteConfig[], transformResult: TransformRoutesResult, defaultRouteErrorComponent?: ComponentImport, defaultRouteLoadingComponent?: ComponentImport, enableHydrateFallback?: boolean) => Promise<RouteObject[]>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
2
|
import { Navigate } from "react-router-dom";
|
|
4
3
|
import { RouteErrorBoundary } from "./RouteErrorBoundary";
|
|
5
|
-
|
|
4
|
+
import { logger } from "../../../../../utils";
|
|
5
|
+
function DefaultRouteHydrateFallback() {
|
|
6
6
|
return /*#__PURE__*/ _jsx("div", {
|
|
7
7
|
style: {
|
|
8
8
|
padding: 16,
|
|
@@ -12,7 +12,7 @@ function DefaultRouteLoading() {
|
|
|
12
12
|
children: "Loading..."
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
export const transformRoutesToReactRoutes = async (routes, transformResult, defaultRouteErrorComponent, defaultRouteLoadingComponent)=>{
|
|
15
|
+
export const transformRoutesToReactRoutes = async (routes, transformResult, defaultRouteErrorComponent, defaultRouteLoadingComponent, enableHydrateFallback = false)=>{
|
|
16
16
|
/**
|
|
17
17
|
* 批量处理路由
|
|
18
18
|
* @param routes 路由组
|
|
@@ -23,18 +23,19 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
23
23
|
* 处理单个路由
|
|
24
24
|
* @param route 路由
|
|
25
25
|
*/ function transformRouteToReactRoute(route) {
|
|
26
|
-
const { isGroup = false, enableRedirection = false, name, path, handle, children, page, layout,
|
|
26
|
+
const { isGroup = false, enableRedirection = false, name, path, handle, children, page, layout, error, errors, loading } = route;
|
|
27
|
+
const routeError = error ?? errors;
|
|
27
28
|
// 获取错误组件
|
|
28
29
|
async function getErrorComponent() {
|
|
29
|
-
// 如果 errors 是函数,直接使用
|
|
30
|
-
if (typeof
|
|
31
|
-
return
|
|
30
|
+
// 如果 error/errors 是函数,直接使用
|
|
31
|
+
if (typeof routeError === 'function') {
|
|
32
|
+
return routeError();
|
|
32
33
|
}
|
|
33
34
|
const errorsMap = transformResult.errors;
|
|
34
|
-
// 判断 errors 是否为 string 且不是空字符串
|
|
35
|
-
if (typeof
|
|
36
|
-
// 使用
|
|
37
|
-
const errorResolver = errorsMap.get(
|
|
35
|
+
// 判断 error/errors 是否为 string 且不是空字符串
|
|
36
|
+
if (typeof routeError === 'string' && routeError !== '') {
|
|
37
|
+
// 使用 routeError 作为 key 获取 transformResult.errors 的值
|
|
38
|
+
const errorResolver = errorsMap.get(routeError);
|
|
38
39
|
// 如果获取不到,返回 null
|
|
39
40
|
if (!errorResolver) {
|
|
40
41
|
return null;
|
|
@@ -59,52 +60,6 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
59
60
|
default: RouteErrorBoundary
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
|
-
// 获取默认加载组件(配置的或内置的 Spin)
|
|
63
|
-
function getDefaultLoadingComponent() {
|
|
64
|
-
if (defaultRouteLoadingComponent) {
|
|
65
|
-
// 如果配置了默认加载组件,使用 React.lazy 包装
|
|
66
|
-
// 使用懒加载是因为用户可能希望自定义组件支持代码分割
|
|
67
|
-
return /*#__PURE__*/ React.lazy(()=>defaultRouteLoadingComponent().then((module)=>({
|
|
68
|
-
default: module.default || module
|
|
69
|
-
})));
|
|
70
|
-
}
|
|
71
|
-
// 如果没有配置默认加载组件,使用框架内置 Loading 组件
|
|
72
|
-
// 直接导入而非懒加载,因为:
|
|
73
|
-
// 1. 内置 Loading 组件无外部依赖
|
|
74
|
-
// 2. 加载组件需要快速显示,直接导入速度更快
|
|
75
|
-
// 3. 作为基础设施组件,应该保证可用性
|
|
76
|
-
return DefaultRouteLoading;
|
|
77
|
-
}
|
|
78
|
-
// 获取加载组件
|
|
79
|
-
function getLoadingComponent() {
|
|
80
|
-
// 如果 loading 是函数,直接使用 React.lazy 包装
|
|
81
|
-
if (typeof loading === 'function') {
|
|
82
|
-
return /*#__PURE__*/ React.lazy(()=>loading().then((module)=>({
|
|
83
|
-
default: module.default || module
|
|
84
|
-
})));
|
|
85
|
-
}
|
|
86
|
-
const loadingsMap = transformResult.loadings;
|
|
87
|
-
// 判断 loading 是否为 string 且不是空字符串
|
|
88
|
-
if (typeof loading === 'string' && loading !== '') {
|
|
89
|
-
// 使用 loading 作为 key 获取 transformResult.loadings 的值
|
|
90
|
-
const loadingResolver = loadingsMap.get(loading);
|
|
91
|
-
// 如果获取不到,使用默认加载组件
|
|
92
|
-
if (!loadingResolver) {
|
|
93
|
-
return getDefaultLoadingComponent();
|
|
94
|
-
}
|
|
95
|
-
// 如果获取到,使用 React.lazy 包装动态导入函数
|
|
96
|
-
// loadingResolver 是一个返回 Promise 的函数,Promise resolve 后的值是组件模块
|
|
97
|
-
if (typeof loadingResolver === 'function') {
|
|
98
|
-
return /*#__PURE__*/ React.lazy(()=>loadingResolver().then((module)=>({
|
|
99
|
-
default: module.default || module
|
|
100
|
-
})));
|
|
101
|
-
}
|
|
102
|
-
// 如果 loadingResolver 不是函数,使用默认加载组件
|
|
103
|
-
return getDefaultLoadingComponent();
|
|
104
|
-
}
|
|
105
|
-
// 如果 loading 为空,使用默认加载组件
|
|
106
|
-
return getDefaultLoadingComponent();
|
|
107
|
-
}
|
|
108
63
|
// 获取转换配置
|
|
109
64
|
function convertConfig(m) {
|
|
110
65
|
if (!m) {
|
|
@@ -113,7 +68,7 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
113
68
|
const { action, loader, shouldRevalidate, default: Component } = m;
|
|
114
69
|
// 如果 Component 不存在,记录警告
|
|
115
70
|
if (!Component) {
|
|
116
|
-
|
|
71
|
+
logger.warn(`路由组件未找到 default 导出: ${name}`, m);
|
|
117
72
|
}
|
|
118
73
|
return {
|
|
119
74
|
action,
|
|
@@ -122,6 +77,22 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
122
77
|
Component
|
|
123
78
|
};
|
|
124
79
|
}
|
|
80
|
+
// 获取加载组件
|
|
81
|
+
async function getLoadingComponent() {
|
|
82
|
+
if (typeof loading === 'function') {
|
|
83
|
+
return loading();
|
|
84
|
+
}
|
|
85
|
+
if (typeof loading === 'string' && loading !== '') {
|
|
86
|
+
const loadingResolver = transformResult.loadings.get(loading);
|
|
87
|
+
if (typeof loadingResolver === 'function') {
|
|
88
|
+
return loadingResolver();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (defaultRouteLoadingComponent) {
|
|
92
|
+
return defaultRouteLoadingComponent();
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
125
96
|
// 获取配置
|
|
126
97
|
async function getConfig(index = false) {
|
|
127
98
|
// 如果有layout和不是index,返回布局配置
|
|
@@ -177,25 +148,31 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
177
148
|
}
|
|
178
149
|
const reactRoute = {
|
|
179
150
|
children: [],
|
|
180
|
-
HydrateFallback: getLoadingComponent(),
|
|
181
151
|
id: name,
|
|
182
152
|
handle: getHandle(),
|
|
183
153
|
lazy: async ()=>{
|
|
184
154
|
const ErrorBoundary = await getErrorComponent();
|
|
185
155
|
const config = await getConfig();
|
|
156
|
+
const LoadingComponent = await getLoadingComponent();
|
|
157
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
186
158
|
// 如果配置为空,确保至少返回一个空对象,避免展开 undefined
|
|
187
159
|
if (!config) {
|
|
188
160
|
return {
|
|
189
|
-
ErrorBoundary: ErrorBoundary?.default
|
|
161
|
+
ErrorBoundary: ErrorBoundary?.default,
|
|
162
|
+
HydrateFallback
|
|
190
163
|
};
|
|
191
164
|
}
|
|
192
165
|
return {
|
|
193
166
|
ErrorBoundary: ErrorBoundary?.default,
|
|
167
|
+
HydrateFallback,
|
|
194
168
|
...config
|
|
195
169
|
};
|
|
196
170
|
},
|
|
197
171
|
path
|
|
198
172
|
};
|
|
173
|
+
if (enableHydrateFallback) {
|
|
174
|
+
reactRoute.hydrateFallbackElement = /*#__PURE__*/ _jsx(DefaultRouteHydrateFallback, {});
|
|
175
|
+
}
|
|
199
176
|
// 处理子路由
|
|
200
177
|
if (children?.length) {
|
|
201
178
|
reactRoute.children = children.flatMap((child)=>transformRouteToReactRoute(child)).sort((a, b)=>{
|
|
@@ -209,8 +186,11 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
209
186
|
index: true,
|
|
210
187
|
lazy: async ()=>{
|
|
211
188
|
const ErrorBoundary = await getErrorComponent();
|
|
189
|
+
const LoadingComponent = await getLoadingComponent();
|
|
190
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
212
191
|
return {
|
|
213
192
|
ErrorBoundary: ErrorBoundary?.default,
|
|
193
|
+
HydrateFallback,
|
|
214
194
|
...await getConfig(true)
|
|
215
195
|
};
|
|
216
196
|
}
|
|
@@ -239,8 +219,11 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
|
|
|
239
219
|
index: true,
|
|
240
220
|
lazy: async ()=>{
|
|
241
221
|
const ErrorBoundary = await getErrorComponent();
|
|
222
|
+
const LoadingComponent = await getLoadingComponent();
|
|
223
|
+
const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
|
|
242
224
|
return {
|
|
243
225
|
ErrorBoundary: ErrorBoundary?.default,
|
|
226
|
+
HydrateFallback,
|
|
244
227
|
...await getConfig(true)
|
|
245
228
|
};
|
|
246
229
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport React from \"react\";\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\n\nfunction DefaultRouteLoading() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n loading,\n errors\n } = route;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 errors 是函数,直接使用\n if (typeof errors === 'function') {\n return errors();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 errors 是否为 string 且不是空字符串\n if (typeof errors === 'string' && errors !== '') {\n // 使用 errors 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(errors);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取默认加载组件(配置的或内置的 Spin)\n function getDefaultLoadingComponent() {\n if (defaultRouteLoadingComponent) {\n // 如果配置了默认加载组件,使用 React.lazy 包装\n // 使用懒加载是因为用户可能希望自定义组件支持代码分割\n return React.lazy(() => defaultRouteLoadingComponent().then(module => ({ default: module.default || module })));\n }\n // 如果没有配置默认加载组件,使用框架内置 Loading 组件\n // 直接导入而非懒加载,因为:\n // 1. 内置 Loading 组件无外部依赖\n // 2. 加载组件需要快速显示,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return DefaultRouteLoading;\n }\n\n // 获取加载组件\n function getLoadingComponent() {\n // 如果 loading 是函数,直接使用 React.lazy 包装\n if (typeof loading === 'function') {\n return React.lazy(() => loading().then(module => ({ default: module.default || module })));\n }\n\n const loadingsMap = transformResult.loadings;\n\n // 判断 loading 是否为 string 且不是空字符串\n if (typeof loading === 'string' && loading !== '') {\n // 使用 loading 作为 key 获取 transformResult.loadings 的值\n const loadingResolver = loadingsMap.get(loading);\n\n // 如果获取不到,使用默认加载组件\n if (!loadingResolver) {\n return getDefaultLoadingComponent();\n }\n\n // 如果获取到,使用 React.lazy 包装动态导入函数\n // loadingResolver 是一个返回 Promise 的函数,Promise resolve 后的值是组件模块\n if (typeof loadingResolver === 'function') {\n return React.lazy(() => loadingResolver().then(module => ({ default: module.default || module })));\n }\n\n // 如果 loadingResolver 不是函数,使用默认加载组件\n return getDefaultLoadingComponent();\n }\n\n // 如果 loading 为空,使用默认加载组件\n return getDefaultLoadingComponent();\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n console.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n HydrateFallback: getLoadingComponent(),\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...config\n };\n },\n path\n };\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n\n\n\n"],"names":["React","Navigate","RouteErrorBoundary","DefaultRouteLoading","div","style","padding","textAlign","color","transformRoutesToReactRoutes","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","loading","errors","getErrorComponent","errorsMap","errorResolver","get","default","getDefaultLoadingComponent","lazy","then","module","getLoadingComponent","loadingsMap","loadings","loadingResolver","convertConfig","m","action","loader","shouldRevalidate","Component","console","warn","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","HydrateFallback","id","ErrorBoundary","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","to","replace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["Navigate","RouteErrorBoundary","logger","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","transformRoutesToReactRoutes","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","convertConfig","m","action","loader","shouldRevalidate","Component","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","to","replace"],"mappings":"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"}
|