@vlian/framework 1.2.16 → 1.2.18

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 (55) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/core/router/RouterManager.cjs +32 -2
  3. package/dist/core/router/RouterManager.cjs.map +1 -1
  4. package/dist/core/router/RouterManager.d.ts +5 -0
  5. package/dist/core/router/RouterManager.js +33 -3
  6. package/dist/core/router/RouterManager.js.map +1 -1
  7. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  8. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  9. package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
  10. package/dist/core/router/dev/RouterDevTools.js.map +1 -1
  11. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +24 -4
  12. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  13. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +1 -0
  14. package/dist/core/router/middleware/RouterMiddlewareManager.js +24 -4
  15. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  16. package/dist/core/router/middleware/types.cjs.map +1 -1
  17. package/dist/core/router/middleware/types.d.ts +1 -1
  18. package/dist/core/router/middleware/types.js.map +1 -1
  19. package/dist/core/router/navigation/RouterNavigation.cjs +69 -14
  20. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  21. package/dist/core/router/navigation/RouterNavigation.d.ts +3 -0
  22. package/dist/core/router/navigation/RouterNavigation.js +69 -14
  23. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  24. package/dist/core/router/performance/RouteCache.cjs +34 -13
  25. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  26. package/dist/core/router/performance/RouteCache.d.ts +8 -2
  27. package/dist/core/router/performance/RouteCache.js +34 -13
  28. package/dist/core/router/performance/RouteCache.js.map +1 -1
  29. package/dist/core/router/performance/RoutePreloader.cjs +89 -22
  30. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  31. package/dist/core/router/performance/RoutePreloader.d.ts +9 -1
  32. package/dist/core/router/performance/RoutePreloader.js +89 -22
  33. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  34. package/dist/core/router/types.d.ts +22 -5
  35. package/dist/core/router/types.js.map +1 -1
  36. package/dist/core/router/utils/adapters/react-router/transform.cjs +37 -64
  37. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  38. package/dist/core/router/utils/adapters/react-router/transform.js +37 -59
  39. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  40. package/dist/core/router/utils/transform.cjs +79 -70
  41. package/dist/core/router/utils/transform.cjs.map +1 -1
  42. package/dist/core/router/utils/transform.d.ts +1 -1
  43. package/dist/core/router/utils/transform.js +80 -71
  44. package/dist/core/router/utils/transform.js.map +1 -1
  45. package/dist/core/router/validation/RouterConfigValidator.d.ts +66 -4
  46. package/dist/core/router/validation/schema.cjs +71 -2
  47. package/dist/core/router/validation/schema.cjs.map +1 -1
  48. package/dist/core/router/validation/schema.d.ts +102 -6
  49. package/dist/core/router/validation/schema.js +71 -2
  50. package/dist/core/router/validation/schema.js.map +1 -1
  51. package/dist/index.umd.js +677 -428
  52. package/dist/index.umd.js.map +1 -1
  53. package/dist/request.umd.js +1 -1
  54. package/dist/state.umd.js +1 -1
  55. 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
- function _interop_require_default(obj) {
16
- return obj && obj.__esModule ? obj : {
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,
@@ -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, loading, errors } = route;
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 errors === 'function') {
46
- return errors();
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 errors === 'string' && errors !== '') {
51
- // 使用 errors 作为 key 获取 transformResult.errors 的值
52
- const errorResolver = errorsMap.get(errors);
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
- console.warn(`路由组件未找到 default 导出: ${name}`, m);
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,20 +158,23 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
192
158
  }
