@vlian/framework 1.2.59 → 1.2.60
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/index.cjs +1 -22
- package/dist/analytics.umd.js +1 -1
- package/dist/components/LocaleSwitch.cjs +1 -116
- package/dist/components/ThemeSwitch.cjs +1 -115
- package/dist/components/index.cjs +1 -20
- package/dist/components/persistence.cjs +1 -58
- package/dist/core/Test.cjs +1 -64
- package/dist/core/app/AppContext.cjs +1 -348
- package/dist/core/app/AppContext.types.cjs +1 -4
- package/dist/core/app/BasicLayout.cjs +1 -122
- package/dist/core/app/DefaultApp.cjs +1 -150
- package/dist/core/app/index.cjs +1 -41
- package/dist/core/config/AppConfig.cjs +1 -139
- package/dist/core/config/ConfigLoader.cjs +1 -323
- package/dist/core/config/ConfigValidator.cjs +2 -133
- package/dist/core/config/index.cjs +1 -28
- package/dist/core/dev/DevTools.cjs +1 -226
- package/dist/core/error/ErrorBoundary.cjs +1 -401
- package/dist/core/error/ErrorHandler.cjs +1 -275
- package/dist/core/error/index.cjs +1 -34
- package/dist/core/event/AppEventBus.cjs +1 -444
- package/dist/core/event/frameworkEvents.cjs +1 -141
- package/dist/core/event/hooks.cjs +1 -69
- package/dist/core/event/index.cjs +1 -41
- package/dist/core/event/types.cjs +1 -62
- package/dist/core/event/useEventBus.cjs +1 -25
- package/dist/core/index.cjs +1 -140
- package/dist/core/initialization/InitializationErrorThrower.cjs +1 -75
- package/dist/core/initialization/index.cjs +1 -26
- package/dist/core/initialization/initialization.cjs +1 -64
- package/dist/core/initialization/initializationErrorState.cjs +1 -66
- package/dist/core/kernel/defaultAdapters.cjs +1 -184
- package/dist/core/kernel/errors.cjs +1 -69
- package/dist/core/kernel/index.cjs +1 -20
- package/dist/core/kernel/startKernel.cjs +1 -200
- package/dist/core/kernel/types.cjs +1 -4
- package/dist/core/middleware.cjs +1 -73
- package/dist/core/plugin/PluginEventBus.cjs +1 -298
- package/dist/core/plugin/PluginSandbox.cjs +1 -137
- package/dist/core/plugin.cjs +1 -494
- package/dist/core/router/RouterManager.cjs +1 -286
- package/dist/core/router/adapter/AdapterManager.cjs +1 -235
- package/dist/core/router/adapter/index.cjs +1 -22
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -128
- package/dist/core/router/adapter/react-router/index.cjs +1 -20
- package/dist/core/router/adapter/types.cjs +1 -6
- package/dist/core/router/dev/RouterDevTools.cjs +1 -260
- package/dist/core/router/dev/index.cjs +1 -20
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +1 -193
- package/dist/core/router/dynamic/index.cjs +1 -20
- package/dist/core/router/errors/RouterError.cjs +1 -61
- package/dist/core/router/errors/index.cjs +1 -20
- package/dist/core/router/index.cjs +1 -36
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +1 -144
- package/dist/core/router/lifecycle/index.cjs +1 -20
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +1 -193
- package/dist/core/router/middleware/auth.cjs +1 -66
- package/dist/core/router/middleware/index.cjs +1 -22
- package/dist/core/router/middleware/types.cjs +1 -6
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -227
- package/dist/core/router/monitoring/index.cjs +1 -20
- package/dist/core/router/navigation/RouterNavigation.cjs +1 -239
- package/dist/core/router/navigation/index.cjs +1 -20
- package/dist/core/router/performance/RouteCache.cjs +1 -305
- package/dist/core/router/performance/RoutePreloader.cjs +1 -292
- package/dist/core/router/performance/index.cjs +1 -21
- package/dist/core/router/plugin/RouterPluginManager.cjs +1 -262
- package/dist/core/router/plugin/index.cjs +1 -21
- package/dist/core/router/plugin/types.cjs +1 -39
- package/dist/core/router/types.cjs +1 -4
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -129
- package/dist/core/router/utils/adapters/react-router/transform.cjs +1 -250
- package/dist/core/router/utils/transform.cjs +1 -780
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -83
- package/dist/core/router/validation/index.cjs +1 -21
- package/dist/core/router/validation/schema.cjs +1 -159
- package/dist/core/router/version/RouteVersionManager.cjs +1 -205
- package/dist/core/router/version/index.cjs +1 -20
- package/dist/core/splash/SplashScreen.cjs +1 -341
- package/dist/core/splash/index.cjs +1 -22
- package/dist/core/splash/splashScreenUtils.cjs +1 -38
- package/dist/core/startup/AppInstance.cjs +1 -239
- package/dist/core/startup/environment.cjs +1 -169
- package/dist/core/startup/index.cjs +1 -23
- package/dist/core/startup/initializeServices.cjs +1 -226
- package/dist/core/startup/performanceTracker.cjs +1 -179
- package/dist/core/startup/renderApp.cjs +1 -314
- package/dist/core/startup/startApp.cjs +1 -317
- package/dist/core/types.cjs +1 -4
- package/dist/index.cjs +1 -52
- package/dist/index.umd.cjs +1 -27
- package/dist/index.umd.js +1 -1
- package/dist/kernel/constants.cjs +1 -65
- package/dist/kernel/index.cjs +1 -38
- package/dist/kernel/kernel.cjs +1 -295
- package/dist/kernel/manager/cacheManager.cjs +1 -46
- package/dist/kernel/manager/i18n/I18nManager.cjs +1 -91
- package/dist/kernel/manager/i18n/i18n.persistence.cjs +1 -60
- package/dist/kernel/manager/i18n/i18n.schema.cjs +1 -86
- package/dist/kernel/manager/i18n/index.cjs +1 -11
- package/dist/kernel/manager/i18nManager.cjs +1 -11
- package/dist/kernel/manager/index.cjs +1 -28
- package/dist/kernel/manager/logger/LoggerManager.cjs +1 -107
- package/dist/kernel/manager/logger/index.cjs +1 -11
- package/dist/kernel/manager/logger/logger.persistence.cjs +1 -62
- package/dist/kernel/manager/logger/logger.schema.cjs +1 -74
- package/dist/kernel/manager/loggerManager.cjs +1 -11
- package/dist/kernel/manager/theme/ThemeManager.cjs +1 -84
- package/dist/kernel/manager/theme/index.cjs +1 -11
- package/dist/kernel/manager/theme/theme.dom.cjs +1 -61
- package/dist/kernel/manager/theme/theme.persistence.cjs +1 -57
- package/dist/kernel/manager/theme/theme.schema.cjs +1 -122
- package/dist/kernel/manager/themeManager.cjs +1 -11
- package/dist/kernel/types.cjs +1 -4
- package/dist/library/index.cjs +1 -19
- package/dist/library/locale/index.cjs +1 -39
- package/dist/library/locale/langs/en-us/index.cjs +1 -32
- package/dist/library/locale/langs/zh-cn/index.cjs +1 -32
- package/dist/library/locale/types.cjs +1 -4
- package/dist/library/storage/cache.cjs +1 -243
- package/dist/library/storage/encryption.cjs +1 -147
- package/dist/library/storage/index.cjs +1 -124
- package/dist/state/StateManager.cjs +1 -166
- package/dist/state/adapters/AdapterFactory.cjs +1 -89
- package/dist/state/adapters/DefaultAdapter.cjs +1 -75
- package/dist/state/adapters/ReduxAdapter.cjs +1 -443
- package/dist/state/adapters/ZustandAdapter.cjs +1 -69
- package/dist/state/adapters/index.cjs +1 -44
- package/dist/state/adapters/types.cjs +1 -20
- package/dist/state/core/DerivedStateInstance.cjs +1 -174
- package/dist/state/core/StateInstance.cjs +1 -170
- package/dist/state/core/StateRegistry.cjs +1 -110
- package/dist/state/core/StateScope.cjs +1 -137
- package/dist/state/core/index.cjs +1 -30
- package/dist/state/index.cjs +1 -30
- package/dist/state/types.cjs +1 -12
- package/dist/state.umd.js +1 -1
- package/dist/types.cjs +1 -4
- package/dist/utils/analytics.cjs +1 -217
- package/dist/utils/configSecurity.cjs +3 -182
- package/dist/utils/csrf.cjs +1 -18
- package/dist/utils/errors/ErrorCodes.cjs +1 -25
- package/dist/utils/errors.cjs +1 -111
- package/dist/utils/index.cjs +1 -135
- package/dist/utils/logger.cjs +1 -25
- package/dist/utils/logger.types.cjs +1 -11
- package/dist/utils/monitoring.cjs +1 -18
- package/dist/utils/performance.cjs +1 -22
- package/dist/utils/resourceLoader.cjs +1 -22
- package/dist/utils/runtimeSecurity.cjs +1 -11
- package/dist/utils/security.cjs +1 -19
- package/dist/utils/traceId.cjs +1 -37
- package/dist/utils/validation.cjs +1 -19
- package/package.json +7 -3
|
@@ -1,227 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 路由监控服务
|
|
3
|
-
* 提供路由访问统计、性能监控、错误监控等功能
|
|
4
|
-
*/ "use strict";
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
function _export(target, all) {
|
|
9
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
_export(exports, {
|
|
15
|
-
get RouterMonitoring () {
|
|
16
|
-
return RouterMonitoring;
|
|
17
|
-
},
|
|
18
|
-
get getRouterMonitoring () {
|
|
19
|
-
return getRouterMonitoring;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
const _monitoring = require("@vlian/monitoring");
|
|
23
|
-
const _logger = require("@vlian/logger");
|
|
24
|
-
function _define_property(obj, key, value) {
|
|
25
|
-
if (key in obj) {
|
|
26
|
-
Object.defineProperty(obj, key, {
|
|
27
|
-
value: value,
|
|
28
|
-
enumerable: true,
|
|
29
|
-
configurable: true,
|
|
30
|
-
writable: true
|
|
31
|
-
});
|
|
32
|
-
} else {
|
|
33
|
-
obj[key] = value;
|
|
34
|
-
}
|
|
35
|
-
return obj;
|
|
36
|
-
}
|
|
37
|
-
let RouterMonitoring = class RouterMonitoring {
|
|
38
|
-
/**
|
|
39
|
-
* 记录路由访问
|
|
40
|
-
*/ trackRouteAccess(to, from, success = true, error) {
|
|
41
|
-
if (!this.config.enabled || !this.config.trackAccess) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
// 采样检查
|
|
45
|
-
if (Math.random() > this.config.sampleRate) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const record = {
|
|
49
|
-
path: to.path,
|
|
50
|
-
name: to.meta?.name,
|
|
51
|
-
timestamp: Date.now(),
|
|
52
|
-
from: from?.path,
|
|
53
|
-
success,
|
|
54
|
-
error: error?.message
|
|
55
|
-
};
|
|
56
|
-
// 如果有当前路由,计算持续时间
|
|
57
|
-
if (this.currentRoute && this.currentRouteStartTime > 0) {
|
|
58
|
-
record.duration = Date.now() - this.currentRouteStartTime;
|
|
59
|
-
}
|
|
60
|
-
this.accessRecords.push(record);
|
|
61
|
-
// 限制记录数量
|
|
62
|
-
if (this.accessRecords.length > this.config.maxRecords) {
|
|
63
|
-
this.accessRecords.shift();
|
|
64
|
-
}
|
|
65
|
-
// 上报到监控服务
|
|
66
|
-
this.monitoringService.trackEvent('route_access', {
|
|
67
|
-
path: to.path,
|
|
68
|
-
name: to.meta?.name,
|
|
69
|
-
success,
|
|
70
|
-
error: error?.message
|
|
71
|
-
});
|
|
72
|
-
// 更新当前路由
|
|
73
|
-
this.currentRoute = to;
|
|
74
|
-
this.currentRouteStartTime = Date.now();
|
|
75
|
-
_logger.logger.debug('路由访问已记录', record);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 记录路由性能指标
|
|
79
|
-
*/ trackRoutePerformance(routeName, metrics) {
|
|
80
|
-
if (!this.config.enabled || !this.config.trackPerformance) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
// 采样检查
|
|
84
|
-
if (Math.random() > this.config.sampleRate) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const routeMetrics = this.performanceMetrics.get(routeName) || [];
|
|
88
|
-
routeMetrics.push(metrics);
|
|
89
|
-
// 限制记录数量
|
|
90
|
-
if (routeMetrics.length > 100) {
|
|
91
|
-
routeMetrics.shift();
|
|
92
|
-
}
|
|
93
|
-
this.performanceMetrics.set(routeName, routeMetrics);
|
|
94
|
-
// 上报到监控服务
|
|
95
|
-
this.monitoringService.reportPerformance({
|
|
96
|
-
[`route_${routeName}_match`]: metrics.matchTime || 0,
|
|
97
|
-
[`route_${routeName}_load`]: metrics.loadTime || 0,
|
|
98
|
-
[`route_${routeName}_render`]: metrics.renderTime || 0,
|
|
99
|
-
[`route_${routeName}_total`]: metrics.totalTime || 0
|
|
100
|
-
});
|
|
101
|
-
_logger.logger.debug(`路由性能指标已记录: ${routeName}`, metrics);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* 记录路由错误
|
|
105
|
-
*/ trackRouteError(error, context) {
|
|
106
|
-
if (!this.config.enabled || !this.config.trackErrors) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
// 采样检查
|
|
110
|
-
if (Math.random() > this.config.sampleRate) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
// 上报到监控服务
|
|
114
|
-
this.monitoringService.captureError(error, {
|
|
115
|
-
type: 'router',
|
|
116
|
-
...context
|
|
117
|
-
});
|
|
118
|
-
_logger.logger.error('路由错误已记录', error, context);
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* 获取路由访问统计
|
|
122
|
-
*/ getAccessStats() {
|
|
123
|
-
const stats = {
|
|
124
|
-
total: this.accessRecords.length,
|
|
125
|
-
success: 0,
|
|
126
|
-
failed: 0,
|
|
127
|
-
byPath: {},
|
|
128
|
-
byName: {},
|
|
129
|
-
averageDuration: 0
|
|
130
|
-
};
|
|
131
|
-
let totalDuration = 0;
|
|
132
|
-
let durationCount = 0;
|
|
133
|
-
for (const record of this.accessRecords){
|
|
134
|
-
if (record.success) {
|
|
135
|
-
stats.success++;
|
|
136
|
-
} else {
|
|
137
|
-
stats.failed++;
|
|
138
|
-
}
|
|
139
|
-
stats.byPath[record.path] = (stats.byPath[record.path] || 0) + 1;
|
|
140
|
-
if (record.name) {
|
|
141
|
-
stats.byName[record.name] = (stats.byName[record.name] || 0) + 1;
|
|
142
|
-
}
|
|
143
|
-
if (record.duration) {
|
|
144
|
-
totalDuration += record.duration;
|
|
145
|
-
durationCount++;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
stats.averageDuration = durationCount > 0 ? totalDuration / durationCount : 0;
|
|
149
|
-
return stats;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* 获取路由性能统计
|
|
153
|
-
*/ getPerformanceStats() {
|
|
154
|
-
const stats = {};
|
|
155
|
-
for (const [routeName, metrics] of this.performanceMetrics.entries()){
|
|
156
|
-
let totalMatchTime = 0;
|
|
157
|
-
let totalLoadTime = 0;
|
|
158
|
-
let totalRenderTime = 0;
|
|
159
|
-
let totalTotalTime = 0;
|
|
160
|
-
let count = 0;
|
|
161
|
-
for (const metric of metrics){
|
|
162
|
-
if (metric.matchTime) {
|
|
163
|
-
totalMatchTime += metric.matchTime;
|
|
164
|
-
}
|
|
165
|
-
if (metric.loadTime) {
|
|
166
|
-
totalLoadTime += metric.loadTime;
|
|
167
|
-
}
|
|
168
|
-
if (metric.renderTime) {
|
|
169
|
-
totalRenderTime += metric.renderTime;
|
|
170
|
-
}
|
|
171
|
-
if (metric.totalTime) {
|
|
172
|
-
totalTotalTime += metric.totalTime;
|
|
173
|
-
}
|
|
174
|
-
count++;
|
|
175
|
-
}
|
|
176
|
-
stats[routeName] = {
|
|
177
|
-
count,
|
|
178
|
-
averageMatchTime: count > 0 ? totalMatchTime / count : 0,
|
|
179
|
-
averageLoadTime: count > 0 ? totalLoadTime / count : 0,
|
|
180
|
-
averageRenderTime: count > 0 ? totalRenderTime / count : 0,
|
|
181
|
-
averageTotalTime: count > 0 ? totalTotalTime / count : 0
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
return stats;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* 清空所有记录
|
|
188
|
-
*/ clear() {
|
|
189
|
-
this.accessRecords = [];
|
|
190
|
-
this.performanceMetrics.clear();
|
|
191
|
-
_logger.logger.debug('路由监控记录已清空');
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* 获取监控报告
|
|
195
|
-
*/ getReport() {
|
|
196
|
-
return {
|
|
197
|
-
access: this.getAccessStats(),
|
|
198
|
-
performance: this.getPerformanceStats(),
|
|
199
|
-
timestamp: Date.now()
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
constructor(config = {}){
|
|
203
|
-
_define_property(this, "accessRecords", []);
|
|
204
|
-
_define_property(this, "performanceMetrics", new Map());
|
|
205
|
-
_define_property(this, "config", void 0);
|
|
206
|
-
_define_property(this, "monitoringService", (0, _monitoring.getMonitoring)());
|
|
207
|
-
_define_property(this, "currentRouteStartTime", 0);
|
|
208
|
-
_define_property(this, "currentRoute", void 0);
|
|
209
|
-
this.config = {
|
|
210
|
-
enabled: config.enabled ?? true,
|
|
211
|
-
trackAccess: config.trackAccess ?? true,
|
|
212
|
-
trackPerformance: config.trackPerformance ?? true,
|
|
213
|
-
trackErrors: config.trackErrors ?? true,
|
|
214
|
-
maxRecords: config.maxRecords ?? 1000,
|
|
215
|
-
sampleRate: config.sampleRate ?? 1.0
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
/**
|
|
220
|
-
* 获取路由监控服务单例
|
|
221
|
-
*/ let routerMonitoringInstance = null;
|
|
222
|
-
function getRouterMonitoring(config) {
|
|
223
|
-
if (!routerMonitoringInstance) {
|
|
224
|
-
routerMonitoringInstance = new RouterMonitoring(config);
|
|
225
|
-
}
|
|
226
|
-
return routerMonitoringInstance;
|
|
227
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get RouterMonitoring(){return RouterMonitoring},get getRouterMonitoring(){return getRouterMonitoring}});const _monitoring=require("@vlian/monitoring");const _logger=require("@vlian/logger");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let RouterMonitoring=class RouterMonitoring{trackRouteAccess(to,from,success=true,error){if(!this.config.enabled||!this.config.trackAccess){return}if(Math.random()>this.config.sampleRate){return}const record={path:to.path,name:to.meta?.name,timestamp:Date.now(),from:from?.path,success,error:error?.message};if(this.currentRoute&&this.currentRouteStartTime>0){record.duration=Date.now()-this.currentRouteStartTime}this.accessRecords.push(record);if(this.accessRecords.length>this.config.maxRecords){this.accessRecords.shift()}this.monitoringService.trackEvent("route_access",{path:to.path,name:to.meta?.name,success,error:error?.message});this.currentRoute=to;this.currentRouteStartTime=Date.now();_logger.logger.debug("路由访问已记录",record)}trackRoutePerformance(routeName,metrics){if(!this.config.enabled||!this.config.trackPerformance){return}if(Math.random()>this.config.sampleRate){return}const routeMetrics=this.performanceMetrics.get(routeName)||[];routeMetrics.push(metrics);if(routeMetrics.length>100){routeMetrics.shift()}this.performanceMetrics.set(routeName,routeMetrics);this.monitoringService.reportPerformance({[`route_${routeName}_match`]:metrics.matchTime||0,[`route_${routeName}_load`]:metrics.loadTime||0,[`route_${routeName}_render`]:metrics.renderTime||0,[`route_${routeName}_total`]:metrics.totalTime||0});_logger.logger.debug(`路由性能指标已记录: ${routeName}`,metrics)}trackRouteError(error,context){if(!this.config.enabled||!this.config.trackErrors){return}if(Math.random()>this.config.sampleRate){return}this.monitoringService.captureError(error,{type:"router",...context});_logger.logger.error("路由错误已记录",error,context)}getAccessStats(){const stats={total:this.accessRecords.length,success:0,failed:0,byPath:{},byName:{},averageDuration:0};let totalDuration=0;let durationCount=0;for(const record of this.accessRecords){if(record.success){stats.success++}else{stats.failed++}stats.byPath[record.path]=(stats.byPath[record.path]||0)+1;if(record.name){stats.byName[record.name]=(stats.byName[record.name]||0)+1}if(record.duration){totalDuration+=record.duration;durationCount++}}stats.averageDuration=durationCount>0?totalDuration/durationCount:0;return stats}getPerformanceStats(){const stats={};for(const[routeName,metrics]of this.performanceMetrics.entries()){let totalMatchTime=0;let totalLoadTime=0;let totalRenderTime=0;let totalTotalTime=0;let count=0;for(const metric of metrics){if(metric.matchTime){totalMatchTime+=metric.matchTime}if(metric.loadTime){totalLoadTime+=metric.loadTime}if(metric.renderTime){totalRenderTime+=metric.renderTime}if(metric.totalTime){totalTotalTime+=metric.totalTime}count++}stats[routeName]={count,averageMatchTime:count>0?totalMatchTime/count:0,averageLoadTime:count>0?totalLoadTime/count:0,averageRenderTime:count>0?totalRenderTime/count:0,averageTotalTime:count>0?totalTotalTime/count:0}}return stats}clear(){this.accessRecords=[];this.performanceMetrics.clear();_logger.logger.debug("路由监控记录已清空")}getReport(){return{access:this.getAccessStats(),performance:this.getPerformanceStats(),timestamp:Date.now()}}constructor(config={}){_define_property(this,"accessRecords",[]);_define_property(this,"performanceMetrics",new Map);_define_property(this,"config",void 0);_define_property(this,"monitoringService",(0,_monitoring.getMonitoring)());_define_property(this,"currentRouteStartTime",0);_define_property(this,"currentRoute",void 0);this.config={enabled:config.enabled??true,trackAccess:config.trackAccess??true,trackPerformance:config.trackPerformance??true,trackErrors:config.trackErrors??true,maxRecords:config.maxRecords??1e3,sampleRate:config.sampleRate??1}}};let routerMonitoringInstance=null;function getRouterMonitoring(config){if(!routerMonitoringInstance){routerMonitoringInstance=new RouterMonitoring(config)}return routerMonitoringInstance}
|
|
@@ -1,20 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 路由监控模块入口
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
_export_star(require("./RouterMonitoring"), exports);
|
|
8
|
-
function _export_star(from, to) {
|
|
9
|
-
Object.keys(from).forEach(function(k) {
|
|
10
|
-
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
11
|
-
Object.defineProperty(to, k, {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: function() {
|
|
14
|
-
return from[k];
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
return from;
|
|
20
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./RouterMonitoring"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
|
|
@@ -1,239 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 路由导航 API
|
|
3
|
-
* 提供框架级别的路由导航能力,封装 react-router-dom 的导航功能
|
|
4
|
-
*/ "use strict";
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
Object.defineProperty(exports, "RouterNavigation", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function() {
|
|
11
|
-
return RouterNavigation;
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
const _logger = require("@vlian/logger");
|
|
15
|
-
const _lifecycle = require("../lifecycle");
|
|
16
|
-
const _middleware = require("../middleware");
|
|
17
|
-
function _define_property(obj, key, value) {
|
|
18
|
-
if (key in obj) {
|
|
19
|
-
Object.defineProperty(obj, key, {
|
|
20
|
-
value: value,
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
obj[key] = value;
|
|
27
|
-
}
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
31
|
-
if (typeof WeakMap !== "function") return null;
|
|
32
|
-
var cacheBabelInterop = new WeakMap();
|
|
33
|
-
var cacheNodeInterop = new WeakMap();
|
|
34
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
35
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
36
|
-
})(nodeInterop);
|
|
37
|
-
}
|
|
38
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
39
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
40
|
-
return obj;
|
|
41
|
-
}
|
|
42
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
43
|
-
return {
|
|
44
|
-
default: obj
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
48
|
-
if (cache && cache.has(obj)) {
|
|
49
|
-
return cache.get(obj);
|
|
50
|
-
}
|
|
51
|
-
var newObj = {
|
|
52
|
-
__proto__: null
|
|
53
|
-
};
|
|
54
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
55
|
-
for(var key in obj){
|
|
56
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
57
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
58
|
-
if (desc && (desc.get || desc.set)) {
|
|
59
|
-
Object.defineProperty(newObj, key, desc);
|
|
60
|
-
} else {
|
|
61
|
-
newObj[key] = obj[key];
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
newObj.default = obj;
|
|
66
|
-
if (cache) {
|
|
67
|
-
cache.set(obj, newObj);
|
|
68
|
-
}
|
|
69
|
-
return newObj;
|
|
70
|
-
}
|
|
71
|
-
let RouterNavigation = class RouterNavigation {
|
|
72
|
-
static buildTargetPath(to, query) {
|
|
73
|
-
const base = typeof window !== 'undefined' && window.location?.origin ? window.location.origin : 'http://localhost';
|
|
74
|
-
const url = new URL(to, base);
|
|
75
|
-
if (query && Object.keys(query).length > 0) {
|
|
76
|
-
const params = new URLSearchParams(url.search);
|
|
77
|
-
Object.entries(query).forEach(([key, value])=>{
|
|
78
|
-
if (value === undefined || value === null) {
|
|
79
|
-
params.delete(key);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
params.set(key, String(value));
|
|
83
|
-
});
|
|
84
|
-
url.search = params.toString();
|
|
85
|
-
}
|
|
86
|
-
return `${url.pathname}${url.search}${url.hash}`;
|
|
87
|
-
}
|
|
88
|
-
static async navigateInternal(to, options, depth, visited) {
|
|
89
|
-
const startTime = performance.now();
|
|
90
|
-
if (depth > this.MAX_REDIRECTS) {
|
|
91
|
-
throw new Error(`路由重定向次数超过上限(${this.MAX_REDIRECTS}),可能存在循环重定向`);
|
|
92
|
-
}
|
|
93
|
-
const targetPath = this.buildTargetPath(to, options?.query);
|
|
94
|
-
if (visited.has(targetPath)) {
|
|
95
|
-
throw new Error(`检测到循环重定向: ${targetPath}`);
|
|
96
|
-
}
|
|
97
|
-
visited.add(targetPath);
|
|
98
|
-
const routerManager = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../RouterManager"))).then((m)=>m.getRouterManager());
|
|
99
|
-
const router = routerManager.getRouter();
|
|
100
|
-
if (!router) {
|
|
101
|
-
throw new Error('路由未初始化,无法导航');
|
|
102
|
-
}
|
|
103
|
-
// 获取当前路由信息
|
|
104
|
-
const currentLocation = this.getCurrentRoute();
|
|
105
|
-
// 构建目标路由位置
|
|
106
|
-
const targetLocation = {
|
|
107
|
-
path: targetPath,
|
|
108
|
-
query: options?.query
|
|
109
|
-
};
|
|
110
|
-
// 执行生命周期钩子
|
|
111
|
-
const lifecycleManager = (0, _lifecycle.getRouterLifecycleManager)();
|
|
112
|
-
const beforeEachResult = await lifecycleManager.beforeEach(targetLocation, currentLocation);
|
|
113
|
-
let finalPath = targetPath;
|
|
114
|
-
// 如果 beforeEach 返回 false,阻止导航
|
|
115
|
-
if (beforeEachResult === false) {
|
|
116
|
-
_logger.logger.debug('路由导航被阻止: beforeEach 返回 false');
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
// 如果 beforeEach 返回字符串,重定向到该路径
|
|
120
|
-
if (typeof beforeEachResult === 'string') {
|
|
121
|
-
_logger.logger.debug(`路由导航重定向: ${beforeEachResult}`);
|
|
122
|
-
finalPath = this.buildTargetPath(beforeEachResult);
|
|
123
|
-
}
|
|
124
|
-
// 执行中间件
|
|
125
|
-
const middlewareManager = (0, _middleware.getRouterMiddlewareManager)();
|
|
126
|
-
const middlewareContext = {
|
|
127
|
-
to: {
|
|
128
|
-
...targetLocation,
|
|
129
|
-
path: finalPath
|
|
130
|
-
},
|
|
131
|
-
from: currentLocation,
|
|
132
|
-
options
|
|
133
|
-
};
|
|
134
|
-
const middlewareResult = await middlewareManager.execute(middlewareContext);
|
|
135
|
-
// 如果中间件阻止导航
|
|
136
|
-
if (!middlewareResult.allow) {
|
|
137
|
-
if (middlewareResult.redirect) {
|
|
138
|
-
_logger.logger.debug(`路由导航被中间件重定向: ${middlewareResult.redirect}`);
|
|
139
|
-
return this.navigateInternal(middlewareResult.redirect, {
|
|
140
|
-
...options,
|
|
141
|
-
query: undefined
|
|
142
|
-
}, depth + 1, visited);
|
|
143
|
-
}
|
|
144
|
-
_logger.logger.debug(`路由导航被中间件阻止: ${middlewareResult.reason || '未知原因'}`);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
// 执行导航
|
|
148
|
-
try {
|
|
149
|
-
if (options?.replace) {
|
|
150
|
-
router.navigate(finalPath, {
|
|
151
|
-
replace: true,
|
|
152
|
-
state: options.state
|
|
153
|
-
});
|
|
154
|
-
} else {
|
|
155
|
-
router.navigate(finalPath, {
|
|
156
|
-
state: options?.state
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
// 执行 afterEach 钩子
|
|
160
|
-
await lifecycleManager.afterEach({
|
|
161
|
-
...targetLocation,
|
|
162
|
-
path: finalPath
|
|
163
|
-
}, currentLocation);
|
|
164
|
-
const duration = performance.now() - startTime;
|
|
165
|
-
routerManager.getMonitoring().trackRoutePerformance(finalPath, {
|
|
166
|
-
totalTime: duration
|
|
167
|
-
});
|
|
168
|
-
} catch (error) {
|
|
169
|
-
_logger.logger.error('路由导航失败', error);
|
|
170
|
-
throw error;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* 导航到指定路径
|
|
175
|
-
*
|
|
176
|
-
* @param to - 目标路径或路由名称
|
|
177
|
-
* @param options - 导航选项
|
|
178
|
-
*/ static async navigate(to, options) {
|
|
179
|
-
return this.navigateInternal(to, options, 0, new Set());
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* 获取当前路由信息
|
|
183
|
-
*
|
|
184
|
-
* @returns 当前路由位置信息
|
|
185
|
-
*/ static getCurrentRoute() {
|
|
186
|
-
if (typeof window === 'undefined') {
|
|
187
|
-
return {
|
|
188
|
-
path: '/',
|
|
189
|
-
query: {}
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
// 从 window.location 获取当前路由信息
|
|
193
|
-
const pathname = window.location.pathname;
|
|
194
|
-
const search = window.location.search;
|
|
195
|
-
const hash = window.location.hash;
|
|
196
|
-
// 解析查询参数
|
|
197
|
-
const query = {};
|
|
198
|
-
if (search) {
|
|
199
|
-
const params = new URLSearchParams(search);
|
|
200
|
-
params.forEach((value, key)=>{
|
|
201
|
-
query[key] = value;
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
path: pathname + hash,
|
|
206
|
-
query
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 返回上一页
|
|
211
|
-
*
|
|
212
|
-
* @param fallback - 如果没有历史记录,跳转到该路径
|
|
213
|
-
*/ static async goBack(fallback) {
|
|
214
|
-
if (window.history.length > 1) {
|
|
215
|
-
window.history.back();
|
|
216
|
-
} else if (fallback) {
|
|
217
|
-
await this.navigate(fallback);
|
|
218
|
-
} else {
|
|
219
|
-
_logger.logger.warn('没有历史记录,无法返回');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* 前进到下一页
|
|
224
|
-
*/ static goForward() {
|
|
225
|
-
window.history.forward();
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* 替换当前路由
|
|
229
|
-
*
|
|
230
|
-
* @param to - 目标路径
|
|
231
|
-
* @param options - 导航选项
|
|
232
|
-
*/ static async replace(to, options) {
|
|
233
|
-
return this.navigate(to, {
|
|
234
|
-
...options,
|
|
235
|
-
replace: true
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
_define_property(RouterNavigation, "MAX_REDIRECTS", 10);
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"RouterNavigation",{enumerable:true,get:function(){return RouterNavigation}});const _logger=require("@vlian/logger");const _lifecycle=require("../lifecycle");const _middleware=require("../middleware");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}let RouterNavigation=class RouterNavigation{static buildTargetPath(to,query){const base=typeof window!=="undefined"&&window.location?.origin?window.location.origin:"http://localhost";const url=new URL(to,base);if(query&&Object.keys(query).length>0){const params=new URLSearchParams(url.search);Object.entries(query).forEach(([key,value])=>{if(value===undefined||value===null){params.delete(key);return}params.set(key,String(value))});url.search=params.toString()}return`${url.pathname}${url.search}${url.hash}`}static async navigateInternal(to,options,depth,visited){const startTime=performance.now();if(depth>this.MAX_REDIRECTS){throw new Error(`路由重定向次数超过上限(${this.MAX_REDIRECTS}),可能存在循环重定向`)}const targetPath=this.buildTargetPath(to,options?.query);if(visited.has(targetPath)){throw new Error(`检测到循环重定向: ${targetPath}`)}visited.add(targetPath);const routerManager=await Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("../RouterManager"))).then(m=>m.getRouterManager());const router=routerManager.getRouter();if(!router){throw new Error("路由未初始化,无法导航")}const currentLocation=this.getCurrentRoute();const targetLocation={path:targetPath,query:options?.query};const lifecycleManager=(0,_lifecycle.getRouterLifecycleManager)();const beforeEachResult=await lifecycleManager.beforeEach(targetLocation,currentLocation);let finalPath=targetPath;if(beforeEachResult===false){_logger.logger.debug("路由导航被阻止: beforeEach 返回 false");return}if(typeof beforeEachResult==="string"){_logger.logger.debug(`路由导航重定向: ${beforeEachResult}`);finalPath=this.buildTargetPath(beforeEachResult)}const middlewareManager=(0,_middleware.getRouterMiddlewareManager)();const middlewareContext={to:{...targetLocation,path:finalPath},from:currentLocation,options};const middlewareResult=await middlewareManager.execute(middlewareContext);if(!middlewareResult.allow){if(middlewareResult.redirect){_logger.logger.debug(`路由导航被中间件重定向: ${middlewareResult.redirect}`);return this.navigateInternal(middlewareResult.redirect,{...options,query:undefined},depth+1,visited)}_logger.logger.debug(`路由导航被中间件阻止: ${middlewareResult.reason||"未知原因"}`);return}try{if(options?.replace){router.navigate(finalPath,{replace:true,state:options.state})}else{router.navigate(finalPath,{state:options?.state})}await lifecycleManager.afterEach({...targetLocation,path:finalPath},currentLocation);const duration=performance.now()-startTime;routerManager.getMonitoring().trackRoutePerformance(finalPath,{totalTime:duration})}catch(error){_logger.logger.error("路由导航失败",error);throw error}}static async navigate(to,options){return this.navigateInternal(to,options,0,new Set)}static getCurrentRoute(){if(typeof window==="undefined"){return{path:"/",query:{}}}const pathname=window.location.pathname;const search=window.location.search;const hash=window.location.hash;const query={};if(search){const params=new URLSearchParams(search);params.forEach((value,key)=>{query[key]=value})}return{path:pathname+hash,query}}static async goBack(fallback){if(window.history.length>1){window.history.back()}else if(fallback){await this.navigate(fallback)}else{_logger.logger.warn("没有历史记录,无法返回")}}static goForward(){window.history.forward()}static async replace(to,options){return this.navigate(to,{...options,replace:true})}};_define_property(RouterNavigation,"MAX_REDIRECTS",10);
|
|
@@ -1,20 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 路由导航模块入口
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
_export_star(require("./RouterNavigation"), exports);
|
|
8
|
-
function _export_star(from, to) {
|
|
9
|
-
Object.keys(from).forEach(function(k) {
|
|
10
|
-
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
11
|
-
Object.defineProperty(to, k, {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: function() {
|
|
14
|
-
return from[k];
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
return from;
|
|
20
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./RouterNavigation"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
|