@vlian/framework 1.2.19 → 1.2.37
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 +208 -2395
- package/dist/analytics.umd.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +1 -1
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/index.cjs +0 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/initialization/index.cjs.map +1 -1
- package/dist/core/initialization/index.d.ts +1 -1
- package/dist/core/initialization/index.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +2 -147
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +0 -57
- package/dist/core/initialization/initialization.js +2 -148
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/kernel/startKernel.cjs +1 -2
- package/dist/core/kernel/startKernel.cjs.map +1 -1
- package/dist/core/kernel/startKernel.js +1 -2
- package/dist/core/kernel/startKernel.js.map +1 -1
- package/dist/core/plugin.cjs +16 -16
- package/dist/core/plugin.cjs.map +1 -1
- package/dist/core/plugin.d.ts +5 -1
- package/dist/core/plugin.js +17 -17
- package/dist/core/plugin.js.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +13 -8
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +13 -8
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +4 -0
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +4 -0
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +1 -1
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +1 -1
- package/dist/core/startup/initializeServices.js +1 -1
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/performanceTracker.cjs.map +1 -1
- package/dist/core/startup/performanceTracker.d.ts +1 -1
- package/dist/core/startup/performanceTracker.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +1 -1
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +1 -1
- package/dist/core/startup/renderApp.js +1 -1
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +2 -4
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +3 -5
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +2 -6
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +15 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +11758 -32895
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +67 -0
- package/dist/kernel/constants.cjs.map +1 -0
- package/dist/kernel/constants.d.ts +5 -0
- package/dist/kernel/constants.js +43 -0
- package/dist/kernel/constants.js.map +1 -0
- package/dist/kernel/index.cjs +40 -0
- package/dist/kernel/index.cjs.map +1 -0
- package/dist/kernel/index.d.ts +3 -0
- package/dist/kernel/index.js +4 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/kernel.cjs +296 -0
- package/dist/kernel/kernel.cjs.map +1 -0
- package/dist/kernel/kernel.d.ts +40 -0
- package/dist/kernel/kernel.js +272 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/kernel/manager/cacheManager.cjs +46 -0
- package/dist/kernel/manager/cacheManager.cjs.map +1 -0
- package/dist/kernel/manager/cacheManager.d.ts +6 -0
- package/dist/kernel/manager/cacheManager.js +36 -0
- package/dist/kernel/manager/cacheManager.js.map +1 -0
- package/dist/kernel/manager/i18nManager.cjs +68 -0
- package/dist/kernel/manager/i18nManager.cjs.map +1 -0
- package/dist/kernel/manager/i18nManager.d.ts +8 -0
- package/dist/kernel/manager/i18nManager.js +58 -0
- package/dist/kernel/manager/i18nManager.js.map +1 -0
- package/dist/kernel/manager/index.cjs +30 -0
- package/dist/kernel/manager/index.cjs.map +1 -0
- package/dist/kernel/manager/index.d.ts +4 -0
- package/dist/kernel/manager/index.js +6 -0
- package/dist/kernel/manager/index.js.map +1 -0
- package/dist/kernel/manager/loggerManager.cjs +70 -0
- package/dist/kernel/manager/loggerManager.cjs.map +1 -0
- package/dist/kernel/manager/loggerManager.d.ts +14 -0
- package/dist/kernel/manager/loggerManager.js +60 -0
- package/dist/kernel/manager/loggerManager.js.map +1 -0
- package/dist/kernel/manager/persistence.cjs +93 -0
- package/dist/kernel/manager/persistence.cjs.map +1 -0
- package/dist/kernel/manager/persistence.d.ts +3 -0
- package/dist/kernel/manager/persistence.js +75 -0
- package/dist/kernel/manager/persistence.js.map +1 -0
- package/dist/kernel/manager/themeManager.cjs +85 -0
- package/dist/kernel/manager/themeManager.cjs.map +1 -0
- package/dist/kernel/manager/themeManager.d.ts +9 -0
- package/dist/kernel/manager/themeManager.js +75 -0
- package/dist/kernel/manager/themeManager.js.map +1 -0
- package/dist/kernel/types.cjs.map +1 -0
- package/dist/kernel/types.d.ts +72 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/library/storage/index.cjs +1 -1
- package/dist/library/storage/index.cjs.map +1 -1
- package/dist/library/storage/index.d.ts +1 -0
- package/dist/library/storage/index.js +1 -1
- package/dist/library/storage/index.js.map +1 -1
- package/dist/request/adapter.d.ts +1 -0
- package/dist/request/core.d.ts +1 -0
- package/dist/request/index.d.ts +1 -42
- package/dist/request/plugin/csrfPlugin.d.ts +2 -2
- package/dist/request/plugin/queue.d.ts +2 -2
- package/dist/request/plugin.d.ts +1 -0
- package/dist/request/runtime.d.ts +1 -0
- package/dist/request/types.d.ts +1 -394
- package/dist/request/utils.d.ts +1 -0
- package/dist/state.umd.js +1 -1
- package/dist/utils/csrf.cjs +13 -152
- package/dist/utils/csrf.cjs.map +1 -1
- package/dist/utils/csrf.d.ts +1 -72
- package/dist/utils/csrf.js +1 -142
- package/dist/utils/csrf.js.map +1 -1
- package/dist/utils/errors/ErrorCodes.cjs +6 -76
- package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
- package/dist/utils/errors/ErrorCodes.d.ts +1 -45
- package/dist/utils/errors/ErrorCodes.js +1 -84
- package/dist/utils/errors/ErrorCodes.js.map +1 -1
- package/dist/utils/errors.cjs +15 -344
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +1 -183
- package/dist/utils/errors.js +1 -352
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.cjs +5 -374
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.d.ts +2 -189
- package/dist/utils/logger.js +1 -379
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/logger.types.cjs +3 -12
- package/dist/utils/logger.types.cjs.map +1 -1
- package/dist/utils/logger.types.d.ts +2 -57
- package/dist/utils/logger.types.js +1 -10
- package/dist/utils/logger.types.js.map +1 -1
- package/dist/utils/monitoring.cjs +11 -302
- package/dist/utils/monitoring.cjs.map +1 -1
- package/dist/utils/monitoring.d.ts +1 -163
- package/dist/utils/monitoring.js +1 -294
- package/dist/utils/monitoring.js.map +1 -1
- package/dist/utils/performance.cjs +5 -352
- package/dist/utils/performance.cjs.map +1 -1
- package/dist/utils/performance.d.ts +2 -246
- package/dist/utils/performance.js +1 -354
- package/dist/utils/performance.js.map +1 -1
- package/dist/utils/resourceLoader.cjs +5 -303
- package/dist/utils/resourceLoader.cjs.map +1 -1
- package/dist/utils/resourceLoader.d.ts +2 -130
- package/dist/utils/resourceLoader.js +1 -305
- package/dist/utils/resourceLoader.js.map +1 -1
- package/dist/utils/runtimeSecurity.cjs +2 -140
- package/dist/utils/runtimeSecurity.cjs.map +1 -1
- package/dist/utils/runtimeSecurity.d.ts +2 -104
- package/dist/utils/runtimeSecurity.js +1 -141
- package/dist/utils/runtimeSecurity.js.map +1 -1
- package/dist/utils/security.cjs +3 -314
- package/dist/utils/security.cjs.map +1 -1
- package/dist/utils/security.d.ts +2 -80
- package/dist/utils/security.js +1 -311
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/traceId.cjs +10 -111
- package/dist/utils/traceId.cjs.map +1 -1
- package/dist/utils/traceId.d.ts +1 -63
- package/dist/utils/traceId.js +1 -116
- package/dist/utils/traceId.js.map +1 -1
- package/dist/utils/validation.cjs +3 -173
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.ts +2 -110
- package/dist/utils/validation.js +1 -175
- package/dist/utils/validation.js.map +1 -1
- package/package.json +98 -13
- package/dist/core/ui-adapter/adapters.cjs +0 -45
- package/dist/core/ui-adapter/adapters.cjs.map +0 -1
- package/dist/core/ui-adapter/adapters.d.ts +0 -4
- package/dist/core/ui-adapter/adapters.js +0 -27
- package/dist/core/ui-adapter/adapters.js.map +0 -1
- package/dist/core/ui-adapter/index.cjs +0 -21
- package/dist/core/ui-adapter/index.cjs.map +0 -1
- package/dist/core/ui-adapter/index.d.ts +0 -2
- package/dist/core/ui-adapter/index.js +0 -3
- package/dist/core/ui-adapter/index.js.map +0 -1
- package/dist/core/ui-adapter/types.cjs.map +0 -1
- package/dist/core/ui-adapter/types.d.ts +0 -24
- package/dist/core/ui-adapter/types.js.map +0 -1
- package/dist/request/adapter/RequestAdapter.cjs +0 -78
- package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
- package/dist/request/adapter/axiosAdapter.cjs +0 -164
- package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
- package/dist/request/adapter/fetchAdapter.cjs +0 -134
- package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
- package/dist/request/adapter/index.cjs +0 -80
- package/dist/request/adapter/index.cjs.map +0 -1
- package/dist/request/adapter/kyAdapter.cjs +0 -191
- package/dist/request/adapter/kyAdapter.cjs.map +0 -1
- package/dist/request/adapter/undiciAdapter.cjs +0 -213
- package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
- package/dist/request/core/RequestClient.cjs +0 -558
- package/dist/request/core/RequestClient.cjs.map +0 -1
- package/dist/request/core/index.cjs +0 -15
- package/dist/request/core/index.cjs.map +0 -1
- package/dist/request/index.cjs +0 -149
- package/dist/request/index.cjs.map +0 -1
- package/dist/request/plugin/RequestPlugin.cjs +0 -218
- package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
- package/dist/request/plugin/cache.cjs +0 -269
- package/dist/request/plugin/cache.cjs.map +0 -1
- package/dist/request/plugin/csrfPlugin.cjs +0 -40
- package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
- package/dist/request/plugin/index.cjs +0 -53
- package/dist/request/plugin/index.cjs.map +0 -1
- package/dist/request/plugin/monitoring.cjs +0 -216
- package/dist/request/plugin/monitoring.cjs.map +0 -1
- package/dist/request/plugin/queue.cjs +0 -140
- package/dist/request/plugin/queue.cjs.map +0 -1
- package/dist/request/plugin/retry.cjs +0 -98
- package/dist/request/plugin/retry.cjs.map +0 -1
- package/dist/request/plugin/validation.cjs +0 -121
- package/dist/request/plugin/validation.cjs.map +0 -1
- package/dist/request/runtime/RequestContext.cjs +0 -77
- package/dist/request/runtime/RequestContext.cjs.map +0 -1
- package/dist/request/runtime/index.cjs +0 -32
- package/dist/request/runtime/index.cjs.map +0 -1
- package/dist/request/types.cjs +0 -112
- package/dist/request/types.cjs.map +0 -1
- package/dist/request/utils/RequestQueueManager.cjs +0 -168
- package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
- package/dist/request/utils/dependencyCheck.cjs +0 -237
- package/dist/request/utils/dependencyCheck.cjs.map +0 -1
- package/dist/request/utils/index.cjs +0 -30
- package/dist/request/utils/index.cjs.map +0 -1
- package/dist/request.umd.js +0 -5392
- package/dist/request.umd.js.map +0 -1
- /package/dist/{core/ui-adapter → kernel}/types.cjs +0 -0
- /package/dist/{core/ui-adapter → kernel}/types.js +0 -0
|
@@ -1,71 +1,6 @@
|
|
|
1
1
|
import { logger, LogLevel } from "../../utils";
|
|
2
2
|
import { setupI18n } from "../../library";
|
|
3
|
-
import { storage } from "../../library";
|
|
4
|
-
import { NetworkError } from "../../utils/errors";
|
|
5
|
-
import { ConfigSecurity } from "../../utils/configSecurity";
|
|
6
3
|
import { pluginManager } from "../plugin";
|
|
7
|
-
/**
|
|
8
|
-
* 配置缓存键
|
|
9
|
-
*/ const CONFIG_CACHE_KEY = '__framework_config_cache__';
|
|
10
|
-
/**
|
|
11
|
-
* 加载配置(带超时、重试和缓存)
|
|
12
|
-
*/ async function loadConfigWithRetry(loadConfig, strategy, fallbackConfig) {
|
|
13
|
-
const timeout = strategy.configTimeout ?? 5000;
|
|
14
|
-
const retryCount = strategy.retryCount ?? 3;
|
|
15
|
-
const retryDelay = strategy.retryDelay ?? 1000;
|
|
16
|
-
const enableCache = strategy.enableCache ?? true;
|
|
17
|
-
const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟
|
|
18
|
-
const configVersion = strategy.configVersion;
|
|
19
|
-
// 检查缓存
|
|
20
|
-
if (enableCache && storage.localCache) {
|
|
21
|
-
try {
|
|
22
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
23
|
-
const cached = await storage.localCache.get(cacheKey);
|
|
24
|
-
if (cached && (!configVersion || cached.version === configVersion)) {
|
|
25
|
-
logger.debug('使用缓存的配置');
|
|
26
|
-
return cached.data;
|
|
27
|
-
}
|
|
28
|
-
} catch (error) {
|
|
29
|
-
logger.warn('读取配置缓存失败:', error);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// 重试加载配置
|
|
33
|
-
let lastError = null;
|
|
34
|
-
for(let attempt = 0; attempt <= retryCount; attempt++){
|
|
35
|
-
try {
|
|
36
|
-
if (attempt > 0) {
|
|
37
|
-
logger.debug(`配置加载重试 ${attempt}/${retryCount}`);
|
|
38
|
-
// 指数退避
|
|
39
|
-
await new Promise((resolve)=>setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));
|
|
40
|
-
}
|
|
41
|
-
const configPromise = loadConfig();
|
|
42
|
-
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new NetworkError('配置加载超时')), timeout));
|
|
43
|
-
const config = await Promise.race([
|
|
44
|
-
configPromise,
|
|
45
|
-
timeoutPromise
|
|
46
|
-
]);
|
|
47
|
-
// 保存到缓存
|
|
48
|
-
if (enableCache && storage.localCache) {
|
|
49
|
-
try {
|
|
50
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
51
|
-
await storage.localCache.set(cacheKey, {
|
|
52
|
-
data: config,
|
|
53
|
-
version: configVersion
|
|
54
|
-
}, cacheTTL);
|
|
55
|
-
} catch (error) {
|
|
56
|
-
logger.warn('保存配置缓存失败:', error);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return config;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
62
|
-
logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// 所有重试都失败,使用降级配置
|
|
66
|
-
logger.warn('配置加载失败,使用降级配置:', lastError);
|
|
67
|
-
return fallbackConfig || {};
|
|
68
|
-
}
|
|
69
4
|
/**
|
|
70
5
|
* 初始化方法
|
|
71
6
|
*
|
|
@@ -97,89 +32,8 @@ import { pluginManager } from "../plugin";
|
|
|
97
32
|
// 1. 设置日志级别
|
|
98
33
|
onProgress?.(5, '初始化日志系统...');
|
|
99
34
|
logger.setLevel(options.loggerLevel ?? LogLevel.INFO);
|
|
100
|
-
// 2.
|
|
101
|
-
|
|
102
|
-
onProgress?.(10, '加载关键配置...');
|
|
103
|
-
try {
|
|
104
|
-
config = await loadConfigWithRetry(options.configStrategy.loadCriticalConfig, options.configStrategy, options.configStrategy.fallbackConfig);
|
|
105
|
-
// 验证配置安全性
|
|
106
|
-
if (options.configSecurity) {
|
|
107
|
-
const securityResult = await ConfigSecurity.validateConfigSecurity(config, options.configSecurity);
|
|
108
|
-
if (!securityResult.valid) {
|
|
109
|
-
logger.warn('配置安全验证失败:', securityResult.errors);
|
|
110
|
-
// 根据安全策略决定是否继续
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
114
|
-
onProgress?.(30, '关键配置加载完成');
|
|
115
|
-
} catch (error) {
|
|
116
|
-
logger.warn('关键配置加载失败,使用默认配置:', error);
|
|
117
|
-
config = options.configStrategy.fallbackConfig || {};
|
|
118
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
119
|
-
onProgress?.(30, '使用默认配置');
|
|
120
|
-
}
|
|
121
|
-
} else {
|
|
122
|
-
onProgress?.(30);
|
|
123
|
-
}
|
|
124
|
-
// 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)
|
|
125
|
-
if (options.configStrategy?.loadNonCriticalConfig) {
|
|
126
|
-
// 智能延迟加载:根据网络状况动态调整延迟时间
|
|
127
|
-
const getDelayTime = ()=>{
|
|
128
|
-
if (typeof navigator === 'undefined' || !('connection' in navigator)) {
|
|
129
|
-
return 1000; // 默认延迟
|
|
130
|
-
}
|
|
131
|
-
const connection = navigator.connection;
|
|
132
|
-
if (!connection) {
|
|
133
|
-
return 1000;
|
|
134
|
-
}
|
|
135
|
-
// 根据网络类型调整延迟
|
|
136
|
-
const effectiveType = connection.effectiveType;
|
|
137
|
-
switch(effectiveType){
|
|
138
|
-
case 'slow-2g':
|
|
139
|
-
case '2g':
|
|
140
|
-
return 3000; // 慢网络延迟更久
|
|
141
|
-
case '3g':
|
|
142
|
-
return 2000;
|
|
143
|
-
case '4g':
|
|
144
|
-
default:
|
|
145
|
-
return 500; // 快网络可以更快加载
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
// 使用 requestIdleCallback 在空闲时加载
|
|
149
|
-
if (typeof requestIdleCallback !== 'undefined') {
|
|
150
|
-
requestIdleCallback(async ()=>{
|
|
151
|
-
try {
|
|
152
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
153
|
-
// 合并到主配置
|
|
154
|
-
config = {
|
|
155
|
-
...config,
|
|
156
|
-
...nonCriticalConfig
|
|
157
|
-
};
|
|
158
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
159
|
-
logger.debug('非关键配置加载完成');
|
|
160
|
-
} catch (error) {
|
|
161
|
-
logger.warn('非关键配置加载失败:', error);
|
|
162
|
-
}
|
|
163
|
-
}, {
|
|
164
|
-
timeout: getDelayTime()
|
|
165
|
-
});
|
|
166
|
-
} else {
|
|
167
|
-
// 降级方案:智能延迟加载
|
|
168
|
-
setTimeout(async ()=>{
|
|
169
|
-
try {
|
|
170
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
171
|
-
config = {
|
|
172
|
-
...config,
|
|
173
|
-
...nonCriticalConfig
|
|
174
|
-
};
|
|
175
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
176
|
-
logger.debug('非关键配置加载完成');
|
|
177
|
-
} catch (error) {
|
|
178
|
-
logger.warn('非关键配置加载失败:', error);
|
|
179
|
-
}
|
|
180
|
-
}, getDelayTime());
|
|
181
|
-
}
|
|
182
|
-
}
|
|
35
|
+
// 2. 预留配置阶段
|
|
36
|
+
onProgress?.(30);
|
|
183
37
|
// 3. 初始化之前回调
|
|
184
38
|
if (options.lifecycle?.beforeInitialization) {
|
|
185
39
|
onProgress?.(35, '执行初始化前回调...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport { storage } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { NetworkError } from '../../utils/errors';\nimport { ConfigSecurity } from '../../utils/configSecurity';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 配置加载策略\n */\nexport interface ConfigStrategy {\n /**\n * 加载关键配置\n * 这些配置必须在应用渲染前加载完成\n */\n loadCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 加载非关键配置\n * 这些配置可以在应用渲染后异步加载\n */\n loadNonCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 配置降级方案\n * 当配置加载失败时使用的默认配置\n */\n fallbackConfig?: Record<string, unknown>;\n\n /**\n * 配置超时时间(毫秒)\n * 默认 5000ms,超时后使用降级配置\n */\n configTimeout?: number;\n\n /**\n * 配置版本号(用于缓存失效)\n */\n configVersion?: string;\n\n /**\n * 配置加载完成回调\n */\n onConfigLoaded?: (config: Record<string, unknown>) => void;\n\n /**\n * 是否启用缓存\n * @default true\n */\n enableCache?: boolean;\n\n /**\n * 缓存过期时间(毫秒)\n * @default 5 * 60 * 1000 (5分钟)\n */\n cacheTTL?: number;\n\n /**\n * 重试次数\n * @default 3\n */\n retryCount?: number;\n\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n\n /**\n * 配置加载策略\n */\n configStrategy?: ConfigStrategy;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 配置缓存键\n */\nconst CONFIG_CACHE_KEY = '__framework_config_cache__';\n\n/**\n * 加载配置(带超时、重试和缓存)\n */\nasync function loadConfigWithRetry(\n loadConfig: () => Promise<Record<string, unknown>>,\n strategy: ConfigStrategy,\n fallbackConfig?: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const timeout = strategy.configTimeout ?? 5000;\n const retryCount = strategy.retryCount ?? 3;\n const retryDelay = strategy.retryDelay ?? 1000;\n const enableCache = strategy.enableCache ?? true;\n const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟\n const configVersion = strategy.configVersion;\n\n // 检查缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n const cached = await storage.localCache.get<{ data: Record<string, unknown>; version?: string }>(cacheKey);\n if (cached && (!configVersion || cached.version === configVersion)) {\n logger.debug('使用缓存的配置');\n return cached.data;\n }\n } catch (error) {\n logger.warn('读取配置缓存失败:', error);\n }\n }\n\n // 重试加载配置\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n try {\n if (attempt > 0) {\n logger.debug(`配置加载重试 ${attempt}/${retryCount}`);\n // 指数退避\n await new Promise((resolve) => setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));\n }\n\n const configPromise = loadConfig();\n const timeoutPromise = new Promise<Record<string, unknown>>((_, reject) =>\n setTimeout(() => reject(new NetworkError('配置加载超时')), timeout)\n );\n\n const config = await Promise.race([configPromise, timeoutPromise]);\n\n // 保存到缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n await storage.localCache.set(cacheKey, { data: config, version: configVersion }, cacheTTL);\n } catch (error) {\n logger.warn('保存配置缓存失败:', error);\n }\n }\n\n return config;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);\n }\n }\n\n // 所有重试都失败,使用降级配置\n logger.warn('配置加载失败,使用降级配置:', lastError);\n return fallbackConfig || {};\n}\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 加载关键配置\n if (options.configStrategy?.loadCriticalConfig) {\n onProgress?.(10, '加载关键配置...');\n try {\n config = await loadConfigWithRetry(\n options.configStrategy.loadCriticalConfig,\n options.configStrategy,\n options.configStrategy.fallbackConfig\n );\n\n // 验证配置安全性\n if (options.configSecurity) {\n const securityResult = await ConfigSecurity.validateConfigSecurity(\n config,\n options.configSecurity\n );\n if (!securityResult.valid) {\n logger.warn('配置安全验证失败:', securityResult.errors);\n // 根据安全策略决定是否继续\n }\n }\n\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '关键配置加载完成');\n } catch (error) {\n logger.warn('关键配置加载失败,使用默认配置:', error);\n config = options.configStrategy.fallbackConfig || {};\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '使用默认配置');\n }\n } else {\n onProgress?.(30);\n }\n\n // 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)\n if (options.configStrategy?.loadNonCriticalConfig) {\n // 智能延迟加载:根据网络状况动态调整延迟时间\n const getDelayTime = (): number => {\n if (typeof navigator === 'undefined' || !('connection' in navigator)) {\n return 1000; // 默认延迟\n }\n\n const connection = (navigator as any).connection;\n if (!connection) {\n return 1000;\n }\n\n // 根据网络类型调整延迟\n const effectiveType = connection.effectiveType;\n switch (effectiveType) {\n case 'slow-2g':\n case '2g':\n return 3000; // 慢网络延迟更久\n case '3g':\n return 2000;\n case '4g':\n default:\n return 500; // 快网络可以更快加载\n }\n };\n\n // 使用 requestIdleCallback 在空闲时加载\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(\n async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n // 合并到主配置\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n },\n { timeout: getDelayTime() }\n );\n } else {\n // 降级方案:智能延迟加载\n setTimeout(async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n }, getDelayTime());\n }\n }\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["logger","LogLevel","setupI18n","storage","NetworkError","ConfigSecurity","pluginManager","CONFIG_CACHE_KEY","loadConfigWithRetry","loadConfig","strategy","fallbackConfig","timeout","configTimeout","retryCount","retryDelay","enableCache","cacheTTL","configVersion","localCache","cacheKey","cached","get","version","debug","data","error","warn","lastError","attempt","Promise","resolve","setTimeout","Math","pow","configPromise","timeoutPromise","_","reject","config","race","set","Error","String","initialization","options","onProgress","startTime","Date","now","executeBeforeInit","setLevel","loggerLevel","INFO","configStrategy","loadCriticalConfig","configSecurity","securityResult","validateConfigSecurity","valid","errors","onConfigLoaded","loadNonCriticalConfig","getDelayTime","navigator","connection","effectiveType","requestIdleCallback","nonCriticalConfig","lifecycle","beforeInitialization","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 预留配置阶段\n onProgress?.(30);\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["logger","LogLevel","setupI18n","pluginManager","initialization","options","onProgress","startTime","Date","now","config","executeBeforeInit","setLevel","loggerLevel","INFO","lifecycle","beforeInitialization","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization","error"],"mappings":"AAAA,SAASA,MAAM,EAAEC,QAAQ,QAAQ,cAAc;AAC/C,SAASC,SAAS,QAAQ,gBAAgB;AAG1C,SAASC,aAAa,QAAQ,YAAY;AAoD1C;;;;;;;;;;;;;;;;;;;;;;CAsBC,GACD,OAAO,eAAeC,eACpBC,OAAqB,EACrBC,UAA6B;IAE7B,MAAMC,YAAYC,KAAKC,GAAG;IAC1B,IAAIC,SAAkC,CAAC;IAEvC,IAAI;QACF,gBAAgB;QAChB,MAAMP,cAAcQ,iBAAiB,CAACN;QAEtC,YAAY;QACZC,aAAa,GAAG;QAChBN,OAAOY,QAAQ,CAACP,QAAQQ,WAAW,IAAIZ,SAASa,IAAI;QAEpD,YAAY;QACZR,aAAa;QAEb,aAAa;QACb,IAAID,QAAQU,SAAS,EAAEC,sBAAsB;YAC3CV,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACC,oBAAoB;QAC9C;QAEA,WAAW;QACXV,aAAa,IAAI;QACjBJ,UAAUG,QAAQY,MAAM,IAAIC;QAE5B,WAAW;QACX,IAAIb,QAAQU,SAAS,EAAEX,gBAAgB;YACrCE,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACX,cAAc;YACtCE,aAAa,IAAI;QACnB,OAAO;YACLA,aAAa;QACf;QAEAA,aAAa,IAAI;QAEjB,MAAMa,WAAWX,KAAKC,GAAG,KAAKF;QAE9B,MAAMa,UAAiC;YACrCV;YACAW,UAAU;YACVC,SAAS;YACTH;QACF;QAEA,YAAY;QACZ,MAAMhB,cAAcoB,WAAW,CAAClB,SAASe;QAEzC,aAAa;QACb,MAAMjB,cAAcqB,gBAAgB,CAACnB,SAASe;QAE9C,4CAA4C;QAC5C,IAAIf,QAAQU,SAAS,EAAEU,qBAAqB;YAC1CnB,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACU,mBAAmB,CAACL;QAC9C;QAEAd,aAAa,KAAK;QAElB,OAAOc;IACT,EAAE,OAAOM,OAAO;QACd1B,OAAO0B,KAAK,CAAC,UAAUA;QACvB,MAAMA;IACR;AACF"}
|
|
@@ -124,8 +124,7 @@ async function startKernel(options = {}) {
|
|
|
124
124
|
const initContext = await (0, _initialization.initialization)({
|
|
125
125
|
loggerLevel: options.loggerLevel,
|
|
126
126
|
locale: i18n.resources,
|
|
127
|
-
lifecycle: options.lifecycle
|
|
128
|
-
configStrategy: undefined
|
|
127
|
+
lifecycle: options.lifecycle
|
|
129
128
|
});
|
|
130
129
|
await options.lifecycle?.afterInitialization?.(initContext);
|
|
131
130
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/kernel/startKernel.ts"],"sourcesContent":["import { initialization } from '../initialization';\nimport { generateTraceId, initTraceIdGenerator, setCurrentTraceId } from '../../utils/traceId';\nimport { toKernelBootError } from './errors';\nimport { resolveKernelAdapters } from './defaultAdapters';\nimport type {\n I18nSnapshot,\n KernelBootPhase,\n KernelPhaseMetric,\n KernelRuntime,\n KernelStartOptions,\n ThemeMode,\n ThemeSnapshot,\n} from './types';\n\nconst DEFAULT_THEME: ThemeSnapshot = { mode: 'light' };\nconst DEFAULT_I18N: I18nSnapshot = { locale: 'zh-CN' };\n\nasync function withOptionalTimeout<T>(\n task: () => Promise<T>,\n timeoutMs?: number,\n timeoutMessage = 'Kernel phase timeout'\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) {\n return task();\n }\n\n return Promise.race([\n task(),\n new Promise<T>((_, reject) => {\n setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);\n }),\n ]);\n}\n\nexport async function startKernel(options: KernelStartOptions = {}): Promise<KernelRuntime> {\n initTraceIdGenerator('kernel');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n const adapters = resolveKernelAdapters(options);\n const metrics: KernelPhaseMetric[] = [];\n let config: Record<string, unknown> = {};\n let theme: ThemeSnapshot = { ...DEFAULT_THEME, ...(options.theme || {}) };\n let i18n: I18nSnapshot = { ...DEFAULT_I18N, ...(options.locale || {}) };\n\n const emitPhaseMetric = (metric: KernelPhaseMetric): void => {\n metrics.push(metric);\n adapters.monitoring.reportPhase?.(metric);\n adapters.monitoring.reportMetric?.('kernel.phase.duration', metric.duration, {\n phase: metric.phase,\n });\n adapters.eventBus.emit('kernel.phase.end', metric);\n };\n\n const runPhase = async (phase: KernelBootPhase, fn: () => Promise<void>): Promise<void> => {\n const enabled = options.enabledPhases?.[phase];\n if (enabled === false) {\n adapters.eventBus.emit('kernel.phase.skipped', { phase, traceId });\n return;\n }\n\n const startTime = performance.now();\n adapters.eventBus.emit('kernel.phase.start', { phase, traceId, startTime });\n\n try {\n await withOptionalTimeout(\n fn,\n options.performance?.phaseTimeoutMs?.[phase],\n `Kernel phase \"${phase}\" timeout`\n );\n emitPhaseMetric({\n phase,\n startTime,\n endTime: performance.now(),\n duration: performance.now() - startTime,\n });\n } catch (error) {\n const bootError = toKernelBootError(error, phase, traceId);\n adapters.monitoring.captureError(bootError, { phase, traceId });\n adapters.eventBus.emit('kernel.phase.error', bootError);\n\n const result = await adapters.errorHandler.handle(bootError);\n if (result.shouldThrow) {\n throw bootError;\n }\n }\n };\n\n await runPhase('prepare', async () => {\n adapters.logger.initialize?.(options);\n adapters.logger.info('Kernel 启动准备完成', { traceId });\n });\n\n await runPhase('services', async () => {\n await Promise.all([\n Promise.resolve(adapters.monitoring.initialize?.(options)),\n Promise.resolve(adapters.state.initialize?.(options)),\n Promise.resolve(adapters.eventBus.initialize?.(options)),\n ]);\n });\n\n await runPhase('config', async () => {\n if (options.configLoader) {\n try {\n config = await options.configLoader();\n } catch (error) {\n config = options.configFallback || {};\n }\n } else {\n config = options.configFallback || {};\n }\n });\n\n await runPhase('i18n', async () => {\n await adapters.i18n.initialize(i18n);\n });\n\n await runPhase('theme', async () => {\n await Promise.resolve(adapters.theme.initialize?.(theme));\n await adapters.theme.apply(theme);\n });\n\n await runPhase('init', async () => {\n await options.lifecycle?.beforeInitialization?.();\n const initContext = await initialization({\n loggerLevel: options.loggerLevel,\n locale: i18n.resources as any,\n lifecycle: options.lifecycle,\n configStrategy: undefined,\n });\n await options.lifecycle?.afterInitialization?.(initContext);\n });\n\n await runPhase('ready', async () => {\n adapters.eventBus.emit('kernel.ready', {\n traceId,\n theme,\n locale: i18n.locale,\n config,\n });\n });\n\n if (options.enablePostReady !== false) {\n await runPhase('postReady', async () => {\n adapters.eventBus.emit('kernel.postReady', { traceId });\n });\n }\n\n const setTheme = async (partial: Partial<ThemeSnapshot>): Promise<void> => {\n theme = { ...theme, ...partial };\n await adapters.theme.apply(theme);\n adapters.eventBus.emit('kernel.theme.changed', { traceId, theme });\n };\n\n const setThemeMode = async (mode: ThemeMode): Promise<void> => {\n await setTheme({ mode });\n };\n\n const setLocale = async (locale: I18nSnapshot['locale']): Promise<void> => {\n i18n = { ...i18n, locale };\n await adapters.i18n.setLocale(locale);\n adapters.eventBus.emit('kernel.i18n.changed', { traceId, locale });\n };\n\n return {\n traceId,\n getTheme: () => ({ ...theme }),\n setTheme,\n setThemeMode,\n getI18n: () => ({ ...i18n }),\n setLocale,\n getConfig: () => ({ ...config }),\n getStateManager: () => adapters.state.getInstance(),\n getEventBus: () => adapters.eventBus,\n getMetrics: () => [...metrics],\n destroy: () => {\n adapters.state.destroy?.();\n adapters.eventBus.destroy?.();\n adapters.eventBus.emit('kernel.destroyed', { traceId });\n },\n };\n}\n"],"names":["startKernel","DEFAULT_THEME","mode","DEFAULT_I18N","locale","withOptionalTimeout","task","timeoutMs","timeoutMessage","Promise","race","_","reject","setTimeout","Error","options","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","adapters","resolveKernelAdapters","metrics","config","theme","i18n","emitPhaseMetric","metric","push","monitoring","reportPhase","reportMetric","duration","phase","eventBus","emit","runPhase","fn","enabled","enabledPhases","startTime","performance","now","phaseTimeoutMs","endTime","error","bootError","toKernelBootError","captureError","result","errorHandler","handle","shouldThrow","logger","initialize","info","all","resolve","state","configLoader","configFallback","apply","lifecycle","beforeInitialization","initContext","initialization","loggerLevel","resources","configStrategy","undefined","afterInitialization","enablePostReady","setTheme","partial","setThemeMode","setLocale","getTheme","getI18n","getConfig","getStateManager","getInstance","getEventBus","getMetrics","destroy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/kernel/startKernel.ts"],"sourcesContent":["import { initialization } from '../initialization';\nimport { generateTraceId, initTraceIdGenerator, setCurrentTraceId } from '../../utils/traceId';\nimport { toKernelBootError } from './errors';\nimport { resolveKernelAdapters } from './defaultAdapters';\nimport type {\n I18nSnapshot,\n KernelBootPhase,\n KernelPhaseMetric,\n KernelRuntime,\n KernelStartOptions,\n ThemeMode,\n ThemeSnapshot,\n} from './types';\n\nconst DEFAULT_THEME: ThemeSnapshot = { mode: 'light' };\nconst DEFAULT_I18N: I18nSnapshot = { locale: 'zh-CN' };\n\nasync function withOptionalTimeout<T>(\n task: () => Promise<T>,\n timeoutMs?: number,\n timeoutMessage = 'Kernel phase timeout'\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) {\n return task();\n }\n\n return Promise.race([\n task(),\n new Promise<T>((_, reject) => {\n setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);\n }),\n ]);\n}\n\nexport async function startKernel(options: KernelStartOptions = {}): Promise<KernelRuntime> {\n initTraceIdGenerator('kernel');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n const adapters = resolveKernelAdapters(options);\n const metrics: KernelPhaseMetric[] = [];\n let config: Record<string, unknown> = {};\n let theme: ThemeSnapshot = { ...DEFAULT_THEME, ...(options.theme || {}) };\n let i18n: I18nSnapshot = { ...DEFAULT_I18N, ...(options.locale || {}) };\n\n const emitPhaseMetric = (metric: KernelPhaseMetric): void => {\n metrics.push(metric);\n adapters.monitoring.reportPhase?.(metric);\n adapters.monitoring.reportMetric?.('kernel.phase.duration', metric.duration, {\n phase: metric.phase,\n });\n adapters.eventBus.emit('kernel.phase.end', metric);\n };\n\n const runPhase = async (phase: KernelBootPhase, fn: () => Promise<void>): Promise<void> => {\n const enabled = options.enabledPhases?.[phase];\n if (enabled === false) {\n adapters.eventBus.emit('kernel.phase.skipped', { phase, traceId });\n return;\n }\n\n const startTime = performance.now();\n adapters.eventBus.emit('kernel.phase.start', { phase, traceId, startTime });\n\n try {\n await withOptionalTimeout(\n fn,\n options.performance?.phaseTimeoutMs?.[phase],\n `Kernel phase \"${phase}\" timeout`\n );\n emitPhaseMetric({\n phase,\n startTime,\n endTime: performance.now(),\n duration: performance.now() - startTime,\n });\n } catch (error) {\n const bootError = toKernelBootError(error, phase, traceId);\n adapters.monitoring.captureError(bootError, { phase, traceId });\n adapters.eventBus.emit('kernel.phase.error', bootError);\n\n const result = await adapters.errorHandler.handle(bootError);\n if (result.shouldThrow) {\n throw bootError;\n }\n }\n };\n\n await runPhase('prepare', async () => {\n adapters.logger.initialize?.(options);\n adapters.logger.info('Kernel 启动准备完成', { traceId });\n });\n\n await runPhase('services', async () => {\n await Promise.all([\n Promise.resolve(adapters.monitoring.initialize?.(options)),\n Promise.resolve(adapters.state.initialize?.(options)),\n Promise.resolve(adapters.eventBus.initialize?.(options)),\n ]);\n });\n\n await runPhase('config', async () => {\n if (options.configLoader) {\n try {\n config = await options.configLoader();\n } catch (error) {\n config = options.configFallback || {};\n }\n } else {\n config = options.configFallback || {};\n }\n });\n\n await runPhase('i18n', async () => {\n await adapters.i18n.initialize(i18n);\n });\n\n await runPhase('theme', async () => {\n await Promise.resolve(adapters.theme.initialize?.(theme));\n await adapters.theme.apply(theme);\n });\n\n await runPhase('init', async () => {\n await options.lifecycle?.beforeInitialization?.();\n const initContext = await initialization({\n loggerLevel: options.loggerLevel,\n locale: i18n.resources as any,\n lifecycle: options.lifecycle,\n });\n await options.lifecycle?.afterInitialization?.(initContext);\n });\n\n await runPhase('ready', async () => {\n adapters.eventBus.emit('kernel.ready', {\n traceId,\n theme,\n locale: i18n.locale,\n config,\n });\n });\n\n if (options.enablePostReady !== false) {\n await runPhase('postReady', async () => {\n adapters.eventBus.emit('kernel.postReady', { traceId });\n });\n }\n\n const setTheme = async (partial: Partial<ThemeSnapshot>): Promise<void> => {\n theme = { ...theme, ...partial };\n await adapters.theme.apply(theme);\n adapters.eventBus.emit('kernel.theme.changed', { traceId, theme });\n };\n\n const setThemeMode = async (mode: ThemeMode): Promise<void> => {\n await setTheme({ mode });\n };\n\n const setLocale = async (locale: I18nSnapshot['locale']): Promise<void> => {\n i18n = { ...i18n, locale };\n await adapters.i18n.setLocale(locale);\n adapters.eventBus.emit('kernel.i18n.changed', { traceId, locale });\n };\n\n return {\n traceId,\n getTheme: () => ({ ...theme }),\n setTheme,\n setThemeMode,\n getI18n: () => ({ ...i18n }),\n setLocale,\n getConfig: () => ({ ...config }),\n getStateManager: () => adapters.state.getInstance(),\n getEventBus: () => adapters.eventBus,\n getMetrics: () => [...metrics],\n destroy: () => {\n adapters.state.destroy?.();\n adapters.eventBus.destroy?.();\n adapters.eventBus.emit('kernel.destroyed', { traceId });\n },\n };\n}\n"],"names":["startKernel","DEFAULT_THEME","mode","DEFAULT_I18N","locale","withOptionalTimeout","task","timeoutMs","timeoutMessage","Promise","race","_","reject","setTimeout","Error","options","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","adapters","resolveKernelAdapters","metrics","config","theme","i18n","emitPhaseMetric","metric","push","monitoring","reportPhase","reportMetric","duration","phase","eventBus","emit","runPhase","fn","enabled","enabledPhases","startTime","performance","now","phaseTimeoutMs","endTime","error","bootError","toKernelBootError","captureError","result","errorHandler","handle","shouldThrow","logger","initialize","info","all","resolve","state","configLoader","configFallback","apply","lifecycle","beforeInitialization","initContext","initialization","loggerLevel","resources","afterInitialization","enablePostReady","setTheme","partial","setThemeMode","setLocale","getTheme","getI18n","getConfig","getStateManager","getInstance","getEventBus","getMetrics","destroy"],"mappings":"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"}
|
|
@@ -114,8 +114,7 @@ export async function startKernel(options = {}) {
|
|
|
114
114
|
const initContext = await initialization({
|
|
115
115
|
loggerLevel: options.loggerLevel,
|
|
116
116
|
locale: i18n.resources,
|
|
117
|
-
lifecycle: options.lifecycle
|
|
118
|
-
configStrategy: undefined
|
|
117
|
+
lifecycle: options.lifecycle
|
|
119
118
|
});
|
|
120
119
|
await options.lifecycle?.afterInitialization?.(initContext);
|
|
121
120
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/kernel/startKernel.ts"],"sourcesContent":["import { initialization } from '../initialization';\nimport { generateTraceId, initTraceIdGenerator, setCurrentTraceId } from '../../utils/traceId';\nimport { toKernelBootError } from './errors';\nimport { resolveKernelAdapters } from './defaultAdapters';\nimport type {\n I18nSnapshot,\n KernelBootPhase,\n KernelPhaseMetric,\n KernelRuntime,\n KernelStartOptions,\n ThemeMode,\n ThemeSnapshot,\n} from './types';\n\nconst DEFAULT_THEME: ThemeSnapshot = { mode: 'light' };\nconst DEFAULT_I18N: I18nSnapshot = { locale: 'zh-CN' };\n\nasync function withOptionalTimeout<T>(\n task: () => Promise<T>,\n timeoutMs?: number,\n timeoutMessage = 'Kernel phase timeout'\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) {\n return task();\n }\n\n return Promise.race([\n task(),\n new Promise<T>((_, reject) => {\n setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);\n }),\n ]);\n}\n\nexport async function startKernel(options: KernelStartOptions = {}): Promise<KernelRuntime> {\n initTraceIdGenerator('kernel');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n const adapters = resolveKernelAdapters(options);\n const metrics: KernelPhaseMetric[] = [];\n let config: Record<string, unknown> = {};\n let theme: ThemeSnapshot = { ...DEFAULT_THEME, ...(options.theme || {}) };\n let i18n: I18nSnapshot = { ...DEFAULT_I18N, ...(options.locale || {}) };\n\n const emitPhaseMetric = (metric: KernelPhaseMetric): void => {\n metrics.push(metric);\n adapters.monitoring.reportPhase?.(metric);\n adapters.monitoring.reportMetric?.('kernel.phase.duration', metric.duration, {\n phase: metric.phase,\n });\n adapters.eventBus.emit('kernel.phase.end', metric);\n };\n\n const runPhase = async (phase: KernelBootPhase, fn: () => Promise<void>): Promise<void> => {\n const enabled = options.enabledPhases?.[phase];\n if (enabled === false) {\n adapters.eventBus.emit('kernel.phase.skipped', { phase, traceId });\n return;\n }\n\n const startTime = performance.now();\n adapters.eventBus.emit('kernel.phase.start', { phase, traceId, startTime });\n\n try {\n await withOptionalTimeout(\n fn,\n options.performance?.phaseTimeoutMs?.[phase],\n `Kernel phase \"${phase}\" timeout`\n );\n emitPhaseMetric({\n phase,\n startTime,\n endTime: performance.now(),\n duration: performance.now() - startTime,\n });\n } catch (error) {\n const bootError = toKernelBootError(error, phase, traceId);\n adapters.monitoring.captureError(bootError, { phase, traceId });\n adapters.eventBus.emit('kernel.phase.error', bootError);\n\n const result = await adapters.errorHandler.handle(bootError);\n if (result.shouldThrow) {\n throw bootError;\n }\n }\n };\n\n await runPhase('prepare', async () => {\n adapters.logger.initialize?.(options);\n adapters.logger.info('Kernel 启动准备完成', { traceId });\n });\n\n await runPhase('services', async () => {\n await Promise.all([\n Promise.resolve(adapters.monitoring.initialize?.(options)),\n Promise.resolve(adapters.state.initialize?.(options)),\n Promise.resolve(adapters.eventBus.initialize?.(options)),\n ]);\n });\n\n await runPhase('config', async () => {\n if (options.configLoader) {\n try {\n config = await options.configLoader();\n } catch (error) {\n config = options.configFallback || {};\n }\n } else {\n config = options.configFallback || {};\n }\n });\n\n await runPhase('i18n', async () => {\n await adapters.i18n.initialize(i18n);\n });\n\n await runPhase('theme', async () => {\n await Promise.resolve(adapters.theme.initialize?.(theme));\n await adapters.theme.apply(theme);\n });\n\n await runPhase('init', async () => {\n await options.lifecycle?.beforeInitialization?.();\n const initContext = await initialization({\n loggerLevel: options.loggerLevel,\n locale: i18n.resources as any,\n lifecycle: options.lifecycle,\n configStrategy: undefined,\n });\n await options.lifecycle?.afterInitialization?.(initContext);\n });\n\n await runPhase('ready', async () => {\n adapters.eventBus.emit('kernel.ready', {\n traceId,\n theme,\n locale: i18n.locale,\n config,\n });\n });\n\n if (options.enablePostReady !== false) {\n await runPhase('postReady', async () => {\n adapters.eventBus.emit('kernel.postReady', { traceId });\n });\n }\n\n const setTheme = async (partial: Partial<ThemeSnapshot>): Promise<void> => {\n theme = { ...theme, ...partial };\n await adapters.theme.apply(theme);\n adapters.eventBus.emit('kernel.theme.changed', { traceId, theme });\n };\n\n const setThemeMode = async (mode: ThemeMode): Promise<void> => {\n await setTheme({ mode });\n };\n\n const setLocale = async (locale: I18nSnapshot['locale']): Promise<void> => {\n i18n = { ...i18n, locale };\n await adapters.i18n.setLocale(locale);\n adapters.eventBus.emit('kernel.i18n.changed', { traceId, locale });\n };\n\n return {\n traceId,\n getTheme: () => ({ ...theme }),\n setTheme,\n setThemeMode,\n getI18n: () => ({ ...i18n }),\n setLocale,\n getConfig: () => ({ ...config }),\n getStateManager: () => adapters.state.getInstance(),\n getEventBus: () => adapters.eventBus,\n getMetrics: () => [...metrics],\n destroy: () => {\n adapters.state.destroy?.();\n adapters.eventBus.destroy?.();\n adapters.eventBus.emit('kernel.destroyed', { traceId });\n },\n };\n}\n"],"names":["initialization","generateTraceId","initTraceIdGenerator","setCurrentTraceId","toKernelBootError","resolveKernelAdapters","DEFAULT_THEME","mode","DEFAULT_I18N","locale","withOptionalTimeout","task","timeoutMs","timeoutMessage","Promise","race","_","reject","setTimeout","Error","startKernel","options","traceId","adapters","metrics","config","theme","i18n","emitPhaseMetric","metric","push","monitoring","reportPhase","reportMetric","duration","phase","eventBus","emit","runPhase","fn","enabled","enabledPhases","startTime","performance","now","phaseTimeoutMs","endTime","error","bootError","captureError","result","errorHandler","handle","shouldThrow","logger","initialize","info","all","resolve","state","configLoader","configFallback","apply","lifecycle","beforeInitialization","initContext","loggerLevel","resources","configStrategy","undefined","afterInitialization","enablePostReady","setTheme","partial","setThemeMode","setLocale","getTheme","getI18n","getConfig","getStateManager","getInstance","getEventBus","getMetrics","destroy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/kernel/startKernel.ts"],"sourcesContent":["import { initialization } from '../initialization';\nimport { generateTraceId, initTraceIdGenerator, setCurrentTraceId } from '../../utils/traceId';\nimport { toKernelBootError } from './errors';\nimport { resolveKernelAdapters } from './defaultAdapters';\nimport type {\n I18nSnapshot,\n KernelBootPhase,\n KernelPhaseMetric,\n KernelRuntime,\n KernelStartOptions,\n ThemeMode,\n ThemeSnapshot,\n} from './types';\n\nconst DEFAULT_THEME: ThemeSnapshot = { mode: 'light' };\nconst DEFAULT_I18N: I18nSnapshot = { locale: 'zh-CN' };\n\nasync function withOptionalTimeout<T>(\n task: () => Promise<T>,\n timeoutMs?: number,\n timeoutMessage = 'Kernel phase timeout'\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) {\n return task();\n }\n\n return Promise.race([\n task(),\n new Promise<T>((_, reject) => {\n setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);\n }),\n ]);\n}\n\nexport async function startKernel(options: KernelStartOptions = {}): Promise<KernelRuntime> {\n initTraceIdGenerator('kernel');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n const adapters = resolveKernelAdapters(options);\n const metrics: KernelPhaseMetric[] = [];\n let config: Record<string, unknown> = {};\n let theme: ThemeSnapshot = { ...DEFAULT_THEME, ...(options.theme || {}) };\n let i18n: I18nSnapshot = { ...DEFAULT_I18N, ...(options.locale || {}) };\n\n const emitPhaseMetric = (metric: KernelPhaseMetric): void => {\n metrics.push(metric);\n adapters.monitoring.reportPhase?.(metric);\n adapters.monitoring.reportMetric?.('kernel.phase.duration', metric.duration, {\n phase: metric.phase,\n });\n adapters.eventBus.emit('kernel.phase.end', metric);\n };\n\n const runPhase = async (phase: KernelBootPhase, fn: () => Promise<void>): Promise<void> => {\n const enabled = options.enabledPhases?.[phase];\n if (enabled === false) {\n adapters.eventBus.emit('kernel.phase.skipped', { phase, traceId });\n return;\n }\n\n const startTime = performance.now();\n adapters.eventBus.emit('kernel.phase.start', { phase, traceId, startTime });\n\n try {\n await withOptionalTimeout(\n fn,\n options.performance?.phaseTimeoutMs?.[phase],\n `Kernel phase \"${phase}\" timeout`\n );\n emitPhaseMetric({\n phase,\n startTime,\n endTime: performance.now(),\n duration: performance.now() - startTime,\n });\n } catch (error) {\n const bootError = toKernelBootError(error, phase, traceId);\n adapters.monitoring.captureError(bootError, { phase, traceId });\n adapters.eventBus.emit('kernel.phase.error', bootError);\n\n const result = await adapters.errorHandler.handle(bootError);\n if (result.shouldThrow) {\n throw bootError;\n }\n }\n };\n\n await runPhase('prepare', async () => {\n adapters.logger.initialize?.(options);\n adapters.logger.info('Kernel 启动准备完成', { traceId });\n });\n\n await runPhase('services', async () => {\n await Promise.all([\n Promise.resolve(adapters.monitoring.initialize?.(options)),\n Promise.resolve(adapters.state.initialize?.(options)),\n Promise.resolve(adapters.eventBus.initialize?.(options)),\n ]);\n });\n\n await runPhase('config', async () => {\n if (options.configLoader) {\n try {\n config = await options.configLoader();\n } catch (error) {\n config = options.configFallback || {};\n }\n } else {\n config = options.configFallback || {};\n }\n });\n\n await runPhase('i18n', async () => {\n await adapters.i18n.initialize(i18n);\n });\n\n await runPhase('theme', async () => {\n await Promise.resolve(adapters.theme.initialize?.(theme));\n await adapters.theme.apply(theme);\n });\n\n await runPhase('init', async () => {\n await options.lifecycle?.beforeInitialization?.();\n const initContext = await initialization({\n loggerLevel: options.loggerLevel,\n locale: i18n.resources as any,\n lifecycle: options.lifecycle,\n });\n await options.lifecycle?.afterInitialization?.(initContext);\n });\n\n await runPhase('ready', async () => {\n adapters.eventBus.emit('kernel.ready', {\n traceId,\n theme,\n locale: i18n.locale,\n config,\n });\n });\n\n if (options.enablePostReady !== false) {\n await runPhase('postReady', async () => {\n adapters.eventBus.emit('kernel.postReady', { traceId });\n });\n }\n\n const setTheme = async (partial: Partial<ThemeSnapshot>): Promise<void> => {\n theme = { ...theme, ...partial };\n await adapters.theme.apply(theme);\n adapters.eventBus.emit('kernel.theme.changed', { traceId, theme });\n };\n\n const setThemeMode = async (mode: ThemeMode): Promise<void> => {\n await setTheme({ mode });\n };\n\n const setLocale = async (locale: I18nSnapshot['locale']): Promise<void> => {\n i18n = { ...i18n, locale };\n await adapters.i18n.setLocale(locale);\n adapters.eventBus.emit('kernel.i18n.changed', { traceId, locale });\n };\n\n return {\n traceId,\n getTheme: () => ({ ...theme }),\n setTheme,\n setThemeMode,\n getI18n: () => ({ ...i18n }),\n setLocale,\n getConfig: () => ({ ...config }),\n getStateManager: () => adapters.state.getInstance(),\n getEventBus: () => adapters.eventBus,\n getMetrics: () => [...metrics],\n destroy: () => {\n adapters.state.destroy?.();\n adapters.eventBus.destroy?.();\n adapters.eventBus.emit('kernel.destroyed', { traceId });\n },\n };\n}\n"],"names":["initialization","generateTraceId","initTraceIdGenerator","setCurrentTraceId","toKernelBootError","resolveKernelAdapters","DEFAULT_THEME","mode","DEFAULT_I18N","locale","withOptionalTimeout","task","timeoutMs","timeoutMessage","Promise","race","_","reject","setTimeout","Error","startKernel","options","traceId","adapters","metrics","config","theme","i18n","emitPhaseMetric","metric","push","monitoring","reportPhase","reportMetric","duration","phase","eventBus","emit","runPhase","fn","enabled","enabledPhases","startTime","performance","now","phaseTimeoutMs","endTime","error","bootError","captureError","result","errorHandler","handle","shouldThrow","logger","initialize","info","all","resolve","state","configLoader","configFallback","apply","lifecycle","beforeInitialization","initContext","loggerLevel","resources","afterInitialization","enablePostReady","setTheme","partial","setThemeMode","setLocale","getTheme","getI18n","getConfig","getStateManager","getInstance","getEventBus","getMetrics","destroy"],"mappings":"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"}
|
package/dist/core/plugin.cjs
CHANGED
|
@@ -87,7 +87,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
87
87
|
let PluginManager = class PluginManager {
|
|
88
88
|
/**
|
|
89
89
|
* 注册插件
|
|
90
|
-
*
|
|
90
|
+
*
|
|
91
91
|
* 优化:检查插件依赖是否已注册
|
|
92
92
|
*/ register(plugin) {
|
|
93
93
|
if (this.plugins.has(plugin.name)) {
|
|
@@ -120,7 +120,7 @@ let PluginManager = class PluginManager {
|
|
|
120
120
|
}
|
|
121
121
|
/**
|
|
122
122
|
* 获取插件加载顺序(考虑依赖和优先级)
|
|
123
|
-
*
|
|
123
|
+
*
|
|
124
124
|
* @returns 插件名称数组,按加载顺序排列
|
|
125
125
|
*/ getLoadOrder() {
|
|
126
126
|
const plugins = Array.from(this.plugins.values());
|
|
@@ -172,7 +172,7 @@ let PluginManager = class PluginManager {
|
|
|
172
172
|
}
|
|
173
173
|
/**
|
|
174
174
|
* 动态加载插件(热插拔)
|
|
175
|
-
*
|
|
175
|
+
*
|
|
176
176
|
* @param options - 插件加载选项
|
|
177
177
|
* @returns 加载的插件
|
|
178
178
|
*/ async loadPlugin(options) {
|
|
@@ -216,7 +216,7 @@ let PluginManager = class PluginManager {
|
|
|
216
216
|
}
|
|
217
217
|
/**
|
|
218
218
|
* 初始化单个插件
|
|
219
|
-
*
|
|
219
|
+
*
|
|
220
220
|
* @param name - 插件名称
|
|
221
221
|
* @param options - 启动选项
|
|
222
222
|
* @param context - 初始化上下文
|
|
@@ -247,7 +247,7 @@ let PluginManager = class PluginManager {
|
|
|
247
247
|
}
|
|
248
248
|
/**
|
|
249
249
|
* 卸载插件(热插拔)
|
|
250
|
-
*
|
|
250
|
+
*
|
|
251
251
|
* @param name - 插件名称
|
|
252
252
|
* @param force - 是否强制卸载(即使有依赖)
|
|
253
253
|
*/ async unloadPlugin(name, force = false) {
|
|
@@ -279,7 +279,7 @@ let PluginManager = class PluginManager {
|
|
|
279
279
|
}
|
|
280
280
|
/**
|
|
281
281
|
* 检查插件是否可以热加载
|
|
282
|
-
*
|
|
282
|
+
*
|
|
283
283
|
* @param plugin - 插件
|
|
284
284
|
* @returns 是否可以热加载
|
|
285
285
|
*/ canHotLoad(plugin) {
|
|
@@ -294,7 +294,7 @@ let PluginManager = class PluginManager {
|
|
|
294
294
|
}
|
|
295
295
|
/**
|
|
296
296
|
* 注册插件加载器(用于延迟加载)
|
|
297
|
-
*
|
|
297
|
+
*
|
|
298
298
|
* @param name - 插件名称
|
|
299
299
|
* @param loader - 加载器函数
|
|
300
300
|
*/ registerLoader(name, loader) {
|
|
@@ -302,7 +302,7 @@ let PluginManager = class PluginManager {
|
|
|
302
302
|
}
|
|
303
303
|
/**
|
|
304
304
|
* 使用加载器加载插件
|
|
305
|
-
*
|
|
305
|
+
*
|
|
306
306
|
* @param name - 插件名称
|
|
307
307
|
* @param options - 加载选项
|
|
308
308
|
* @returns 加载的插件
|
|
@@ -349,7 +349,7 @@ let PluginManager = class PluginManager {
|
|
|
349
349
|
}
|
|
350
350
|
/**
|
|
351
351
|
* 执行初始化前钩子
|
|
352
|
-
*
|
|
352
|
+
*
|
|
353
353
|
* 优化:按依赖顺序执行
|
|
354
354
|
*/ async executeBeforeInit(options) {
|
|
355
355
|
const loadOrder = this.getLoadOrder();
|
|
@@ -374,7 +374,7 @@ let PluginManager = class PluginManager {
|
|
|
374
374
|
}
|
|
375
375
|
/**
|
|
376
376
|
* 执行初始化钩子
|
|
377
|
-
*
|
|
377
|
+
*
|
|
378
378
|
* 优化:按依赖顺序执行,并更新插件状态
|
|
379
379
|
*/ async executeInit(options, context) {
|
|
380
380
|
const loadOrder = this.getLoadOrder();
|
|
@@ -400,7 +400,7 @@ let PluginManager = class PluginManager {
|
|
|
400
400
|
}
|
|
401
401
|
/**
|
|
402
402
|
* 执行初始化后钩子
|
|
403
|
-
*
|
|
403
|
+
*
|
|
404
404
|
* 优化:按依赖顺序执行(逆序,确保依赖插件先执行)
|
|
405
405
|
*/ async executeAfterInit(options, context) {
|
|
406
406
|
const loadOrder = this.getLoadOrder();
|
|
@@ -429,7 +429,7 @@ let PluginManager = class PluginManager {
|
|
|
429
429
|
}
|
|
430
430
|
/**
|
|
431
431
|
* 获取插件状态
|
|
432
|
-
*
|
|
432
|
+
*
|
|
433
433
|
* @param name - 插件名称
|
|
434
434
|
* @returns 插件状态
|
|
435
435
|
*/ getPluginStatus(name) {
|
|
@@ -437,7 +437,7 @@ let PluginManager = class PluginManager {
|
|
|
437
437
|
}
|
|
438
438
|
/**
|
|
439
439
|
* 检查插件是否已加载
|
|
440
|
-
*
|
|
440
|
+
*
|
|
441
441
|
* @param name - 插件名称
|
|
442
442
|
* @returns 是否已加载
|
|
443
443
|
*/ isLoaded(name) {
|
|
@@ -445,21 +445,21 @@ let PluginManager = class PluginManager {
|
|
|
445
445
|
}
|
|
446
446
|
/**
|
|
447
447
|
* 获取已加载的插件列表
|
|
448
|
-
*
|
|
448
|
+
*
|
|
449
449
|
* @returns 插件名称数组
|
|
450
450
|
*/ getLoadedPlugins() {
|
|
451
451
|
return Array.from(this.plugins.keys());
|
|
452
452
|
}
|
|
453
453
|
/**
|
|
454
454
|
* 获取所有插件状态
|
|
455
|
-
*
|
|
455
|
+
*
|
|
456
456
|
* @returns 插件状态映射
|
|
457
457
|
*/ getAllPluginStatus() {
|
|
458
458
|
return new Map(this.pluginStatus);
|
|
459
459
|
}
|
|
460
460
|
/**
|
|
461
461
|
* 获取插件沙箱
|
|
462
|
-
*
|
|
462
|
+
*
|
|
463
463
|
* @param name - 插件名称
|
|
464
464
|
* @returns 插件沙箱或undefined
|
|
465
465
|
*/ getSandbox(name) {
|
package/dist/core/plugin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/plugin.ts"],"sourcesContent":["import type { StartOptions } from './types';\nimport type { InitializationContext } from './initialization';\nimport { PluginSandbox, type PluginSandboxConfig } from './plugin/PluginSandbox';\nimport { pluginEventBus, type PluginEventBus } from './plugin/PluginEventBus';\n\n/**\n * 插件接口\n */\nexport interface Plugin {\n /**\n * 插件名称\n */\n name: string;\n\n /**\n * 插件版本\n */\n version?: string;\n\n /**\n * 插件依赖列表(插件名称数组)\n * 优化:支持插件依赖管理\n */\n dependencies?: string[];\n\n /**\n * 插件优先级(数字越小优先级越高)\n * 优化:支持插件加载顺序控制\n */\n priority?: number;\n\n /**\n * 插件沙箱配置(用于权限控制)\n */\n sandbox?: PluginSandboxConfig;\n\n /**\n * 初始化前钩子\n */\n beforeInit?: (options: Partial<StartOptions>, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化钩子\n */\n init?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化后钩子\n */\n afterInit?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 销毁钩子\n */\n destroy?: () => Promise<void> | void;\n}\n\n/**\n * 插件加载选项\n */\nexport interface PluginLoadOptions {\n /**\n * 插件URL(用于动态加载)\n */\n url?: string;\n /**\n * 插件模块路径(用于动态导入)\n */\n modulePath?: string;\n /**\n * 是否立即初始化\n */\n initialize?: boolean;\n /**\n * 初始化上下文(如果立即初始化)\n */\n initContext?: InitializationContext;\n /**\n * 启动选项(如果立即初始化)\n */\n startOptions?: StartOptions;\n}\n\n/**\n * 插件管理器\n * \n * 优化:\n * 1. 支持插件依赖管理\n * 2. 支持插件优先级控制\n * 3. 支持插件生命周期管理\n * 4. 支持插件热插拔(动态加载/卸载)\n */\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private sandboxes: Map<string, PluginSandbox> = new Map();\n private pluginStatus: Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> = new Map();\n private pluginLoaders: Map<string, () => Promise<Plugin>> = new Map();\n\n /**\n * 注册插件\n * \n * 优化:检查插件依赖是否已注册\n */\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);\n }\n\n // 检查依赖是否已注册\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n console.warn(\n `插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`\n );\n }\n }\n\n this.plugins.set(plugin.name, plugin);\n this.pluginStatus.set(plugin.name, 'registered');\n\n // 创建插件沙箱\n if (plugin.sandbox) {\n const sandbox = new PluginSandbox({\n ...plugin.sandbox,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n } else {\n // 如果没有配置沙箱,创建默认沙箱(非严格模式)\n const sandbox = new PluginSandbox({\n strictMode: false,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n }\n }\n\n /**\n * 获取插件加载顺序(考虑依赖和优先级)\n * \n * @returns 插件名称数组,按加载顺序排列\n */\n private getLoadOrder(): string[] {\n const plugins = Array.from(this.plugins.values());\n \n // 按优先级排序\n const sortedPlugins = plugins.sort((a, b) => {\n const priorityA = a.priority ?? 100;\n const priorityB = b.priority ?? 100;\n return priorityA - priorityB;\n });\n\n // 构建依赖图并拓扑排序\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const result: string[] = [];\n\n const visit = (pluginName: string): void => {\n if (visiting.has(pluginName)) {\n console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);\n return;\n }\n if (visited.has(pluginName)) {\n return;\n }\n\n visiting.add(pluginName);\n const plugin = this.plugins.get(pluginName);\n if (plugin?.dependencies) {\n for (const dep of plugin.dependencies) {\n visit(dep);\n }\n }\n visiting.delete(pluginName);\n visited.add(pluginName);\n result.push(pluginName);\n };\n\n for (const plugin of sortedPlugins) {\n visit(plugin.name);\n }\n\n return result;\n }\n\n /**\n * 注销插件\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin && plugin.destroy) {\n plugin.destroy();\n }\n this.plugins.delete(name);\n this.sandboxes.delete(name);\n this.pluginStatus.delete(name);\n this.pluginLoaders.delete(name);\n }\n\n /**\n * 动态加载插件(热插拔)\n * \n * @param options - 插件加载选项\n * @returns 加载的插件\n */\n async loadPlugin(options: PluginLoadOptions): Promise<Plugin> {\n let plugin: Plugin;\n\n if (options.url) {\n // 从URL加载插件\n const response = await fetch(options.url);\n if (!response.ok) {\n throw new Error(`无法加载插件: ${options.url} (${response.status})`);\n }\n const pluginModule = await response.json();\n plugin = pluginModule.default || pluginModule;\n } else if (options.modulePath) {\n // 从模块路径动态导入\n const pluginModule = await import(/* @vite-ignore */ options.modulePath);\n plugin = pluginModule.default || pluginModule;\n } else {\n throw new Error('必须提供 url 或 modulePath');\n }\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n throw new Error(`插件 ${plugin.name} 已加载`);\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 初始化单个插件\n * \n * @param name - 插件名称\n * @param options - 启动选项\n * @param context - 初始化上下文\n */\n async initializePlugin(\n name: string,\n options: StartOptions,\n context: InitializationContext\n ): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未注册`);\n }\n\n const status = this.pluginStatus.get(name);\n if (status === 'initialized') {\n return; // 已经初始化\n }\n\n try {\n const sandbox = this.sandboxes.get(name);\n if (!sandbox) {\n throw new Error(`插件 ${name} 的沙箱未找到`);\n }\n\n // 执行初始化钩子\n if (plugin.init) {\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n }\n\n this.pluginStatus.set(name, 'initialized');\n } catch (error) {\n console.error(`插件 ${name} 初始化失败:`, error);\n throw error;\n }\n }\n\n /**\n * 卸载插件(热插拔)\n * \n * @param name - 插件名称\n * @param force - 是否强制卸载(即使有依赖)\n */\n async unloadPlugin(name: string, force: boolean = false): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未加载`);\n }\n\n // 检查是否有其他插件依赖此插件\n if (!force) {\n const dependents = Array.from(this.plugins.values()).filter(\n (p) => p.dependencies && p.dependencies.includes(name)\n );\n if (dependents.length > 0) {\n throw new Error(\n `无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p) => p.name).join(', ')}`\n );\n }\n }\n\n // 执行销毁钩子\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);\n }\n }\n\n // 从事件总线移除相关监听器(如果有)\n // 注意:事件总线是全局的,这里只移除插件相关的事件\n // 实际实现可能需要更细粒度的控制\n\n // 清理插件\n this.unregister(name);\n this.pluginStatus.set(name, 'destroyed');\n }\n\n /**\n * 检查插件是否可以热加载\n * \n * @param plugin - 插件\n * @returns 是否可以热加载\n */\n canHotLoad(plugin: Plugin): boolean {\n // 检查依赖是否都已加载\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 注册插件加载器(用于延迟加载)\n * \n * @param name - 插件名称\n * @param loader - 加载器函数\n */\n registerLoader(name: string, loader: () => Promise<Plugin>): void {\n this.pluginLoaders.set(name, loader);\n }\n\n /**\n * 使用加载器加载插件\n * \n * @param name - 插件名称\n * @param options - 加载选项\n * @returns 加载的插件\n */\n async loadPluginByLoader(\n name: string,\n options?: Omit<PluginLoadOptions, 'url' | 'modulePath'>\n ): Promise<Plugin> {\n const loader = this.pluginLoaders.get(name);\n if (!loader) {\n throw new Error(`插件 ${name} 的加载器未注册`);\n }\n\n const plugin = await loader();\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n if (plugin.name !== name) {\n throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n return this.plugins.get(plugin.name)!;\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options?.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 获取插件\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 获取所有插件\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * 执行初始化前钩子\n * \n * 优化:按依赖顺序执行\n */\n async executeBeforeInit(options: StartOptions): Promise<void> {\n const loadOrder = this.getLoadOrder();\n \n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.beforeInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化钩子\n * \n * 优化:按依赖顺序执行,并更新插件状态\n */\n async executeInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n \n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.init) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n this.pluginStatus.set(plugin.name, 'initialized');\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化后钩子\n * \n * 优化:按依赖顺序执行(逆序,确保依赖插件先执行)\n */\n async executeAfterInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n // 逆序执行,确保依赖插件先执行\n const reverseOrder = [...loadOrder].reverse();\n \n for (const pluginName of reverseOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.afterInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 获取插件状态\n * \n * @param name - 插件名称\n * @returns 插件状态\n */\n getPluginStatus(name: string): 'registered' | 'initialized' | 'destroyed' | 'loading' | undefined {\n return this.pluginStatus.get(name);\n }\n\n /**\n * 检查插件是否已加载\n * \n * @param name - 插件名称\n * @returns 是否已加载\n */\n isLoaded(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已加载的插件列表\n * \n * @returns 插件名称数组\n */\n getLoadedPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有插件状态\n * \n * @returns 插件状态映射\n */\n getAllPluginStatus(): Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> {\n return new Map(this.pluginStatus);\n }\n\n /**\n * 获取插件沙箱\n * \n * @param name - 插件名称\n * @returns 插件沙箱或undefined\n */\n getSandbox(name: string): PluginSandbox | undefined {\n return this.sandboxes.get(name);\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): PluginEventBus {\n return pluginEventBus;\n }\n\n /**\n * 销毁所有插件\n */\n async destroyAll(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);\n }\n }\n }\n this.plugins.clear();\n }\n}\n\n/**\n * 默认插件管理器\n */\nexport const pluginManager = new PluginManager();\n\n// 导出插件相关类型和工具\nexport { PluginSandbox, PluginPermission, type PluginSandboxConfig } from './plugin/PluginSandbox';\nexport { \n PluginEventBus, \n pluginEventBus, \n type EventListener,\n type EventMetadata,\n type EventWrapper,\n type PluginEventBusConfig,\n} from './plugin/PluginEventBus';\n"],"names":["PluginEventBus","PluginManager","PluginPermission","PluginSandbox","pluginEventBus","pluginManager","register","plugin","plugins","has","name","console","warn","dependencies","length","missingDeps","filter","dep","join","set","pluginStatus","sandbox","sandboxes","strictMode","getLoadOrder","Array","from","values","sortedPlugins","sort","a","b","priorityA","priority","priorityB","visited","Set","visiting","result","visit","pluginName","add","get","delete","push","unregister","destroy","pluginLoaders","loadPlugin","options","url","response","fetch","ok","Error","status","pluginModule","json","default","modulePath","initialize","initContext","startOptions","initializePlugin","error","context","init","filteredOptions","filterConfig","unloadPlugin","force","dependents","p","includes","map","canHotLoad","registerLoader","loader","loadPluginByLoader","getAll","executeBeforeInit","loadOrder","beforeInit","executeInit","executeAfterInit","reverseOrder","reverse","afterInit","getPluginStatus","isLoaded","getLoadedPlugins","keys","getAllPluginStatus","Map","getSandbox","getEventBus","destroyAll","clear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/plugin.ts"],"sourcesContent":["import type { StartOptions } from './types';\nimport type { InitializationContext } from './initialization';\nimport { PluginSandbox, type PluginSandboxConfig } from './plugin/PluginSandbox';\nimport { pluginEventBus, type PluginEventBus } from './plugin/PluginEventBus';\n\n/**\n * 插件接口\n */\nexport interface Plugin<TOption = unknown> {\n /**\n * 插件名称\n */\n name: string;\n\n /**\n * 插件版本\n */\n version?: string;\n\n /**\n * 插件依赖列表(插件名称数组)\n * 优化:支持插件依赖管理\n */\n dependencies?: string[];\n\n /**\n * 插件优先级(数字越小优先级越高)\n * 优化:支持插件加载顺序控制\n */\n priority?: number;\n\n /**\n * 插件沙箱配置(用于权限控制)\n */\n sandbox?: PluginSandboxConfig;\n\n /**\n * 初始化前钩子\n */\n beforeInit?: (options: Partial<StartOptions>, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化钩子\n */\n init?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化后钩子\n */\n afterInit?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 销毁钩子\n */\n destroy?: () => Promise<void> | void;\n\n /**\n * 自定义属性\n */\n readonly option?: Readonly<TOption>;\n}\n\n/**\n * 插件加载选项\n */\nexport interface PluginLoadOptions {\n /**\n * 插件URL(用于动态加载)\n */\n url?: string;\n /**\n * 插件模块路径(用于动态导入)\n */\n modulePath?: string;\n /**\n * 是否立即初始化\n */\n initialize?: boolean;\n /**\n * 初始化上下文(如果立即初始化)\n */\n initContext?: InitializationContext;\n /**\n * 启动选项(如果立即初始化)\n */\n startOptions?: StartOptions;\n}\n\n/**\n * 插件管理器\n *\n * 优化:\n * 1. 支持插件依赖管理\n * 2. 支持插件优先级控制\n * 3. 支持插件生命周期管理\n * 4. 支持插件热插拔(动态加载/卸载)\n */\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private sandboxes: Map<string, PluginSandbox> = new Map();\n private pluginStatus: Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> = new Map();\n private pluginLoaders: Map<string, () => Promise<Plugin>> = new Map();\n\n /**\n * 注册插件\n *\n * 优化:检查插件依赖是否已注册\n */\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);\n }\n\n // 检查依赖是否已注册\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n console.warn(\n `插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`\n );\n }\n }\n\n this.plugins.set(plugin.name, plugin);\n this.pluginStatus.set(plugin.name, 'registered');\n\n // 创建插件沙箱\n if (plugin.sandbox) {\n const sandbox = new PluginSandbox({\n ...plugin.sandbox,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n } else {\n // 如果没有配置沙箱,创建默认沙箱(非严格模式)\n const sandbox = new PluginSandbox({\n strictMode: false,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n }\n }\n\n /**\n * 获取插件加载顺序(考虑依赖和优先级)\n *\n * @returns 插件名称数组,按加载顺序排列\n */\n private getLoadOrder(): string[] {\n const plugins = Array.from(this.plugins.values());\n\n // 按优先级排序\n const sortedPlugins = plugins.sort((a, b) => {\n const priorityA = a.priority ?? 100;\n const priorityB = b.priority ?? 100;\n return priorityA - priorityB;\n });\n\n // 构建依赖图并拓扑排序\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const result: string[] = [];\n\n const visit = (pluginName: string): void => {\n if (visiting.has(pluginName)) {\n console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);\n return;\n }\n if (visited.has(pluginName)) {\n return;\n }\n\n visiting.add(pluginName);\n const plugin = this.plugins.get(pluginName);\n if (plugin?.dependencies) {\n for (const dep of plugin.dependencies) {\n visit(dep);\n }\n }\n visiting.delete(pluginName);\n visited.add(pluginName);\n result.push(pluginName);\n };\n\n for (const plugin of sortedPlugins) {\n visit(plugin.name);\n }\n\n return result;\n }\n\n /**\n * 注销插件\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin && plugin.destroy) {\n plugin.destroy();\n }\n this.plugins.delete(name);\n this.sandboxes.delete(name);\n this.pluginStatus.delete(name);\n this.pluginLoaders.delete(name);\n }\n\n /**\n * 动态加载插件(热插拔)\n *\n * @param options - 插件加载选项\n * @returns 加载的插件\n */\n async loadPlugin(options: PluginLoadOptions): Promise<Plugin> {\n let plugin: Plugin;\n\n if (options.url) {\n // 从URL加载插件\n const response = await fetch(options.url);\n if (!response.ok) {\n throw new Error(`无法加载插件: ${options.url} (${response.status})`);\n }\n const pluginModule = await response.json();\n plugin = pluginModule.default || pluginModule;\n } else if (options.modulePath) {\n // 从模块路径动态导入\n const pluginModule = await import(/* @vite-ignore */ options.modulePath);\n plugin = pluginModule.default || pluginModule;\n } else {\n throw new Error('必须提供 url 或 modulePath');\n }\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n throw new Error(`插件 ${plugin.name} 已加载`);\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 初始化单个插件\n *\n * @param name - 插件名称\n * @param options - 启动选项\n * @param context - 初始化上下文\n */\n async initializePlugin(\n name: string,\n options: StartOptions,\n context: InitializationContext\n ): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未注册`);\n }\n\n const status = this.pluginStatus.get(name);\n if (status === 'initialized') {\n return; // 已经初始化\n }\n\n try {\n const sandbox = this.sandboxes.get(name);\n if (!sandbox) {\n throw new Error(`插件 ${name} 的沙箱未找到`);\n }\n\n // 执行初始化钩子\n if (plugin.init) {\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n }\n\n this.pluginStatus.set(name, 'initialized');\n } catch (error) {\n console.error(`插件 ${name} 初始化失败:`, error);\n throw error;\n }\n }\n\n /**\n * 卸载插件(热插拔)\n *\n * @param name - 插件名称\n * @param force - 是否强制卸载(即使有依赖)\n */\n async unloadPlugin(name: string, force: boolean = false): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未加载`);\n }\n\n // 检查是否有其他插件依赖此插件\n if (!force) {\n const dependents = Array.from(this.plugins.values()).filter(\n (p) => p.dependencies && p.dependencies.includes(name)\n );\n if (dependents.length > 0) {\n throw new Error(\n `无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p) => p.name).join(', ')}`\n );\n }\n }\n\n // 执行销毁钩子\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);\n }\n }\n\n // 从事件总线移除相关监听器(如果有)\n // 注意:事件总线是全局的,这里只移除插件相关的事件\n // 实际实现可能需要更细粒度的控制\n\n // 清理插件\n this.unregister(name);\n this.pluginStatus.set(name, 'destroyed');\n }\n\n /**\n * 检查插件是否可以热加载\n *\n * @param plugin - 插件\n * @returns 是否可以热加载\n */\n canHotLoad(plugin: Plugin): boolean {\n // 检查依赖是否都已加载\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 注册插件加载器(用于延迟加载)\n *\n * @param name - 插件名称\n * @param loader - 加载器函数\n */\n registerLoader(name: string, loader: () => Promise<Plugin>): void {\n this.pluginLoaders.set(name, loader);\n }\n\n /**\n * 使用加载器加载插件\n *\n * @param name - 插件名称\n * @param options - 加载选项\n * @returns 加载的插件\n */\n async loadPluginByLoader(\n name: string,\n options?: Omit<PluginLoadOptions, 'url' | 'modulePath'>\n ): Promise<Plugin> {\n const loader = this.pluginLoaders.get(name);\n if (!loader) {\n throw new Error(`插件 ${name} 的加载器未注册`);\n }\n\n const plugin = await loader();\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n if (plugin.name !== name) {\n throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n return this.plugins.get(plugin.name)!;\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options?.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 获取插件\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 获取所有插件\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * 执行初始化前钩子\n *\n * 优化:按依赖顺序执行\n */\n async executeBeforeInit(options: StartOptions): Promise<void> {\n const loadOrder = this.getLoadOrder();\n\n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.beforeInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化钩子\n *\n * 优化:按依赖顺序执行,并更新插件状态\n */\n async executeInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n\n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.init) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n this.pluginStatus.set(plugin.name, 'initialized');\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化后钩子\n *\n * 优化:按依赖顺序执行(逆序,确保依赖插件先执行)\n */\n async executeAfterInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n // 逆序执行,确保依赖插件先执行\n const reverseOrder = [...loadOrder].reverse();\n\n for (const pluginName of reverseOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.afterInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 获取插件状态\n *\n * @param name - 插件名称\n * @returns 插件状态\n */\n getPluginStatus(name: string): 'registered' | 'initialized' | 'destroyed' | 'loading' | undefined {\n return this.pluginStatus.get(name);\n }\n\n /**\n * 检查插件是否已加载\n *\n * @param name - 插件名称\n * @returns 是否已加载\n */\n isLoaded(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已加载的插件列表\n *\n * @returns 插件名称数组\n */\n getLoadedPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有插件状态\n *\n * @returns 插件状态映射\n */\n getAllPluginStatus(): Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> {\n return new Map(this.pluginStatus);\n }\n\n /**\n * 获取插件沙箱\n *\n * @param name - 插件名称\n * @returns 插件沙箱或undefined\n */\n getSandbox(name: string): PluginSandbox | undefined {\n return this.sandboxes.get(name);\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): PluginEventBus {\n return pluginEventBus;\n }\n\n /**\n * 销毁所有插件\n */\n async destroyAll(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);\n }\n }\n }\n this.plugins.clear();\n }\n}\n\n/**\n * 默认插件管理器\n */\nexport const pluginManager = new PluginManager();\n\n// 导出插件相关类型和工具\nexport { PluginSandbox, PluginPermission, type PluginSandboxConfig } from './plugin/PluginSandbox';\nexport {\n PluginEventBus,\n pluginEventBus,\n type EventListener,\n type EventMetadata,\n type EventWrapper,\n type PluginEventBusConfig,\n} from './plugin/PluginEventBus';\n"],"names":["PluginEventBus","PluginManager","PluginPermission","PluginSandbox","pluginEventBus","pluginManager","register","plugin","plugins","has","name","console","warn","dependencies","length","missingDeps","filter","dep","join","set","pluginStatus","sandbox","sandboxes","strictMode","getLoadOrder","Array","from","values","sortedPlugins","sort","a","b","priorityA","priority","priorityB","visited","Set","visiting","result","visit","pluginName","add","get","delete","push","unregister","destroy","pluginLoaders","loadPlugin","options","url","response","fetch","ok","Error","status","pluginModule","json","default","modulePath","initialize","initContext","startOptions","initializePlugin","error","context","init","filteredOptions","filterConfig","unloadPlugin","force","dependents","p","includes","map","canHotLoad","registerLoader","loader","loadPluginByLoader","getAll","executeBeforeInit","loadOrder","beforeInit","executeInit","executeAfterInit","reverseOrder","reverse","afterInit","getPluginStatus","isLoaded","getLoadedPlugins","keys","getAllPluginStatus","Map","getSandbox","getEventBus","destroyAll","clear"],"mappings":";;;;;;;;;;;QAimBEA;eAAAA,8BAAc;;QAhgBHC;eAAAA;;QA8fWC;eAAAA,+BAAgB;;QAA/BC;eAAAA,4BAAa;;QAGpBC;eAAAA,8BAAc;;QANHC;eAAAA;;;+BA1lB2C;gCACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8F7C,IAAA,AAAMJ,gBAAN,MAAMA;IAMX;;;;GAIC,GACDK,SAASC,MAAc,EAAQ;QAC7B,IAAI,IAAI,CAACC,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjCC,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,SAAS,CAAC;QAC3C;QAEA,YAAY;QACZ,IAAIH,OAAOM,YAAY,IAAIN,OAAOM,YAAY,CAACC,MAAM,GAAG,GAAG;YACzD,MAAMC,cAAcR,OAAOM,YAAY,CAACG,MAAM,CAC5C,CAACC,MAAQ,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,CAACQ;YAE7B,IAAIF,YAAYD,MAAM,GAAG,GAAG;gBAC1BH,QAAQC,IAAI,CACV,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,SAAS,EAAEK,YAAYG,IAAI,CAAC,OAAO;YAEzD;QACF;QAEA,IAAI,CAACV,OAAO,CAACW,GAAG,CAACZ,OAAOG,IAAI,EAAEH;QAC9B,IAAI,CAACa,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,SAAS;QACT,IAAIH,OAAOc,OAAO,EAAE;YAClB,MAAMA,UAAU,IAAIlB,4BAAa,CAAC;gBAChC,GAAGI,OAAOc,OAAO;gBACjBX,MAAMH,OAAOG,IAAI;YACnB;YACA,IAAI,CAACY,SAAS,CAACH,GAAG,CAACZ,OAAOG,IAAI,EAAEW;QAClC,OAAO;YACL,yBAAyB;YACzB,MAAMA,UAAU,IAAIlB,4BAAa,CAAC;gBAChCoB,YAAY;gBACZb,MAAMH,OAAOG,IAAI;YACnB;YACA,IAAI,CAACY,SAAS,CAACH,GAAG,CAACZ,OAAOG,IAAI,EAAEW;QAClC;IACF;IAEA;;;;GAIC,GACD,AAAQG,eAAyB;QAC/B,MAAMhB,UAAUiB,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM;QAE9C,SAAS;QACT,MAAMC,gBAAgBpB,QAAQqB,IAAI,CAAC,CAACC,GAAGC;YACrC,MAAMC,YAAYF,EAAEG,QAAQ,IAAI;YAChC,MAAMC,YAAYH,EAAEE,QAAQ,IAAI;YAChC,OAAOD,YAAYE;QACrB;QAEA,aAAa;QACb,MAAMC,UAAU,IAAIC;QACpB,MAAMC,WAAW,IAAID;QACrB,MAAME,SAAmB,EAAE;QAE3B,MAAMC,QAAQ,CAACC;YACb,IAAIH,SAAS5B,GAAG,CAAC+B,aAAa;gBAC5B7B,QAAQC,IAAI,CAAC,CAAC,cAAc,EAAE4B,YAAY;gBAC1C;YACF;YACA,IAAIL,QAAQ1B,GAAG,CAAC+B,aAAa;gBAC3B;YACF;YAEAH,SAASI,GAAG,CAACD;YACb,MAAMjC,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAIjC,QAAQM,cAAc;gBACxB,KAAK,MAAMI,OAAOV,OAAOM,YAAY,CAAE;oBACrC0B,MAAMtB;gBACR;YACF;YACAoB,SAASM,MAAM,CAACH;YAChBL,QAAQM,GAAG,CAACD;YACZF,OAAOM,IAAI,CAACJ;QACd;QAEA,KAAK,MAAMjC,UAAUqB,cAAe;YAClCW,MAAMhC,OAAOG,IAAI;QACnB;QAEA,OAAO4B;IACT;IAEA;;GAEC,GACDO,WAAWnC,IAAY,EAAQ;QAC7B,MAAMH,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAIH,UAAUA,OAAOuC,OAAO,EAAE;YAC5BvC,OAAOuC,OAAO;QAChB;QACA,IAAI,CAACtC,OAAO,CAACmC,MAAM,CAACjC;QACpB,IAAI,CAACY,SAAS,CAACqB,MAAM,CAACjC;QACtB,IAAI,CAACU,YAAY,CAACuB,MAAM,CAACjC;QACzB,IAAI,CAACqC,aAAa,CAACJ,MAAM,CAACjC;IAC5B;IAEA;;;;;GAKC,GACD,MAAMsC,WAAWC,OAA0B,EAAmB;QAC5D,IAAI1C;QAEJ,IAAI0C,QAAQC,GAAG,EAAE;YACf,WAAW;YACX,MAAMC,WAAW,MAAMC,MAAMH,QAAQC,GAAG;YACxC,IAAI,CAACC,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM,CAAC,QAAQ,EAAEL,QAAQC,GAAG,CAAC,EAAE,EAAEC,SAASI,MAAM,CAAC,CAAC,CAAC;YAC/D;YACA,MAAMC,eAAe,MAAML,SAASM,IAAI;YACxClD,SAASiD,aAAaE,OAAO,IAAIF;QACnC,OAAO,IAAIP,QAAQU,UAAU,EAAE;YAC7B,YAAY;YACZ,MAAMH,eAAe,MAAM,gBAAO,gBAAgB,GAAGP,QAAQU,UAAU,oDAA5C;YAC3BpD,SAASiD,aAAaE,OAAO,IAAIF;QACnC,OAAO;YACL,MAAM,IAAIF,MAAM;QAClB;QAEA,IAAI,CAAC/C,UAAU,CAACA,OAAOG,IAAI,EAAE;YAC3B,MAAM,IAAI4C,MAAM;QAClB;QAEA,YAAY;QACZ,IAAI,IAAI,CAAC9C,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjC,MAAM,IAAI4C,MAAM,CAAC,GAAG,EAAE/C,OAAOG,IAAI,CAAC,IAAI,CAAC;QACzC;QAEA,SAAS;QACT,IAAI,CAACU,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,IAAI;YACF,OAAO;YACP,IAAI,CAACJ,QAAQ,CAACC;YAEd,YAAY;YACZ,IAAI0C,QAAQW,UAAU,IAAIX,QAAQY,WAAW,IAAIZ,QAAQa,YAAY,EAAE;gBACrE,MAAM,IAAI,CAACC,gBAAgB,CAACxD,OAAOG,IAAI,EAAEuC,QAAQa,YAAY,EAAEb,QAAQY,WAAW;YACpF;YAEA,OAAOtD;QACT,EAAE,OAAOyD,OAAO;YACd,IAAI,CAAC5C,YAAY,CAACuB,MAAM,CAACpC,OAAOG,IAAI;YACpC,MAAMsD;QACR;IACF;IAEA;;;;;;GAMC,GACD,MAAMD,iBACJrD,IAAY,EACZuC,OAAqB,EACrBgB,OAA8B,EACf;QACf,MAAM1D,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAI,CAACH,QAAQ;YACX,MAAM,IAAI+C,MAAM,CAAC,GAAG,EAAE5C,KAAK,IAAI,CAAC;QAClC;QAEA,MAAM6C,SAAS,IAAI,CAACnC,YAAY,CAACsB,GAAG,CAAChC;QACrC,IAAI6C,WAAW,eAAe;YAC5B,QAAQ,QAAQ;QAClB;QAEA,IAAI;YACF,MAAMlC,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAAChC;YACnC,IAAI,CAACW,SAAS;gBACZ,MAAM,IAAIiC,MAAM,CAAC,GAAG,EAAE5C,KAAK,OAAO,CAAC;YACrC;YAEA,UAAU;YACV,IAAIH,OAAO2D,IAAI,EAAE;gBACf,MAAMC,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2D,IAAI,CAACC,iBAAiBF,SAAS5C,SAASjB,8BAAc;YACrE;YAEA,IAAI,CAACgB,YAAY,CAACD,GAAG,CAACT,MAAM;QAC9B,EAAE,OAAOsD,OAAO;YACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEtD,KAAK,OAAO,CAAC,EAAEsD;YACnC,MAAMA;QACR;IACF;IAEA;;;;;GAKC,GACD,MAAMK,aAAa3D,IAAY,EAAE4D,QAAiB,KAAK,EAAiB;QACtE,MAAM/D,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAI,CAACH,QAAQ;YACX,MAAM,IAAI+C,MAAM,CAAC,GAAG,EAAE5C,KAAK,IAAI,CAAC;QAClC;QAEA,iBAAiB;QACjB,IAAI,CAAC4D,OAAO;YACV,MAAMC,aAAa9C,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM,IAAIX,MAAM,CACzD,CAACwD,IAAMA,EAAE3D,YAAY,IAAI2D,EAAE3D,YAAY,CAAC4D,QAAQ,CAAC/D;YAEnD,IAAI6D,WAAWzD,MAAM,GAAG,GAAG;gBACzB,MAAM,IAAIwC,MACR,CAAC,OAAO,EAAE5C,KAAK,UAAU,EAAE6D,WAAWG,GAAG,CAAC,CAACF,IAAMA,EAAE9D,IAAI,EAAEQ,IAAI,CAAC,OAAO;YAEzE;QACF;QAEA,SAAS;QACT,IAAIX,OAAOuC,OAAO,EAAE;YAClB,IAAI;gBACF,MAAMvC,OAAOuC,OAAO;YACtB,EAAE,OAAOkB,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEtD,KAAK,kBAAkB,CAAC,EAAEsD;YAChD;QACF;QAEA,oBAAoB;QACpB,2BAA2B;QAC3B,kBAAkB;QAElB,OAAO;QACP,IAAI,CAACnB,UAAU,CAACnC;QAChB,IAAI,CAACU,YAAY,CAACD,GAAG,CAACT,MAAM;IAC9B;IAEA;;;;;GAKC,GACDiE,WAAWpE,MAAc,EAAW;QAClC,aAAa;QACb,IAAIA,OAAOM,YAAY,IAAIN,OAAOM,YAAY,CAACC,MAAM,GAAG,GAAG;YACzD,MAAMC,cAAcR,OAAOM,YAAY,CAACG,MAAM,CAC5C,CAACC,MAAQ,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,CAACQ;YAE7B,IAAIF,YAAYD,MAAM,GAAG,GAAG;gBAC1B,OAAO;YACT;QACF;QACA,OAAO;IACT;IAEA;;;;;GAKC,GACD8D,eAAelE,IAAY,EAAEmE,MAA6B,EAAQ;QAChE,IAAI,CAAC9B,aAAa,CAAC5B,GAAG,CAACT,MAAMmE;IAC/B;IAEA;;;;;;GAMC,GACD,MAAMC,mBACJpE,IAAY,EACZuC,OAAuD,EACtC;QACjB,MAAM4B,SAAS,IAAI,CAAC9B,aAAa,CAACL,GAAG,CAAChC;QACtC,IAAI,CAACmE,QAAQ;YACX,MAAM,IAAIvB,MAAM,CAAC,GAAG,EAAE5C,KAAK,QAAQ,CAAC;QACtC;QAEA,MAAMH,SAAS,MAAMsE;QAErB,IAAI,CAACtE,UAAU,CAACA,OAAOG,IAAI,EAAE;YAC3B,MAAM,IAAI4C,MAAM;QAClB;QAEA,IAAI/C,OAAOG,IAAI,KAAKA,MAAM;YACxB,MAAM,IAAI4C,MAAM,CAAC,YAAY,EAAE5C,KAAK,IAAI,EAAEH,OAAOG,IAAI,EAAE;QACzD;QAEA,YAAY;QACZ,IAAI,IAAI,CAACF,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjC,OAAO,IAAI,CAACF,OAAO,CAACkC,GAAG,CAACnC,OAAOG,IAAI;QACrC;QAEA,SAAS;QACT,IAAI,CAACU,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,IAAI;YACF,OAAO;YACP,IAAI,CAACJ,QAAQ,CAACC;YAEd,YAAY;YACZ,IAAI0C,SAASW,cAAcX,QAAQY,WAAW,IAAIZ,QAAQa,YAAY,EAAE;gBACtE,MAAM,IAAI,CAACC,gBAAgB,CAACxD,OAAOG,IAAI,EAAEuC,QAAQa,YAAY,EAAEb,QAAQY,WAAW;YACpF;YAEA,OAAOtD;QACT,EAAE,OAAOyD,OAAO;YACd,IAAI,CAAC5C,YAAY,CAACuB,MAAM,CAACpC,OAAOG,IAAI;YACpC,MAAMsD;QACR;IACF;IAEA;;GAEC,GACDtB,IAAIhC,IAAY,EAAsB;QACpC,OAAO,IAAI,CAACF,OAAO,CAACkC,GAAG,CAAChC;IAC1B;IAEA;;GAEC,GACDqE,SAAmB;QACjB,OAAOtD,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM;IACvC;IAEA;;;;GAIC,GACD,MAAMqD,kBAAkB/B,OAAqB,EAAiB;QAC5D,MAAMgC,YAAY,IAAI,CAACzD,YAAY;QAEnC,KAAK,MAAMgB,cAAcyC,UAAW;YAClC,MAAM1E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAO2E,UAAU,EAAE;gBACjC;YACF;YAEA,IAAI;gBACF,MAAM7D,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2E,UAAU,CAACf,iBAAiB9C,SAASjB,8BAAc;YAClE,EAAE,OAAO4D,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,qBAAqB,CAAC,EAAEsD;YAC1D;QACF;IACF;IAEA;;;;GAIC,GACD,MAAMmB,YAAYlC,OAAqB,EAAEgB,OAA8B,EAAiB;QACtF,MAAMgB,YAAY,IAAI,CAACzD,YAAY;QAEnC,KAAK,MAAMgB,cAAcyC,UAAW;YAClC,MAAM1E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAO2D,IAAI,EAAE;gBAC3B;YACF;YAEA,IAAI;gBACF,MAAM7C,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2D,IAAI,CAACC,iBAAiBF,SAAS5C,SAASjB,8BAAc;gBACnE,IAAI,CAACgB,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;YACrC,EAAE,OAAOsD,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,eAAe,CAAC,EAAEsD;YACpD;QACF;IACF;IAEA;;;;GAIC,GACD,MAAMoB,iBAAiBnC,OAAqB,EAAEgB,OAA8B,EAAiB;QAC3F,MAAMgB,YAAY,IAAI,CAACzD,YAAY;QACnC,iBAAiB;QACjB,MAAM6D,eAAe;eAAIJ;SAAU,CAACK,OAAO;QAE3C,KAAK,MAAM9C,cAAc6C,aAAc;YACrC,MAAM9E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAOgF,SAAS,EAAE;gBAChC;YACF;YAEA,IAAI;gBACF,MAAMlE,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAOgF,SAAS,CAACpB,iBAAiBF,SAAS5C,SAASjB,8BAAc;YAC1E,EAAE,OAAO4D,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,oBAAoB,CAAC,EAAEsD;YACzD;QACF;IACF;IAEA;;;;;GAKC,GACDwB,gBAAgB9E,IAAY,EAAsE;QAChG,OAAO,IAAI,CAACU,YAAY,CAACsB,GAAG,CAAChC;IAC/B;IAEA;;;;;GAKC,GACD+E,SAAS/E,IAAY,EAAW;QAC9B,OAAO,IAAI,CAACF,OAAO,CAACC,GAAG,CAACC;IAC1B;IAEA;;;;GAIC,GACDgF,mBAA6B;QAC3B,OAAOjE,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmF,IAAI;IACrC;IAEA;;;;GAIC,GACDC,qBAA0F;QACxF,OAAO,IAAIC,IAAI,IAAI,CAACzE,YAAY;IAClC;IAEA;;;;;GAKC,GACD0E,WAAWpF,IAAY,EAA6B;QAClD,OAAO,IAAI,CAACY,SAAS,CAACoB,GAAG,CAAChC;IAC5B;IAEA;;GAEC,GACDqF,cAA8B;QAC5B,OAAO3F,8BAAc;IACvB;IAEA;;GAEC,GACD,MAAM4F,aAA4B;QAChC,KAAK,MAAMzF,UAAU,IAAI,CAACC,OAAO,CAACmB,MAAM,GAAI;YAC1C,IAAIpB,OAAOuC,OAAO,EAAE;gBAClB,IAAI;oBACF,MAAMvC,OAAOuC,OAAO;gBACtB,EAAE,OAAOkB,OAAO;oBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,kBAAkB,CAAC,EAAEsD;gBACvD;YACF;QACF;QACA,IAAI,CAACxD,OAAO,CAACyF,KAAK;IACpB;;QApfA,uBAAQzF,WAA+B,IAAIqF;QAC3C,uBAAQvE,aAAwC,IAAIuE;QACpD,uBAAQzE,gBAAoF,IAAIyE;QAChG,uBAAQ9C,iBAAoD,IAAI8C;;AAkflE;AAKO,MAAMxF,gBAAgB,IAAIJ"}
|