193
159
  const reactRoute = {
194
160
  children: [],
195
- HydrateFallback: getLoadingComponent(),
161
+ hydrateFallbackElement: /*#__PURE__*/ (0, _jsxruntime.jsx)(DefaultRouteHydrateFallback, {}),
196
162
  id: name,
197
163
  handle: getHandle(),
198
164
  lazy: async ()=>{
199
165
  const ErrorBoundary = await getErrorComponent();
200
166
  const config = await getConfig();
167
+ const LoadingComponent = await getLoadingComponent();
201
168
  // 如果配置为空,确保至少返回一个空对象,避免展开 undefined
202
169
  if (!config) {
203
170
  return {
204
- ErrorBoundary: ErrorBoundary?.default
171
+ ErrorBoundary: ErrorBoundary?.default,
172
+ HydrateFallback: LoadingComponent?.default
205
173
  };
206
174
  }
207
175
  return {
208
176
  ErrorBoundary: ErrorBoundary?.default,
177
+ HydrateFallback: LoadingComponent?.default,
209
178
  ...config
210
179
  };
211
180
  },
@@ -224,8 +193,10 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
224
193
  index: true,
225
194
  lazy: async ()=>{
226
195
  const ErrorBoundary = await getErrorComponent();
196
+ const LoadingComponent = await getLoadingComponent();
227
197
  return {
228
198
  ErrorBoundary: ErrorBoundary?.default,
199
+ HydrateFallback: LoadingComponent?.default,
229
200
  ...await getConfig(true)
230
201
  };
231
202
  }
@@ -254,8 +225,10 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
254
225
  index: true,
255
226
  lazy: async ()=>{
256
227
  const ErrorBoundary = await getErrorComponent();
228
+ const LoadingComponent = await getLoadingComponent();
257
229
  return {
258
230
  ErrorBoundary: ErrorBoundary?.default,
231
+ HydrateFallback: LoadingComponent?.default,
259
232
  ...await getConfig(true)
260
233
  };
261
234
  }
@@ -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): 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 hydrateFallbackElement: <DefaultRouteHydrateFallback />,\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\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.default,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.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 const LoadingComponent = await getLoadingComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.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 const LoadingComponent = await getLoadingComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.default,\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","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","hydrateFallbackElement","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","Navigate","to","replace"],"mappings":"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"}
@@ -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
- function DefaultRouteLoading() {
4
+ import { logger } from "../../../../../utils";
5
+ function DefaultRouteHydrateFallback() {
6
6
  return /*#__PURE__*/ _jsx("div", {
7
7
  style: {
8
8
  padding: 16,
@@ -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, loading, errors } = route;
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 errors === 'function') {
31
- return errors();
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 errors === 'string' && errors !== '') {
36
- // 使用 errors 作为 key 获取 transformResult.errors 的值
37
- const errorResolver = errorsMap.get(errors);
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
- console.warn(`路由组件未找到 default 导出: ${name}`, m);
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,20 +148,23 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
177
148
  }
178
149
  const reactRoute = {
179
150
  children: [],
180
- HydrateFallback: getLoadingComponent(),
151
+ hydrateFallbackElement: /*#__PURE__*/ _jsx(DefaultRouteHydrateFallback, {}),
181
152
  id: name,
182
153
  handle: getHandle(),
183
154
  lazy: async ()=>{
184
155
  const ErrorBoundary = await getErrorComponent();
185
156
  const config = await getConfig();
157
+ const LoadingComponent = await getLoadingComponent();
186
158
  // 如果配置为空,确保至少返回一个空对象,避免展开 undefined
187
159
  if (!config) {
188
160
  return {
189
- ErrorBoundary: ErrorBoundary?.default
161
+ ErrorBoundary: ErrorBoundary?.default,
162
+ HydrateFallback: LoadingComponent?.default
190
163
  };
191
164
  }
192
165
  return {
193
166
  ErrorBoundary: ErrorBoundary?.default,
167
+ HydrateFallback: LoadingComponent?.default,
194
168
  ...config
195
169
  };
196
170
  },
@@ -209,8 +183,10 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
209
183
  index: true,
210
184
  lazy: async ()=>{
211
185
  const ErrorBoundary = await getErrorComponent();
186
+ const LoadingComponent = await getLoadingComponent();
212
187
  return {
213
188
  ErrorBoundary: ErrorBoundary?.default,
189
+ HydrateFallback: LoadingComponent?.default,
214
190
  ...await getConfig(true)
215
191
  };
216
192
  }
@@ -239,8 +215,10 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
239
215
  index: true,
240
216
  lazy: async ()=>{
241
217
  const ErrorBoundary = await getErrorComponent();
218
+ const LoadingComponent = await getLoadingComponent();
242
219
  return {
243
220
  ErrorBoundary: ErrorBoundary?.default,
221
+ HydrateFallback: LoadingComponent?.default,
244
222
  ...await getConfig(true)
245
223
  };
246
224
  }
@@ -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":";AACA,OAAOA,WAAW,QAAQ;AAC1B,SAEIC,QAAQ,QACL,mBAAmB;AAE1B,SAASC,kBAAkB,QAAQ,uBAAuB;AAG1D,SAASC;IACP,qBACE,KAACC;QAAIC,OAAO;YAAEC,SAAS;YAAIC,WAAW;YAAUC,OAAO;QAAU;kBAAG;;AAIxE;AAGA,OAAO,MAAMC,+BAA+B,OACxCC,QACAC,iBACAC,4BACAC;IAGA;;;KAGC,GACD,SAASC,4BAA4BJ,MAAqB;QACtD,OAAOA,OAAOK,OAAO,CAAC,CAACC,QAAuBC,2BAA2BD;IAC7E;IAEA;;;KAGC,GACD,SAASC,2BAA2BD,KAAkB;QAClD,MAAM,EACFE,UAAU,KAAK,EACfC,oBAAoB,KAAK,EACzBC,IAAI,EACJC,IAAI,EACJC,MAAM,EACNC,QAAQ,EACRC,IAAI,EACJC,MAAM,EACNC,OAAO,EACPC,MAAM,EACT,GAAGX;QAEJ,SAAS;QACT,eAAeY;YACX,qBAAqB;YACrB,IAAI,OAAOD,WAAW,YAAY;gBAC9B,OAAOA;YACX;YAEA,MAAME,YAAYlB,gBAAgBgB,MAAM;YAExC,+BAA+B;YAC/B,IAAI,OAAOA,WAAW,YAAYA,WAAW,IAAI;gBAC7C,gDAAgD;gBAChD,MAAMG,gBAAgBD,UAAUE,GAAG,CAACJ;gBAEpC,iBAAiB;gBACjB,IAAI,CAACG,eAAe;oBAChB,OAAO;gBACX;gBAEA,yBAAyB;gBACzB,IAAI,OAAOA,kBAAkB,YAAY;oBACrC,OAAOA;gBACX;gBAEA,OAAO;YACX;YAEA,qDAAqD;YACrD,IAAIlB,4BAA4B;gBAC5B,sBAAsB;gBACtB,OAAOA;YACX;YAEA,2CAA2C;YAC3C,gBAAgB;YAChB,oCAAoC;YACpC,yBAAyB;YACzB,sBAAsB;YACtB,OAAO;gBAAEoB,SAAS9B;YAAmB;QACzC;QAEA,yBAAyB;QACzB,SAAS+B;YACL,IAAIpB,8BAA8B;gBAC9B,+BAA+B;gBAC/B,4BAA4B;gBAC5B,qBAAOb,MAAMkC,IAAI,CAAC,IAAMrB,+BAA+BsB,IAAI,CAACC,CAAAA,SAAW,CAAA;4BAAEJ,SAASI,OAAOJ,OAAO,IAAII;wBAAO,CAAA;YAC/G;YACA,iCAAiC;YACjC,gBAAgB;YAChB,wBAAwB;YACxB,yBAAyB;YACzB,sBAAsB;YACtB,OAAOjC;QACX;QAEA,SAAS;QACT,SAASkC;YACL,oCAAoC;YACpC,IAAI,OAAOX,YAAY,YAAY;gBAC/B,qBAAO1B,MAAMkC,IAAI,CAAC,IAAMR,UAAUS,IAAI,CAACC,CAAAA,SAAW,CAAA;4BAAEJ,SAASI,OAAOJ,OAAO,IAAII;wBAAO,CAAA;YAC1F;YAEA,MAAME,cAAc3B,gBAAgB4B,QAAQ;YAE5C,gCAAgC;YAChC,IAAI,OAAOb,YAAY,YAAYA,YAAY,IAAI;gBAC/C,mDAAmD;gBACnD,MAAMc,kBAAkBF,YAAYP,GAAG,CAACL;gBAExC,kBAAkB;gBAClB,IAAI,CAACc,iBAAiB;oBAClB,OAAOP;gBACX;gBAEA,+BAA+B;gBAC/B,6DAA6D;gBAC7D,IAAI,OAAOO,oBAAoB,YAAY;oBACvC,qBAAOxC,MAAMkC,IAAI,CAAC,IAAMM,kBAAkBL,IAAI,CAACC,CAAAA,SAAW,CAAA;gCAAEJ,SAASI,OAAOJ,OAAO,IAAII;4BAAO,CAAA;gBAClG;gBAEA,mCAAmC;gBACnC,OAAOH;YACX;YAEA,yBAAyB;YACzB,OAAOA;QACX;QAEA,SAAS;QACT,SAASQ,cAAcC,CAAM;YACzB,IAAI,CAACA,GAAG;gBACJ,OAAO;YACX;YACA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,gBAAgB,EAAEb,SAASc,SAAS,EAAE,GAAGJ;YAEjE,wBAAwB;YACxB,IAAI,CAACI,WAAW;gBACZC,QAAQC,IAAI,CAAC,CAAC,oBAAoB,EAAE5B,MAAM,EAAEsB;YAChD;YAEA,OAAO;gBACHC;gBACAC;gBACAC;gBACAC;YACJ;QACJ;QAEA,OAAO;QACP,eAAeG,UAAUC,QAAiB,KAAK;YAC3C,2BAA2B;YAC3B,IAAIzB,UAAU,CAACyB,OAAO;gBAClB,qBAAqB;gBACrB,IAAI,OAAOzB,WAAW,YAAY;oBAC9B,MAAM0B,SAAS,MAAM1B;oBACrB,OAAOgB,cAAcU;gBACzB;gBAEA,2BAA2B;gBAC3B,IAAI,OAAO1B,WAAW,UAAU;oBAC5B,MAAM2B,iBAAiBzC,gBAAgB0C,OAAO,CAACtB,GAAG,CAACN;oBACnD,IAAI,CAAC2B,gBAAgB;wBACjB,MAAM,IAAIE,MAAM,CAAC,MAAM,EAAE7B,OAAO,MAAM,CAAC;oBAC3C;oBACA,MAAM0B,SAAS,MAAMC;oBACrB,OAAOX,cAAcU;gBACzB;YACJ;YAEA,IAAII,WAAWnC;YAEf,oBAAoB;YACpB,IAAImC,aAAa,YAAY;gBACzBA,WAAW;YACf;YAEA,IAAI/B,QAAS,CAAA,CAACD,UAAUiC,UAAUN,KAAI,GAAI;gBACtC,mBAAmB;gBACnB,IAAI,OAAO1B,SAAS,YAAY;oBAC5B,MAAM2B,SAAS,MAAM3B;oBACrB,OAAOiB,cAAcU;gBACzB;gBAEA,yBAAyB;gBACzB,IAAI,OAAO3B,SAAS,UAAU;oBAC1B,MAAMiC,eAAe9C,gBAAgB+C,KAAK,CAAC3B,GAAG,CAACP;oBAC/C,IAAI,CAACiC,cAAc;wBACf,MAAM,IAAIH,MAAM,CAAC,MAAM,EAAE9B,KAAK,MAAM,CAAC;oBACzC;oBACA,MAAM2B,SAAS,MAAMM;oBACrB,OAAOhB,cAAcU;gBACzB;YACJ;YAEA,OAAO;QACX;QAEA,kBAAkB;QAClB,SAASQ,UAAUT,QAAiB,KAAK;YACrC,IAAI,AAACzB,CAAAA,UAAUP,OAAM,KAAM,CAACgC,OAAO;gBAC/B,OAAO;YACX;YACA,OAAO;gBACH,GAAG5B,MAAM;gBACTF;gBACAC;YACJ;QACJ;QAGA,MAAMuC,aAA0B;YAC5BrC,UAAU,EAAE;YACZsC,iBAAiBxB;YACjByB,IAAI1C;YACJE,QAAQqC;YACRzB,MAAM;gBACF,MAAM6B,gBAAgB,MAAMnC;gBAC5B,MAAMuB,SAAS,MAAMF;gBAErB,oCAAoC;gBACpC,IAAI,CAACE,QAAQ;oBACT,OAAO;wBACHY,eAAeA,eAAe/B;oBAClC;gBACJ;gBAEA,OAAO;oBACH+B,eAAeA,eAAe/B;oBAC9B,GAAGmB,MAAM;gBACb;YACJ;YACA9B;QACJ;QAEA,QAAQ;QACR,IAAIE,UAAUiC,QAAQ;YAClBI,WAAWrC,QAAQ,GAAGA,SAASR,OAAO,CAACiD,CAAAA,QAAS/C,2BAA2B+C,QAAQC,IAAI,CAAC,CAACC,GAAGC;gBACxF,MAAMC,SAASF,EAAE5C,MAAM,EAAE+C,SAAS;gBAClC,MAAMC,SAASH,EAAE7C,MAAM,EAAE+C,SAAS;gBAClC,OAAOD,SAASE;YACpB;YAEA,IAAI9C,QAAQ,CAACN,SAAS;gBAClB0C,WAAWrC,QAAQ,CAACgD,OAAO,CAAC;oBACxBjD,QAAQqC,UAAU;oBAClBT,OAAO;oBACPhB,MAAM;wBACF,MAAM6B,gBAAgB,MAAMnC;wBAC5B,OAAO;4BACHmC,eAAeA,eAAe/B;4BAC9B,GAAI,MAAMiB,UAAU,KAAK;wBAC7B;oBACJ;gBACJ;YACJ;YAEA,IAAI9B,qBAAqBD,SAAS;gBAC9B,MAAM,CAACsD,WAAW,GAAGZ,WAAWrC,QAAQ;gBACxC,IAAIiD,YAAYnD,MAAM;oBAClBuC,WAAWrC,QAAQ,CAACgD,OAAO,CAAC;wBACxBrB,OAAO;wBACP5B,QAAQqC,UAAU;wBAClBc,uBAAS,KAACxE;4BAASyE,IAAIF,WAAWnD,IAAI;4BAAYsD,OAAO;;oBAC7D;gBACJ;YACJ;QAEJ;QACA,qDAAqD;QACrD,gDAAgD;QAChD,IAAI,AAAC,CAAA,CAACpD,YAAYA,SAASiC,MAAM,KAAK,CAAA,KAAM/B,UAAUD,QAAQ,CAACN,SAAS;YACpE0C,WAAWrC,QAAQ,GAAG;gBAAC;oBACnBD,QAAQqC,UAAU;oBAClBT,OAAO;oBACPhB,MAAM;wBACF,MAAM6B,gBAAgB,MAAMnC;wBAC5B,OAAO;4BACHmC,eAAeA,eAAe/B;4BAC9B,GAAI,MAAMiB,UAAU,KAAK;wBAC7B;oBACJ;gBACJ;aAAE;QACN;QAEA,OAAOW;IACX;IAEA,OAAO9C,4BAA4BJ;AACvC,EAAC"}
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): 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 hydrateFallbackElement: <DefaultRouteHydrateFallback />,\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\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.default,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.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 const LoadingComponent = await getLoadingComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.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 const LoadingComponent = await getLoadingComponent();\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback: LoadingComponent?.default,\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","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","hydrateFallbackElement","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","to","replace"],"mappings":"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"}