@vlian/framework 1.2.37 → 1.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/Test.cjs +2 -2
- package/dist/core/Test.cjs.map +1 -1
- package/dist/core/Test.js +1 -1
- package/dist/core/Test.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +7 -7
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.js +1 -1
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +6 -6
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +1 -1
- package/dist/core/error/ErrorBoundary.js +2 -2
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +19 -19
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +1 -1
- package/dist/core/error/ErrorHandler.js +2 -2
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/event/AppEventBus.cjs +5 -5
- package/dist/core/event/AppEventBus.cjs.map +1 -1
- package/dist/core/event/AppEventBus.js +1 -1
- package/dist/core/event/AppEventBus.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +3 -3
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +1 -1
- package/dist/core/initialization/initialization.js +1 -1
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/initialization/initializationErrorState.cjs +2 -2
- package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
- package/dist/core/initialization/initializationErrorState.d.ts +1 -1
- package/dist/core/initialization/initializationErrorState.js +1 -1
- package/dist/core/initialization/initializationErrorState.js.map +1 -1
- package/dist/core/kernel/defaultAdapters.cjs +14 -13
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
- package/dist/core/kernel/defaultAdapters.js +2 -1
- package/dist/core/kernel/defaultAdapters.js.map +1 -1
- package/dist/core/kernel/types.d.ts +1 -1
- package/dist/core/kernel/types.js.map +1 -1
- package/dist/core/router/RouterManager.cjs +9 -9
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.js +1 -1
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/AdapterManager.cjs +10 -10
- package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
- package/dist/core/router/adapter/AdapterManager.js +1 -1
- package/dist/core/router/adapter/AdapterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
- package/dist/core/router/errors/RouterError.cjs.map +1 -1
- package/dist/core/router/errors/RouterError.d.ts +4 -3
- package/dist/core/router/errors/RouterError.js.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/auth.cjs +4 -4
- package/dist/core/router/middleware/auth.cjs.map +1 -1
- package/dist/core/router/middleware/auth.js +1 -1
- package/dist/core/router/middleware/auth.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/navigation/RouterNavigation.cjs +7 -7
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.js +1 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +7 -7
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.js +1 -1
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +6 -6
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.js +1 -1
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +2 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +13 -12
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.js +2 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
- package/dist/core/router/version/RouteVersionManager.cjs +6 -6
- package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
- package/dist/core/router/version/RouteVersionManager.js +1 -1
- package/dist/core/router/version/RouteVersionManager.js.map +1 -1
- package/dist/core/splash/SplashScreen.cjs +4 -4
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.js +1 -1
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +14 -14
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +1 -1
- package/dist/core/startup/initializeServices.js +2 -2
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +2 -2
- package/dist/core/startup/renderApp.cjs.map +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 +22 -22
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +2 -2
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +0 -112
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -8
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1389 -1486
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +2 -2
- package/dist/kernel/constants.cjs.map +1 -1
- package/dist/kernel/constants.js +1 -1
- package/dist/kernel/constants.js.map +1 -1
- package/dist/kernel/manager/loggerManager.cjs +10 -10
- package/dist/kernel/manager/loggerManager.cjs.map +1 -1
- package/dist/kernel/manager/loggerManager.d.ts +1 -1
- package/dist/kernel/manager/loggerManager.js +1 -1
- package/dist/kernel/manager/loggerManager.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/kernel/types.js.map +1 -1
- package/dist/library/storage/encryption.cjs +12 -13
- package/dist/library/storage/encryption.cjs.map +1 -1
- package/dist/library/storage/encryption.js +1 -2
- package/dist/library/storage/encryption.js.map +1 -1
- package/dist/state.umd.js +1 -1
- package/dist/utils/errors.cjs +71 -15
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +30 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @vlian/framework v1.2.
|
|
2
|
+
* @vlian/framework v1.2.38
|
|
3
3
|
* Secra Framework - 一个现代化的低代码框架
|
|
4
4
|
* (c) 2026 Secra Framework Contributors
|
|
5
5
|
* Licensed under Apache-2.0
|
|
6
6
|
*/
|
|
7
7
|
(function (global, factory) {
|
|
8
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/utils'), require('@vlian/
|
|
9
|
-
typeof define === 'function' && define.amd ? define(['exports', '@vlian/utils', '@vlian/
|
|
10
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.
|
|
11
|
-
})(this, (function (exports,
|
|
8
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/utils'), require('@vlian/logger'), require('@vlian/monitoring'), require('react/jsx-runtime'), require('react-dom/client'), require('react'), require('react-router-dom'), require('zod'), require('i18next'), require('react-i18next'), require('@vlian/csrf')) :
|
|
9
|
+
typeof define === 'function' && define.amd ? define(['exports', '@vlian/utils', '@vlian/logger', '@vlian/monitoring', 'react/jsx-runtime', 'react-dom/client', 'react', 'react-router-dom', 'zod', 'i18next', 'react-i18next', '@vlian/csrf'], factory) :
|
|
10
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.vlianUtils, global.logger, global.monitoring, global.jsxRuntime, global.ReactDOMClient, global.React, global.ReactRouterDOM, global.z, global.i18next, global.ReactI18next, global.csrf));
|
|
11
|
+
})(this, (function (exports, vlianUtils, logger, monitoring, jsxRuntime, client, React, reactRouterDom, zod, i18n, reactI18next, csrf) { 'use strict';
|
|
12
|
+
|
|
13
|
+
function _interopNamespaceDefault(e) {
|
|
14
|
+
var n = Object.create(null);
|
|
15
|
+
if (e) {
|
|
16
|
+
Object.keys(e).forEach(function (k) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return e[k]; }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
n.default = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var vlianUtils__namespace = /*#__PURE__*/_interopNamespaceDefault(vlianUtils);
|
|
12
31
|
|
|
13
32
|
const local$1 = {
|
|
14
33
|
notfound: {
|
|
@@ -359,17 +378,17 @@
|
|
|
359
378
|
return Storage.instance;
|
|
360
379
|
}
|
|
361
380
|
initialize(options) {
|
|
362
|
-
const local =
|
|
381
|
+
const local = vlianUtils.createStorage({
|
|
363
382
|
type: 'local',
|
|
364
383
|
prefix: options?.prefix || 'vlian',
|
|
365
384
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
366
385
|
});
|
|
367
|
-
const session =
|
|
386
|
+
const session = vlianUtils.createStorage({
|
|
368
387
|
type: 'session',
|
|
369
388
|
prefix: options?.prefix || 'vlian',
|
|
370
389
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
371
390
|
});
|
|
372
|
-
const indexedDB =
|
|
391
|
+
const indexedDB = vlianUtils.createStorage({
|
|
373
392
|
type: 'indexedDB',
|
|
374
393
|
prefix: options?.prefix || 'vlian',
|
|
375
394
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000,
|
|
@@ -417,183 +436,115 @@
|
|
|
417
436
|
const storage = Storage.getInstance();
|
|
418
437
|
|
|
419
438
|
/**
|
|
420
|
-
*
|
|
421
|
-
|
|
439
|
+
* 插件沙箱
|
|
440
|
+
* 用于插件隔离和权限控制
|
|
441
|
+
*/ function _define_property$I(obj, key, value) {
|
|
442
|
+
if (key in obj) {
|
|
443
|
+
Object.defineProperty(obj, key, {
|
|
444
|
+
value: value,
|
|
445
|
+
enumerable: true,
|
|
446
|
+
configurable: true,
|
|
447
|
+
writable: true
|
|
448
|
+
});
|
|
449
|
+
} else {
|
|
450
|
+
obj[key] = value;
|
|
451
|
+
}
|
|
452
|
+
return obj;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* 插件沙箱
|
|
456
|
+
*/ class PluginSandbox {
|
|
422
457
|
/**
|
|
423
|
-
*
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
if (!
|
|
429
|
-
|
|
430
|
-
}
|
|
431
|
-
if (!signature || signature.length === 0) {
|
|
432
|
-
throw new utils.SecurityError('签名不能为空');
|
|
433
|
-
}
|
|
434
|
-
try {
|
|
435
|
-
// 使用 Web Crypto API 验证签名
|
|
436
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
437
|
-
throw new utils.SecurityError('签名验证需要浏览器支持 Web Crypto API');
|
|
438
|
-
}
|
|
439
|
-
// 将配置转换为字符串(用于签名验证)
|
|
440
|
-
// 使用稳定的 JSON 序列化(按键排序)
|
|
441
|
-
const configString = JSON.stringify(config, Object.keys(config).sort());
|
|
442
|
-
const encoder = new TextEncoder();
|
|
443
|
-
const data = encoder.encode(configString);
|
|
444
|
-
// 将签名从 Base64 解码
|
|
445
|
-
const signatureBuffer = Uint8Array.from(atob(signature), (c)=>c.charCodeAt(0));
|
|
446
|
-
// 导入公钥(支持 PEM 格式)
|
|
447
|
-
const algorithm = options.algorithm || 'RSASSA-PKCS1-v1_5';
|
|
448
|
-
let publicKey;
|
|
449
|
-
try {
|
|
450
|
-
// 尝试导入 PEM 格式的公钥
|
|
451
|
-
const pemHeader = '-----BEGIN PUBLIC KEY-----';
|
|
452
|
-
const pemFooter = '-----END PUBLIC KEY-----';
|
|
453
|
-
let pemKey = options.publicKey;
|
|
454
|
-
if (!pemKey.includes(pemHeader)) {
|
|
455
|
-
pemKey = `${pemHeader}\n${pemKey}\n${pemFooter}`;
|
|
456
|
-
}
|
|
457
|
-
// 将 PEM 转换为 ArrayBuffer
|
|
458
|
-
const pemContents = pemKey.replace(pemHeader, '').replace(pemFooter, '').replace(/\s/g, '');
|
|
459
|
-
const binaryDer = Uint8Array.from(atob(pemContents), (c)=>c.charCodeAt(0));
|
|
460
|
-
publicKey = await window.crypto.subtle.importKey('spki', binaryDer.buffer, {
|
|
461
|
-
name: algorithm,
|
|
462
|
-
hash: 'SHA-256'
|
|
463
|
-
}, false, [
|
|
464
|
-
'verify'
|
|
465
|
-
]);
|
|
466
|
-
} catch (importError) {
|
|
467
|
-
throw new utils.SecurityError('公钥导入失败', importError instanceof Error ? importError : undefined);
|
|
468
|
-
}
|
|
469
|
-
// 验证签名
|
|
470
|
-
const isValid = await window.crypto.subtle.verify({
|
|
471
|
-
name: algorithm
|
|
472
|
-
}, publicKey, signatureBuffer, data);
|
|
473
|
-
return isValid;
|
|
474
|
-
} catch (error) {
|
|
475
|
-
if (error instanceof utils.SecurityError) {
|
|
476
|
-
throw error;
|
|
477
|
-
}
|
|
478
|
-
throw new utils.SecurityError('签名验证失败', error instanceof Error ? error : undefined);
|
|
458
|
+
* 检查权限
|
|
459
|
+
*
|
|
460
|
+
* @param permission - 权限
|
|
461
|
+
* @returns 是否有权限
|
|
462
|
+
*/ hasPermission(permission) {
|
|
463
|
+
if (!this.config.strictMode) {
|
|
464
|
+
return true; // 非严格模式,允许所有权限
|
|
479
465
|
}
|
|
466
|
+
return this.permissions.has(permission);
|
|
480
467
|
}
|
|
481
468
|
/**
|
|
482
|
-
*
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
469
|
+
* 检查是否可以访问配置键
|
|
470
|
+
*
|
|
471
|
+
* @param key - 配置键
|
|
472
|
+
* @returns 是否可以访问
|
|
473
|
+
*/ canAccessConfig(key) {
|
|
474
|
+
if (!this.hasPermission("access_config")) {
|
|
475
|
+
return false;
|
|
486
476
|
}
|
|
487
|
-
if (
|
|
488
|
-
return
|
|
477
|
+
if (this.config.configWhitelist && this.config.configWhitelist.length > 0) {
|
|
478
|
+
return this.config.configWhitelist.includes(key);
|
|
489
479
|
}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* 检查是否可以访问状态作用域
|
|
484
|
+
*
|
|
485
|
+
* @param scope - 状态作用域
|
|
486
|
+
* @returns 是否可以访问
|
|
487
|
+
*/ canAccessStateScope(scope) {
|
|
488
|
+
if (!this.hasPermission("access_state_manager")) {
|
|
489
|
+
return false;
|
|
495
490
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
try {
|
|
499
|
-
const refererOrigin = new URL(referer).origin;
|
|
500
|
-
if (options.allowedOrigins.includes(refererOrigin)) {
|
|
501
|
-
return true;
|
|
502
|
-
}
|
|
503
|
-
} catch {
|
|
504
|
-
// Referer 解析失败
|
|
505
|
-
}
|
|
491
|
+
if (this.config.stateScopeWhitelist && this.config.stateScopeWhitelist.length > 0) {
|
|
492
|
+
return this.config.stateScopeWhitelist.includes(scope);
|
|
506
493
|
}
|
|
507
|
-
return
|
|
494
|
+
return true;
|
|
508
495
|
}
|
|
509
496
|
/**
|
|
510
|
-
*
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
if (invalidKeys.length > 0) {
|
|
518
|
-
errors.push(`配置包含不允许的键: ${invalidKeys.join(', ')}`);
|
|
519
|
-
}
|
|
497
|
+
* 过滤配置(根据白名单)
|
|
498
|
+
*
|
|
499
|
+
* @param config - 完整配置
|
|
500
|
+
* @returns 过滤后的配置
|
|
501
|
+
*/ filterConfig(config) {
|
|
502
|
+
if (!this.hasPermission("access_config")) {
|
|
503
|
+
return {};
|
|
520
504
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
const configKeys = Object.keys(config);
|
|
524
|
-
const forbiddenFound = configKeys.filter((key)=>options.forbiddenKeys.includes(key));
|
|
525
|
-
if (forbiddenFound.length > 0) {
|
|
526
|
-
errors.push(`配置包含禁止的键: ${forbiddenFound.join(', ')}`);
|
|
527
|
-
}
|
|
505
|
+
if (!this.config.configWhitelist || this.config.configWhitelist.length === 0) {
|
|
506
|
+
return config;
|
|
528
507
|
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
errors.push(...result.errors);
|
|
508
|
+
const filtered = {};
|
|
509
|
+
for (const key of this.config.configWhitelist){
|
|
510
|
+
if (key in config) {
|
|
511
|
+
filtered[key] = config[key];
|
|
534
512
|
}
|
|
535
513
|
}
|
|
514
|
+
return filtered;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* 获取沙箱配置
|
|
518
|
+
*/ getConfig() {
|
|
536
519
|
return {
|
|
537
|
-
|
|
538
|
-
errors
|
|
520
|
+
...this.config
|
|
539
521
|
};
|
|
540
522
|
}
|
|
541
523
|
/**
|
|
542
|
-
*
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
const validation = utils.SecurityUtils.validateInput(value);
|
|
549
|
-
if (validation.safe && validation.sanitized) {
|
|
550
|
-
sanitized[key] = validation.sanitized;
|
|
551
|
-
} else {
|
|
552
|
-
// 包含危险内容,跳过或记录警告
|
|
553
|
-
console.warn(`配置项 ${key} 包含潜在危险内容,已跳过`);
|
|
554
|
-
}
|
|
555
|
-
} else if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
556
|
-
// 递归清理对象
|
|
557
|
-
sanitized[key] = this.sanitizeConfig(value);
|
|
558
|
-
} else {
|
|
559
|
-
sanitized[key] = value;
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
return sanitized;
|
|
524
|
+
* 更新权限
|
|
525
|
+
*
|
|
526
|
+
* @param permissions - 权限列表
|
|
527
|
+
*/ updatePermissions(permissions) {
|
|
528
|
+
this.permissions = new Set(permissions);
|
|
529
|
+
this.config.permissions = permissions;
|
|
563
530
|
}
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
const originValid = this.verifyOrigin(options.origin);
|
|
571
|
-
if (!originValid) {
|
|
572
|
-
errors.push('配置来源验证失败');
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// 验证白名单
|
|
576
|
-
if (options.whitelist) {
|
|
577
|
-
const whitelistResult = this.verifyWhitelist(config, options.whitelist);
|
|
578
|
-
if (!whitelistResult.valid) {
|
|
579
|
-
errors.push(...whitelistResult.errors);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
// 清理配置(已实现但暂不使用返回值)
|
|
583
|
-
// const sanitizedConfig = this.sanitizeConfig(config);
|
|
584
|
-
return {
|
|
585
|
-
valid: errors.length === 0,
|
|
586
|
-
errors
|
|
531
|
+
constructor(config){
|
|
532
|
+
_define_property$I(this, "config", void 0);
|
|
533
|
+
_define_property$I(this, "permissions", void 0);
|
|
534
|
+
this.config = {
|
|
535
|
+
strictMode: true,
|
|
536
|
+
...config
|
|
587
537
|
};
|
|
538
|
+
this.permissions = new Set(config.permissions || []);
|
|
588
539
|
}
|
|
589
540
|
}
|
|
590
541
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
542
|
+
/**
|
|
543
|
+
* 插件事件总线
|
|
544
|
+
* 用于插件间通信
|
|
545
|
+
*/ /**
|
|
546
|
+
* 事件监听器类型
|
|
547
|
+
*/ function _define_property$H(obj, key, value) {
|
|
597
548
|
if (key in obj) {
|
|
598
549
|
Object.defineProperty(obj, key, {
|
|
599
550
|
value: value,
|
|
@@ -607,227 +558,273 @@
|
|
|
607
558
|
return obj;
|
|
608
559
|
}
|
|
609
560
|
/**
|
|
610
|
-
*
|
|
611
|
-
*/ class
|
|
561
|
+
* 事件总线
|
|
562
|
+
*/ class PluginEventBus {
|
|
612
563
|
/**
|
|
613
|
-
*
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* 停止批量上报定时器
|
|
624
|
-
*/ stopBatchTimer() {
|
|
625
|
-
if (this.batchTimer) {
|
|
626
|
-
clearInterval(this.batchTimer);
|
|
627
|
-
this.batchTimer = null;
|
|
564
|
+
* 订阅事件
|
|
565
|
+
*
|
|
566
|
+
* @param event - 事件名称
|
|
567
|
+
* @param listener - 事件监听器(可以接收 EventWrapper 或直接数据)
|
|
568
|
+
* @returns 取消订阅函数
|
|
569
|
+
*/ on(event, listener) {
|
|
570
|
+
if (!this.listeners.has(event)) {
|
|
571
|
+
this.listeners.set(event, new Set());
|
|
628
572
|
}
|
|
573
|
+
const listeners = this.listeners.get(event);
|
|
574
|
+
listeners.add(listener);
|
|
575
|
+
// 返回取消订阅函数
|
|
576
|
+
return ()=>{
|
|
577
|
+
listeners.delete(listener);
|
|
578
|
+
if (listeners.size === 0) {
|
|
579
|
+
this.listeners.delete(event);
|
|
580
|
+
}
|
|
581
|
+
};
|
|
629
582
|
}
|
|
630
583
|
/**
|
|
631
|
-
*
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
584
|
+
* 取消订阅事件
|
|
585
|
+
*
|
|
586
|
+
* @param event - 事件名称
|
|
587
|
+
* @param listener - 事件监听器
|
|
588
|
+
*/ off(event, listener) {
|
|
589
|
+
const listeners = this.listeners.get(event);
|
|
590
|
+
if (listeners) {
|
|
591
|
+
listeners.delete(listener);
|
|
592
|
+
if (listeners.size === 0) {
|
|
593
|
+
this.listeners.delete(event);
|
|
594
|
+
}
|
|
635
595
|
}
|
|
636
|
-
|
|
637
|
-
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* 发布事件
|
|
599
|
+
*
|
|
600
|
+
* @param event - 事件名称
|
|
601
|
+
* @param data - 事件数据
|
|
602
|
+
* @param metadata - 事件元数据(可选)
|
|
603
|
+
*/ async emit(event, data, metadata) {
|
|
604
|
+
// 事件验证
|
|
605
|
+
if (this.config.enableValidation && !this.config.validator(event, data)) {
|
|
606
|
+
console.warn(`事件 ${event} 验证失败,已忽略`);
|
|
638
607
|
return;
|
|
639
608
|
}
|
|
640
|
-
//
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
timestamp: Date.now(),
|
|
644
|
-
|
|
609
|
+
// 构建事件元数据
|
|
610
|
+
const eventMetadata = {
|
|
611
|
+
source: metadata?.source,
|
|
612
|
+
timestamp: metadata?.timestamp ?? Date.now(),
|
|
613
|
+
eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,
|
|
614
|
+
priority: metadata?.priority ?? 0
|
|
645
615
|
};
|
|
646
|
-
//
|
|
647
|
-
this.
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
616
|
+
// 记录事件历史
|
|
617
|
+
if (this.config.enableTracking) {
|
|
618
|
+
this.eventHistory.push({
|
|
619
|
+
event,
|
|
620
|
+
data,
|
|
621
|
+
metadata: eventMetadata
|
|
622
|
+
});
|
|
623
|
+
// 限制历史记录大小
|
|
624
|
+
if (this.eventHistory.length > this.config.maxHistorySize) {
|
|
625
|
+
this.eventHistory.shift();
|
|
626
|
+
}
|
|
651
627
|
}
|
|
652
|
-
|
|
653
|
-
if (
|
|
654
|
-
|
|
628
|
+
const listeners = this.listeners.get(event);
|
|
629
|
+
if (!listeners || listeners.size === 0) {
|
|
630
|
+
return;
|
|
655
631
|
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
632
|
+
// 创建事件包装器
|
|
633
|
+
const eventWrapper = {
|
|
634
|
+
data: data,
|
|
635
|
+
metadata: eventMetadata
|
|
636
|
+
};
|
|
637
|
+
// 按优先级排序监听器(如果有优先级)
|
|
638
|
+
const sortedListeners = Array.from(listeners);
|
|
639
|
+
// 并行执行所有监听器
|
|
640
|
+
const promises = sortedListeners.map((listener)=>{
|
|
641
|
+
try {
|
|
642
|
+
return Promise.resolve(listener(eventWrapper));
|
|
643
|
+
} catch (error) {
|
|
644
|
+
console.error(`事件 ${event} 的监听器执行失败:`, error);
|
|
645
|
+
return Promise.resolve();
|
|
666
646
|
}
|
|
667
647
|
});
|
|
648
|
+
await Promise.allSettled(promises);
|
|
668
649
|
}
|
|
669
650
|
/**
|
|
670
|
-
*
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
element,
|
|
677
|
-
...properties
|
|
678
|
-
}
|
|
679
|
-
});
|
|
651
|
+
* 发布事件(仅数据,向后兼容)
|
|
652
|
+
*
|
|
653
|
+
* @param event - 事件名称
|
|
654
|
+
* @param data - 事件数据
|
|
655
|
+
*/ async emitData(event, data) {
|
|
656
|
+
return this.emit(event, data);
|
|
680
657
|
}
|
|
681
658
|
/**
|
|
682
|
-
*
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
659
|
+
* 一次性订阅事件
|
|
660
|
+
*
|
|
661
|
+
* @param event - 事件名称
|
|
662
|
+
* @param listener - 事件监听器
|
|
663
|
+
*/ once(event, listener) {
|
|
664
|
+
const wrappedListener = async (data)=>{
|
|
665
|
+
// 处理 EventWrapper 或直接数据
|
|
666
|
+
const actualData = data.data !== undefined ? data.data : data;
|
|
667
|
+
await listener(actualData);
|
|
668
|
+
this.off(event, wrappedListener);
|
|
669
|
+
};
|
|
670
|
+
this.on(event, wrappedListener);
|
|
689
671
|
}
|
|
690
672
|
/**
|
|
691
|
-
*
|
|
692
|
-
*/
|
|
693
|
-
this.
|
|
694
|
-
type: 'error',
|
|
695
|
-
name: 'error',
|
|
696
|
-
properties: {
|
|
697
|
-
errorName: error.name,
|
|
698
|
-
errorMessage: error.message,
|
|
699
|
-
errorStack: error.stack,
|
|
700
|
-
...properties
|
|
701
|
-
}
|
|
702
|
-
});
|
|
673
|
+
* 清空所有事件监听器
|
|
674
|
+
*/ clear() {
|
|
675
|
+
this.listeners.clear();
|
|
703
676
|
}
|
|
704
677
|
/**
|
|
705
|
-
*
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
678
|
+
* 获取事件监听器数量
|
|
679
|
+
*
|
|
680
|
+
* @param event - 事件名称,如果不提供则返回所有事件的监听器总数
|
|
681
|
+
*/ listenerCount(event) {
|
|
682
|
+
if (event) {
|
|
683
|
+
return this.listeners.get(event)?.size || 0;
|
|
684
|
+
}
|
|
685
|
+
let count = 0;
|
|
686
|
+
for (const listeners of this.listeners.values()){
|
|
687
|
+
count += listeners.size;
|
|
688
|
+
}
|
|
689
|
+
return count;
|
|
715
690
|
}
|
|
716
691
|
/**
|
|
717
|
-
*
|
|
718
|
-
*/
|
|
719
|
-
|
|
720
|
-
return properties;
|
|
721
|
-
}
|
|
722
|
-
// 使用深度脱敏处理
|
|
723
|
-
return utils.SecurityUtils.deepSanitize(properties);
|
|
692
|
+
* 获取所有事件名称
|
|
693
|
+
*/ eventNames() {
|
|
694
|
+
return Array.from(this.listeners.keys());
|
|
724
695
|
}
|
|
725
696
|
/**
|
|
726
|
-
*
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
697
|
+
* 获取事件历史记录
|
|
698
|
+
*
|
|
699
|
+
* @param event - 事件名称(可选,如果提供则只返回该事件的历史)
|
|
700
|
+
* @param limit - 限制返回的记录数
|
|
701
|
+
* @returns 事件历史记录
|
|
702
|
+
*/ getEventHistory(event, limit) {
|
|
703
|
+
if (!this.config.enableTracking) {
|
|
704
|
+
return [];
|
|
730
705
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
this.eventQueue = [];
|
|
735
|
-
if (this.config.onBatch) {
|
|
736
|
-
this.config.onBatch(events);
|
|
706
|
+
let history = this.eventHistory;
|
|
707
|
+
if (event) {
|
|
708
|
+
history = history.filter((h)=>h.event === event);
|
|
737
709
|
}
|
|
738
|
-
|
|
710
|
+
if (limit) {
|
|
711
|
+
history = history.slice(-limit);
|
|
712
|
+
}
|
|
713
|
+
return [
|
|
714
|
+
...history
|
|
715
|
+
];
|
|
739
716
|
}
|
|
740
717
|
/**
|
|
741
|
-
*
|
|
742
|
-
*/
|
|
743
|
-
this.
|
|
744
|
-
this.startBatchTimer();
|
|
718
|
+
* 清空事件历史记录
|
|
719
|
+
*/ clearHistory() {
|
|
720
|
+
this.eventHistory = [];
|
|
745
721
|
}
|
|
746
722
|
/**
|
|
747
|
-
*
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
723
|
+
* 请求-响应模式:发送请求并等待响应
|
|
724
|
+
*
|
|
725
|
+
* @param event - 事件名称
|
|
726
|
+
* @param data - 请求数据
|
|
727
|
+
* @param timeout - 超时时间(毫秒)
|
|
728
|
+
* @returns 响应数据
|
|
729
|
+
*/ async request(event, data, timeout = 5000) {
|
|
730
|
+
return new Promise((resolve, reject)=>{
|
|
731
|
+
const responseEvent = `${event}:response`;
|
|
732
|
+
const requestId = `req_${Date.now()}_${Math.random()}`;
|
|
733
|
+
// 设置超时
|
|
734
|
+
const timeoutId = setTimeout(()=>{
|
|
735
|
+
this.off(responseEvent, responseHandler);
|
|
736
|
+
reject(new Error(`请求 ${event} 超时`));
|
|
737
|
+
}, timeout);
|
|
738
|
+
// 响应处理器
|
|
739
|
+
const responseHandler = (response)=>{
|
|
740
|
+
// 处理 EventWrapper 或直接数据
|
|
741
|
+
const actualResponse = response.data !== undefined ? response.data : response;
|
|
742
|
+
if (actualResponse.requestId === requestId) {
|
|
743
|
+
clearTimeout(timeoutId);
|
|
744
|
+
this.off(responseEvent, responseHandler);
|
|
745
|
+
resolve(actualResponse.data);
|
|
746
|
+
}
|
|
747
|
+
};
|
|
748
|
+
// 订阅响应事件
|
|
749
|
+
this.on(responseEvent, responseHandler);
|
|
750
|
+
// 发送请求
|
|
751
|
+
this.emit(`${event}:request`, {
|
|
752
|
+
requestId,
|
|
753
|
+
data
|
|
754
|
+
});
|
|
755
|
+
});
|
|
752
756
|
}
|
|
753
757
|
/**
|
|
754
|
-
*
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
+
* 请求-响应模式:注册请求处理器
|
|
759
|
+
*
|
|
760
|
+
* @param event - 事件名称
|
|
761
|
+
* @param handler - 请求处理器
|
|
762
|
+
* @returns 取消注册函数
|
|
763
|
+
*/ onRequest(event, handler) {
|
|
764
|
+
const requestEvent = `${event}:request`;
|
|
765
|
+
const responseEvent = `${event}:response`;
|
|
766
|
+
return this.on(requestEvent, async (wrapper)=>{
|
|
767
|
+
try {
|
|
768
|
+
// 处理 EventWrapper 或直接数据
|
|
769
|
+
const actualWrapper = wrapper.data !== undefined ? wrapper : {
|
|
770
|
+
data: wrapper,
|
|
771
|
+
metadata: {
|
|
772
|
+
timestamp: Date.now()
|
|
773
|
+
}
|
|
774
|
+
};
|
|
775
|
+
const response = await handler(actualWrapper.data.data, actualWrapper.metadata);
|
|
776
|
+
this.emit(responseEvent, {
|
|
777
|
+
requestId: actualWrapper.data.requestId,
|
|
778
|
+
data: response
|
|
779
|
+
});
|
|
780
|
+
} catch (error) {
|
|
781
|
+
const actualWrapper = wrapper.data !== undefined ? wrapper : {
|
|
782
|
+
data: wrapper
|
|
783
|
+
};
|
|
784
|
+
this.emit(`${responseEvent}:error`, {
|
|
785
|
+
requestId: actualWrapper.data.requestId,
|
|
786
|
+
error: error instanceof Error ? error.message : String(error)
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
});
|
|
758
790
|
}
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
791
|
+
/**
|
|
792
|
+
* 获取配置
|
|
793
|
+
*/ getConfig() {
|
|
794
|
+
return {
|
|
795
|
+
...this.config
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
/**
|
|
799
|
+
* 更新配置
|
|
800
|
+
*/ updateConfig(config) {
|
|
763
801
|
this.config = {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
anonymize: config.anonymize ?? true,
|
|
767
|
-
onEvent: config.onEvent ?? (()=>{}),
|
|
768
|
-
onBatch: config.onBatch ?? (()=>{}),
|
|
769
|
-
batchSize: config.batchSize ?? 10,
|
|
770
|
-
batchInterval: config.batchInterval ?? 5000
|
|
802
|
+
...this.config,
|
|
803
|
+
...config
|
|
771
804
|
};
|
|
772
|
-
if (this.config.enabled) {
|
|
773
|
-
this.startBatchTimer();
|
|
774
|
-
}
|
|
775
805
|
}
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
806
|
+
constructor(config = {}){
|
|
807
|
+
_define_property$H(this, "listeners", new Map());
|
|
808
|
+
_define_property$H(this, "eventHistory", []);
|
|
809
|
+
_define_property$H(this, "config", void 0);
|
|
810
|
+
_define_property$H(this, "eventCounter", 0);
|
|
811
|
+
this.config = {
|
|
812
|
+
enableTracking: config.enableTracking ?? false,
|
|
813
|
+
maxHistorySize: config.maxHistorySize ?? 100,
|
|
814
|
+
enableValidation: config.enableValidation ?? false,
|
|
815
|
+
validator: config.validator ?? (()=>true)
|
|
816
|
+
};
|
|
785
817
|
}
|
|
786
|
-
return defaultAnalyticsService;
|
|
787
818
|
}
|
|
788
819
|
/**
|
|
789
|
-
*
|
|
790
|
-
*/
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
return defaultAnalyticsService;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
var analytics = /*#__PURE__*/Object.freeze({
|
|
798
|
-
__proto__: null,
|
|
799
|
-
AnalyticsService: AnalyticsService,
|
|
800
|
-
getAnalytics: getAnalytics,
|
|
801
|
-
initAnalytics: initAnalytics
|
|
820
|
+
* 全局插件事件总线实例
|
|
821
|
+
*/ const pluginEventBus = new PluginEventBus({
|
|
822
|
+
enableTracking: process.env.NODE_ENV === 'development',
|
|
823
|
+
maxHistorySize: 100,
|
|
824
|
+
enableValidation: false
|
|
802
825
|
});
|
|
803
826
|
|
|
804
|
-
|
|
805
|
-
* 等待指定时间后解析的 Promise 工具函数
|
|
806
|
-
*
|
|
807
|
-
* @param time - 等待时间(毫秒),默认为 100 毫秒
|
|
808
|
-
* @returns 返回一个 Promise,在指定时间后解析为 true
|
|
809
|
-
*
|
|
810
|
-
* @example
|
|
811
|
-
* ```typescript
|
|
812
|
-
* // 等待 500 毫秒
|
|
813
|
-
* await waitTime(500);
|
|
814
|
-
*
|
|
815
|
-
* // 使用默认等待时间(100 毫秒)
|
|
816
|
-
* await waitTime();
|
|
817
|
-
* ```
|
|
818
|
-
* @deprecated 建议使用基于实际完成状态的机制,而不是固定等待时间
|
|
819
|
-
*/ const waitTime = (time = 100)=>{
|
|
820
|
-
return new Promise((resolve)=>{
|
|
821
|
-
setTimeout(()=>{
|
|
822
|
-
resolve(true);
|
|
823
|
-
}, time);
|
|
824
|
-
});
|
|
825
|
-
};
|
|
826
|
-
|
|
827
|
-
/**
|
|
828
|
-
* 插件沙箱
|
|
829
|
-
* 用于插件隔离和权限控制
|
|
830
|
-
*/ function _define_property$H(obj, key, value) {
|
|
827
|
+
function _define_property$G(obj, key, value) {
|
|
831
828
|
if (key in obj) {
|
|
832
829
|
Object.defineProperty(obj, key, {
|
|
833
830
|
value: value,
|
|
@@ -841,804 +838,418 @@
|
|
|
841
838
|
return obj;
|
|
842
839
|
}
|
|
843
840
|
/**
|
|
844
|
-
*
|
|
845
|
-
|
|
841
|
+
* 插件管理器
|
|
842
|
+
*
|
|
843
|
+
* 优化:
|
|
844
|
+
* 1. 支持插件依赖管理
|
|
845
|
+
* 2. 支持插件优先级控制
|
|
846
|
+
* 3. 支持插件生命周期管理
|
|
847
|
+
* 4. 支持插件热插拔(动态加载/卸载)
|
|
848
|
+
*/ class PluginManager {
|
|
846
849
|
/**
|
|
847
|
-
*
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
return true; // 非严格模式,允许所有权限
|
|
850
|
+
* 注册插件
|
|
851
|
+
*
|
|
852
|
+
* 优化:检查插件依赖是否已注册
|
|
853
|
+
*/ register(plugin) {
|
|
854
|
+
if (this.plugins.has(plugin.name)) {
|
|
855
|
+
console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);
|
|
854
856
|
}
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
* @returns 是否可以访问
|
|
862
|
-
*/ canAccessConfig(key) {
|
|
863
|
-
if (!this.hasPermission("access_config")) {
|
|
864
|
-
return false;
|
|
857
|
+
// 检查依赖是否已注册
|
|
858
|
+
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
859
|
+
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
860
|
+
if (missingDeps.length > 0) {
|
|
861
|
+
console.warn(`插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`);
|
|
862
|
+
}
|
|
865
863
|
}
|
|
866
|
-
|
|
867
|
-
|
|
864
|
+
this.plugins.set(plugin.name, plugin);
|
|
865
|
+
this.pluginStatus.set(plugin.name, 'registered');
|
|
866
|
+
// 创建插件沙箱
|
|
867
|
+
if (plugin.sandbox) {
|
|
868
|
+
const sandbox = new PluginSandbox({
|
|
869
|
+
...plugin.sandbox,
|
|
870
|
+
name: plugin.name
|
|
871
|
+
});
|
|
872
|
+
this.sandboxes.set(plugin.name, sandbox);
|
|
873
|
+
} else {
|
|
874
|
+
// 如果没有配置沙箱,创建默认沙箱(非严格模式)
|
|
875
|
+
const sandbox = new PluginSandbox({
|
|
876
|
+
strictMode: false,
|
|
877
|
+
name: plugin.name
|
|
878
|
+
});
|
|
879
|
+
this.sandboxes.set(plugin.name, sandbox);
|
|
868
880
|
}
|
|
869
|
-
return true;
|
|
870
881
|
}
|
|
871
882
|
/**
|
|
872
|
-
*
|
|
873
|
-
*
|
|
874
|
-
* @
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
return
|
|
883
|
+
* 获取插件加载顺序(考虑依赖和优先级)
|
|
884
|
+
*
|
|
885
|
+
* @returns 插件名称数组,按加载顺序排列
|
|
886
|
+
*/ getLoadOrder() {
|
|
887
|
+
const plugins = Array.from(this.plugins.values());
|
|
888
|
+
// 按优先级排序
|
|
889
|
+
const sortedPlugins = plugins.sort((a, b)=>{
|
|
890
|
+
const priorityA = a.priority ?? 100;
|
|
891
|
+
const priorityB = b.priority ?? 100;
|
|
892
|
+
return priorityA - priorityB;
|
|
893
|
+
});
|
|
894
|
+
// 构建依赖图并拓扑排序
|
|
895
|
+
const visited = new Set();
|
|
896
|
+
const visiting = new Set();
|
|
897
|
+
const result = [];
|
|
898
|
+
const visit = (pluginName)=>{
|
|
899
|
+
if (visiting.has(pluginName)) {
|
|
900
|
+
console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
903
|
+
if (visited.has(pluginName)) {
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
visiting.add(pluginName);
|
|
907
|
+
const plugin = this.plugins.get(pluginName);
|
|
908
|
+
if (plugin?.dependencies) {
|
|
909
|
+
for (const dep of plugin.dependencies){
|
|
910
|
+
visit(dep);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
visiting.delete(pluginName);
|
|
914
|
+
visited.add(pluginName);
|
|
915
|
+
result.push(pluginName);
|
|
916
|
+
};
|
|
917
|
+
for (const plugin of sortedPlugins){
|
|
918
|
+
visit(plugin.name);
|
|
882
919
|
}
|
|
883
|
-
return
|
|
920
|
+
return result;
|
|
884
921
|
}
|
|
885
922
|
/**
|
|
886
|
-
*
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
if (!this.hasPermission("access_config")) {
|
|
892
|
-
return {};
|
|
893
|
-
}
|
|
894
|
-
if (!this.config.configWhitelist || this.config.configWhitelist.length === 0) {
|
|
895
|
-
return config;
|
|
896
|
-
}
|
|
897
|
-
const filtered = {};
|
|
898
|
-
for (const key of this.config.configWhitelist){
|
|
899
|
-
if (key in config) {
|
|
900
|
-
filtered[key] = config[key];
|
|
901
|
-
}
|
|
923
|
+
* 注销插件
|
|
924
|
+
*/ unregister(name) {
|
|
925
|
+
const plugin = this.plugins.get(name);
|
|
926
|
+
if (plugin && plugin.destroy) {
|
|
927
|
+
plugin.destroy();
|
|
902
928
|
}
|
|
903
|
-
|
|
929
|
+
this.plugins.delete(name);
|
|
930
|
+
this.sandboxes.delete(name);
|
|
931
|
+
this.pluginStatus.delete(name);
|
|
932
|
+
this.pluginLoaders.delete(name);
|
|
904
933
|
}
|
|
905
934
|
/**
|
|
906
|
-
*
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
};
|
|
927
|
-
this.permissions = new Set(config.permissions || []);
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
/**
|
|
932
|
-
* 插件事件总线
|
|
933
|
-
* 用于插件间通信
|
|
934
|
-
*/ /**
|
|
935
|
-
* 事件监听器类型
|
|
936
|
-
*/ function _define_property$G(obj, key, value) {
|
|
937
|
-
if (key in obj) {
|
|
938
|
-
Object.defineProperty(obj, key, {
|
|
939
|
-
value: value,
|
|
940
|
-
enumerable: true,
|
|
941
|
-
configurable: true,
|
|
942
|
-
writable: true
|
|
943
|
-
});
|
|
944
|
-
} else {
|
|
945
|
-
obj[key] = value;
|
|
946
|
-
}
|
|
947
|
-
return obj;
|
|
948
|
-
}
|
|
949
|
-
/**
|
|
950
|
-
* 事件总线
|
|
951
|
-
*/ class PluginEventBus {
|
|
952
|
-
/**
|
|
953
|
-
* 订阅事件
|
|
954
|
-
*
|
|
955
|
-
* @param event - 事件名称
|
|
956
|
-
* @param listener - 事件监听器(可以接收 EventWrapper 或直接数据)
|
|
957
|
-
* @returns 取消订阅函数
|
|
958
|
-
*/ on(event, listener) {
|
|
959
|
-
if (!this.listeners.has(event)) {
|
|
960
|
-
this.listeners.set(event, new Set());
|
|
935
|
+
* 动态加载插件(热插拔)
|
|
936
|
+
*
|
|
937
|
+
* @param options - 插件加载选项
|
|
938
|
+
* @returns 加载的插件
|
|
939
|
+
*/ async loadPlugin(options) {
|
|
940
|
+
let plugin;
|
|
941
|
+
if (options.url) {
|
|
942
|
+
// 从URL加载插件
|
|
943
|
+
const response = await fetch(options.url);
|
|
944
|
+
if (!response.ok) {
|
|
945
|
+
throw new Error(`无法加载插件: ${options.url} (${response.status})`);
|
|
946
|
+
}
|
|
947
|
+
const pluginModule = await response.json();
|
|
948
|
+
plugin = pluginModule.default || pluginModule;
|
|
949
|
+
} else if (options.modulePath) {
|
|
950
|
+
// 从模块路径动态导入
|
|
951
|
+
const pluginModule = await import(/* @vite-ignore */ options.modulePath);
|
|
952
|
+
plugin = pluginModule.default || pluginModule;
|
|
953
|
+
} else {
|
|
954
|
+
throw new Error('必须提供 url 或 modulePath');
|
|
961
955
|
}
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
956
|
+
if (!plugin || !plugin.name) {
|
|
957
|
+
throw new Error('插件格式无效:必须包含 name 属性');
|
|
958
|
+
}
|
|
959
|
+
// 检查插件是否已加载
|
|
960
|
+
if (this.plugins.has(plugin.name)) {
|
|
961
|
+
throw new Error(`插件 ${plugin.name} 已加载`);
|
|
962
|
+
}
|
|
963
|
+
// 设置加载状态
|
|
964
|
+
this.pluginStatus.set(plugin.name, 'loading');
|
|
965
|
+
try {
|
|
966
|
+
// 注册插件
|
|
967
|
+
this.register(plugin);
|
|
968
|
+
// 如果要求立即初始化
|
|
969
|
+
if (options.initialize && options.initContext && options.startOptions) {
|
|
970
|
+
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
969
971
|
}
|
|
970
|
-
|
|
972
|
+
return plugin;
|
|
973
|
+
} catch (error) {
|
|
974
|
+
this.pluginStatus.delete(plugin.name);
|
|
975
|
+
throw error;
|
|
976
|
+
}
|
|
971
977
|
}
|
|
972
978
|
/**
|
|
973
|
-
*
|
|
974
|
-
*
|
|
975
|
-
* @param
|
|
976
|
-
* @param
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
979
|
+
* 初始化单个插件
|
|
980
|
+
*
|
|
981
|
+
* @param name - 插件名称
|
|
982
|
+
* @param options - 启动选项
|
|
983
|
+
* @param context - 初始化上下文
|
|
984
|
+
*/ async initializePlugin(name, options, context) {
|
|
985
|
+
const plugin = this.plugins.get(name);
|
|
986
|
+
if (!plugin) {
|
|
987
|
+
throw new Error(`插件 ${name} 未注册`);
|
|
988
|
+
}
|
|
989
|
+
const status = this.pluginStatus.get(name);
|
|
990
|
+
if (status === 'initialized') {
|
|
991
|
+
return; // 已经初始化
|
|
992
|
+
}
|
|
993
|
+
try {
|
|
994
|
+
const sandbox = this.sandboxes.get(name);
|
|
995
|
+
if (!sandbox) {
|
|
996
|
+
throw new Error(`插件 ${name} 的沙箱未找到`);
|
|
997
|
+
}
|
|
998
|
+
// 执行初始化钩子
|
|
999
|
+
if (plugin.init) {
|
|
1000
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1001
|
+
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
983
1002
|
}
|
|
1003
|
+
this.pluginStatus.set(name, 'initialized');
|
|
1004
|
+
} catch (error) {
|
|
1005
|
+
console.error(`插件 ${name} 初始化失败:`, error);
|
|
1006
|
+
throw error;
|
|
984
1007
|
}
|
|
985
1008
|
}
|
|
986
1009
|
/**
|
|
987
|
-
*
|
|
988
|
-
*
|
|
989
|
-
* @param
|
|
990
|
-
* @param
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
console.warn(`事件 ${event} 验证失败,已忽略`);
|
|
996
|
-
return;
|
|
1010
|
+
* 卸载插件(热插拔)
|
|
1011
|
+
*
|
|
1012
|
+
* @param name - 插件名称
|
|
1013
|
+
* @param force - 是否强制卸载(即使有依赖)
|
|
1014
|
+
*/ async unloadPlugin(name, force = false) {
|
|
1015
|
+
const plugin = this.plugins.get(name);
|
|
1016
|
+
if (!plugin) {
|
|
1017
|
+
throw new Error(`插件 ${name} 未加载`);
|
|
997
1018
|
}
|
|
998
|
-
//
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
priority: metadata?.priority ?? 0
|
|
1004
|
-
};
|
|
1005
|
-
// 记录事件历史
|
|
1006
|
-
if (this.config.enableTracking) {
|
|
1007
|
-
this.eventHistory.push({
|
|
1008
|
-
event,
|
|
1009
|
-
data,
|
|
1010
|
-
metadata: eventMetadata
|
|
1011
|
-
});
|
|
1012
|
-
// 限制历史记录大小
|
|
1013
|
-
if (this.eventHistory.length > this.config.maxHistorySize) {
|
|
1014
|
-
this.eventHistory.shift();
|
|
1019
|
+
// 检查是否有其他插件依赖此插件
|
|
1020
|
+
if (!force) {
|
|
1021
|
+
const dependents = Array.from(this.plugins.values()).filter((p)=>p.dependencies && p.dependencies.includes(name));
|
|
1022
|
+
if (dependents.length > 0) {
|
|
1023
|
+
throw new Error(`无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p)=>p.name).join(', ')}`);
|
|
1015
1024
|
}
|
|
1016
1025
|
}
|
|
1017
|
-
|
|
1018
|
-
if (
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1021
|
-
// 创建事件包装器
|
|
1022
|
-
const eventWrapper = {
|
|
1023
|
-
data: data,
|
|
1024
|
-
metadata: eventMetadata
|
|
1025
|
-
};
|
|
1026
|
-
// 按优先级排序监听器(如果有优先级)
|
|
1027
|
-
const sortedListeners = Array.from(listeners);
|
|
1028
|
-
// 并行执行所有监听器
|
|
1029
|
-
const promises = sortedListeners.map((listener)=>{
|
|
1026
|
+
// 执行销毁钩子
|
|
1027
|
+
if (plugin.destroy) {
|
|
1030
1028
|
try {
|
|
1031
|
-
|
|
1029
|
+
await plugin.destroy();
|
|
1032
1030
|
} catch (error) {
|
|
1033
|
-
console.error(
|
|
1034
|
-
return Promise.resolve();
|
|
1031
|
+
console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);
|
|
1035
1032
|
}
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
* @param data - 事件数据
|
|
1044
|
-
*/ async emitData(event, data) {
|
|
1045
|
-
return this.emit(event, data);
|
|
1033
|
+
}
|
|
1034
|
+
// 从事件总线移除相关监听器(如果有)
|
|
1035
|
+
// 注意:事件总线是全局的,这里只移除插件相关的事件
|
|
1036
|
+
// 实际实现可能需要更细粒度的控制
|
|
1037
|
+
// 清理插件
|
|
1038
|
+
this.unregister(name);
|
|
1039
|
+
this.pluginStatus.set(name, 'destroyed');
|
|
1046
1040
|
}
|
|
1047
1041
|
/**
|
|
1048
|
-
*
|
|
1049
|
-
*
|
|
1050
|
-
* @param
|
|
1051
|
-
* @
|
|
1052
|
-
*/
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
const
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1042
|
+
* 检查插件是否可以热加载
|
|
1043
|
+
*
|
|
1044
|
+
* @param plugin - 插件
|
|
1045
|
+
* @returns 是否可以热加载
|
|
1046
|
+
*/ canHotLoad(plugin) {
|
|
1047
|
+
// 检查依赖是否都已加载
|
|
1048
|
+
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
1049
|
+
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
1050
|
+
if (missingDeps.length > 0) {
|
|
1051
|
+
return false;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
return true;
|
|
1060
1055
|
}
|
|
1061
1056
|
/**
|
|
1062
|
-
*
|
|
1063
|
-
|
|
1064
|
-
|
|
1057
|
+
* 注册插件加载器(用于延迟加载)
|
|
1058
|
+
*
|
|
1059
|
+
* @param name - 插件名称
|
|
1060
|
+
* @param loader - 加载器函数
|
|
1061
|
+
*/ registerLoader(name, loader) {
|
|
1062
|
+
this.pluginLoaders.set(name, loader);
|
|
1065
1063
|
}
|
|
1066
1064
|
/**
|
|
1067
|
-
*
|
|
1068
|
-
*
|
|
1069
|
-
* @param
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
count += listeners.size;
|
|
1065
|
+
* 使用加载器加载插件
|
|
1066
|
+
*
|
|
1067
|
+
* @param name - 插件名称
|
|
1068
|
+
* @param options - 加载选项
|
|
1069
|
+
* @returns 加载的插件
|
|
1070
|
+
*/ async loadPluginByLoader(name, options) {
|
|
1071
|
+
const loader = this.pluginLoaders.get(name);
|
|
1072
|
+
if (!loader) {
|
|
1073
|
+
throw new Error(`插件 ${name} 的加载器未注册`);
|
|
1077
1074
|
}
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
* 获取所有事件名称
|
|
1082
|
-
*/ eventNames() {
|
|
1083
|
-
return Array.from(this.listeners.keys());
|
|
1084
|
-
}
|
|
1085
|
-
/**
|
|
1086
|
-
* 获取事件历史记录
|
|
1087
|
-
*
|
|
1088
|
-
* @param event - 事件名称(可选,如果提供则只返回该事件的历史)
|
|
1089
|
-
* @param limit - 限制返回的记录数
|
|
1090
|
-
* @returns 事件历史记录
|
|
1091
|
-
*/ getEventHistory(event, limit) {
|
|
1092
|
-
if (!this.config.enableTracking) {
|
|
1093
|
-
return [];
|
|
1075
|
+
const plugin = await loader();
|
|
1076
|
+
if (!plugin || !plugin.name) {
|
|
1077
|
+
throw new Error('插件格式无效:必须包含 name 属性');
|
|
1094
1078
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
history = history.filter((h)=>h.event === event);
|
|
1079
|
+
if (plugin.name !== name) {
|
|
1080
|
+
throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);
|
|
1098
1081
|
}
|
|
1099
|
-
|
|
1100
|
-
|
|
1082
|
+
// 检查插件是否已加载
|
|
1083
|
+
if (this.plugins.has(plugin.name)) {
|
|
1084
|
+
return this.plugins.get(plugin.name);
|
|
1085
|
+
}
|
|
1086
|
+
// 设置加载状态
|
|
1087
|
+
this.pluginStatus.set(plugin.name, 'loading');
|
|
1088
|
+
try {
|
|
1089
|
+
// 注册插件
|
|
1090
|
+
this.register(plugin);
|
|
1091
|
+
// 如果要求立即初始化
|
|
1092
|
+
if (options?.initialize && options.initContext && options.startOptions) {
|
|
1093
|
+
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1094
|
+
}
|
|
1095
|
+
return plugin;
|
|
1096
|
+
} catch (error) {
|
|
1097
|
+
this.pluginStatus.delete(plugin.name);
|
|
1098
|
+
throw error;
|
|
1101
1099
|
}
|
|
1102
|
-
return [
|
|
1103
|
-
...history
|
|
1104
|
-
];
|
|
1105
1100
|
}
|
|
1106
1101
|
/**
|
|
1107
|
-
*
|
|
1108
|
-
*/
|
|
1109
|
-
this.
|
|
1102
|
+
* 获取插件
|
|
1103
|
+
*/ get(name) {
|
|
1104
|
+
return this.plugins.get(name);
|
|
1110
1105
|
}
|
|
1111
1106
|
/**
|
|
1112
|
-
*
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
* @param data - 请求数据
|
|
1116
|
-
* @param timeout - 超时时间(毫秒)
|
|
1117
|
-
* @returns 响应数据
|
|
1118
|
-
*/ async request(event, data, timeout = 5000) {
|
|
1119
|
-
return new Promise((resolve, reject)=>{
|
|
1120
|
-
const responseEvent = `${event}:response`;
|
|
1121
|
-
const requestId = `req_${Date.now()}_${Math.random()}`;
|
|
1122
|
-
// 设置超时
|
|
1123
|
-
const timeoutId = setTimeout(()=>{
|
|
1124
|
-
this.off(responseEvent, responseHandler);
|
|
1125
|
-
reject(new Error(`请求 ${event} 超时`));
|
|
1126
|
-
}, timeout);
|
|
1127
|
-
// 响应处理器
|
|
1128
|
-
const responseHandler = (response)=>{
|
|
1129
|
-
// 处理 EventWrapper 或直接数据
|
|
1130
|
-
const actualResponse = response.data !== undefined ? response.data : response;
|
|
1131
|
-
if (actualResponse.requestId === requestId) {
|
|
1132
|
-
clearTimeout(timeoutId);
|
|
1133
|
-
this.off(responseEvent, responseHandler);
|
|
1134
|
-
resolve(actualResponse.data);
|
|
1135
|
-
}
|
|
1136
|
-
};
|
|
1137
|
-
// 订阅响应事件
|
|
1138
|
-
this.on(responseEvent, responseHandler);
|
|
1139
|
-
// 发送请求
|
|
1140
|
-
this.emit(`${event}:request`, {
|
|
1141
|
-
requestId,
|
|
1142
|
-
data
|
|
1143
|
-
});
|
|
1144
|
-
});
|
|
1107
|
+
* 获取所有插件
|
|
1108
|
+
*/ getAll() {
|
|
1109
|
+
return Array.from(this.plugins.values());
|
|
1145
1110
|
}
|
|
1146
1111
|
/**
|
|
1147
|
-
*
|
|
1148
|
-
*
|
|
1149
|
-
*
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1112
|
+
* 执行初始化前钩子
|
|
1113
|
+
*
|
|
1114
|
+
* 优化:按依赖顺序执行
|
|
1115
|
+
*/ async executeBeforeInit(options) {
|
|
1116
|
+
const loadOrder = this.getLoadOrder();
|
|
1117
|
+
for (const pluginName of loadOrder){
|
|
1118
|
+
const plugin = this.plugins.get(pluginName);
|
|
1119
|
+
if (!plugin || !plugin.beforeInit) {
|
|
1120
|
+
continue;
|
|
1121
|
+
}
|
|
1156
1122
|
try {
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
this.emit(responseEvent, {
|
|
1166
|
-
requestId: actualWrapper.data.requestId,
|
|
1167
|
-
data: response
|
|
1168
|
-
});
|
|
1123
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1124
|
+
if (!sandbox) {
|
|
1125
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1126
|
+
continue;
|
|
1127
|
+
}
|
|
1128
|
+
// 根据沙箱配置过滤选项
|
|
1129
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1130
|
+
await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);
|
|
1169
1131
|
} catch (error) {
|
|
1170
|
-
|
|
1171
|
-
data: wrapper
|
|
1172
|
-
};
|
|
1173
|
-
this.emit(`${responseEvent}:error`, {
|
|
1174
|
-
requestId: actualWrapper.data.requestId,
|
|
1175
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1176
|
-
});
|
|
1132
|
+
console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);
|
|
1177
1133
|
}
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
/**
|
|
1181
|
-
* 获取配置
|
|
1182
|
-
*/ getConfig() {
|
|
1183
|
-
return {
|
|
1184
|
-
...this.config
|
|
1185
|
-
};
|
|
1186
|
-
}
|
|
1187
|
-
/**
|
|
1188
|
-
* 更新配置
|
|
1189
|
-
*/ updateConfig(config) {
|
|
1190
|
-
this.config = {
|
|
1191
|
-
...this.config,
|
|
1192
|
-
...config
|
|
1193
|
-
};
|
|
1194
|
-
}
|
|
1195
|
-
constructor(config = {}){
|
|
1196
|
-
_define_property$G(this, "listeners", new Map());
|
|
1197
|
-
_define_property$G(this, "eventHistory", []);
|
|
1198
|
-
_define_property$G(this, "config", void 0);
|
|
1199
|
-
_define_property$G(this, "eventCounter", 0);
|
|
1200
|
-
this.config = {
|
|
1201
|
-
enableTracking: config.enableTracking ?? false,
|
|
1202
|
-
maxHistorySize: config.maxHistorySize ?? 100,
|
|
1203
|
-
enableValidation: config.enableValidation ?? false,
|
|
1204
|
-
validator: config.validator ?? (()=>true)
|
|
1205
|
-
};
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
/**
|
|
1209
|
-
* 全局插件事件总线实例
|
|
1210
|
-
*/ const pluginEventBus = new PluginEventBus({
|
|
1211
|
-
enableTracking: process.env.NODE_ENV === 'development',
|
|
1212
|
-
maxHistorySize: 100,
|
|
1213
|
-
enableValidation: false
|
|
1214
|
-
});
|
|
1215
|
-
|
|
1216
|
-
function _define_property$F(obj, key, value) {
|
|
1217
|
-
if (key in obj) {
|
|
1218
|
-
Object.defineProperty(obj, key, {
|
|
1219
|
-
value: value,
|
|
1220
|
-
enumerable: true,
|
|
1221
|
-
configurable: true,
|
|
1222
|
-
writable: true
|
|
1223
|
-
});
|
|
1224
|
-
} else {
|
|
1225
|
-
obj[key] = value;
|
|
1134
|
+
}
|
|
1226
1135
|
}
|
|
1227
|
-
return obj;
|
|
1228
|
-
}
|
|
1229
|
-
/**
|
|
1230
|
-
* 插件管理器
|
|
1231
|
-
*
|
|
1232
|
-
* 优化:
|
|
1233
|
-
* 1. 支持插件依赖管理
|
|
1234
|
-
* 2. 支持插件优先级控制
|
|
1235
|
-
* 3. 支持插件生命周期管理
|
|
1236
|
-
* 4. 支持插件热插拔(动态加载/卸载)
|
|
1237
|
-
*/ class PluginManager {
|
|
1238
1136
|
/**
|
|
1239
|
-
*
|
|
1137
|
+
* 执行初始化钩子
|
|
1240
1138
|
*
|
|
1241
|
-
*
|
|
1242
|
-
*/
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1139
|
+
* 优化:按依赖顺序执行,并更新插件状态
|
|
1140
|
+
*/ async executeInit(options, context) {
|
|
1141
|
+
const loadOrder = this.getLoadOrder();
|
|
1142
|
+
for (const pluginName of loadOrder){
|
|
1143
|
+
const plugin = this.plugins.get(pluginName);
|
|
1144
|
+
if (!plugin || !plugin.init) {
|
|
1145
|
+
continue;
|
|
1146
|
+
}
|
|
1147
|
+
try {
|
|
1148
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1149
|
+
if (!sandbox) {
|
|
1150
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1151
|
+
continue;
|
|
1152
|
+
}
|
|
1153
|
+
// 根据沙箱配置过滤选项
|
|
1154
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1155
|
+
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1156
|
+
this.pluginStatus.set(plugin.name, 'initialized');
|
|
1157
|
+
} catch (error) {
|
|
1158
|
+
console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);
|
|
1251
1159
|
}
|
|
1252
|
-
}
|
|
1253
|
-
this.plugins.set(plugin.name, plugin);
|
|
1254
|
-
this.pluginStatus.set(plugin.name, 'registered');
|
|
1255
|
-
// 创建插件沙箱
|
|
1256
|
-
if (plugin.sandbox) {
|
|
1257
|
-
const sandbox = new PluginSandbox({
|
|
1258
|
-
...plugin.sandbox,
|
|
1259
|
-
name: plugin.name
|
|
1260
|
-
});
|
|
1261
|
-
this.sandboxes.set(plugin.name, sandbox);
|
|
1262
|
-
} else {
|
|
1263
|
-
// 如果没有配置沙箱,创建默认沙箱(非严格模式)
|
|
1264
|
-
const sandbox = new PluginSandbox({
|
|
1265
|
-
strictMode: false,
|
|
1266
|
-
name: plugin.name
|
|
1267
|
-
});
|
|
1268
|
-
this.sandboxes.set(plugin.name, sandbox);
|
|
1269
1160
|
}
|
|
1270
1161
|
}
|
|
1271
1162
|
/**
|
|
1272
|
-
*
|
|
1163
|
+
* 执行初始化后钩子
|
|
1273
1164
|
*
|
|
1274
|
-
*
|
|
1275
|
-
*/
|
|
1276
|
-
const
|
|
1277
|
-
//
|
|
1278
|
-
const
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
});
|
|
1283
|
-
// 构建依赖图并拓扑排序
|
|
1284
|
-
const visited = new Set();
|
|
1285
|
-
const visiting = new Set();
|
|
1286
|
-
const result = [];
|
|
1287
|
-
const visit = (pluginName)=>{
|
|
1288
|
-
if (visiting.has(pluginName)) {
|
|
1289
|
-
console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);
|
|
1290
|
-
return;
|
|
1291
|
-
}
|
|
1292
|
-
if (visited.has(pluginName)) {
|
|
1293
|
-
return;
|
|
1294
|
-
}
|
|
1295
|
-
visiting.add(pluginName);
|
|
1165
|
+
* 优化:按依赖顺序执行(逆序,确保依赖插件先执行)
|
|
1166
|
+
*/ async executeAfterInit(options, context) {
|
|
1167
|
+
const loadOrder = this.getLoadOrder();
|
|
1168
|
+
// 逆序执行,确保依赖插件先执行
|
|
1169
|
+
const reverseOrder = [
|
|
1170
|
+
...loadOrder
|
|
1171
|
+
].reverse();
|
|
1172
|
+
for (const pluginName of reverseOrder){
|
|
1296
1173
|
const plugin = this.plugins.get(pluginName);
|
|
1297
|
-
if (plugin
|
|
1298
|
-
|
|
1299
|
-
visit(dep);
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
visiting.delete(pluginName);
|
|
1303
|
-
visited.add(pluginName);
|
|
1304
|
-
result.push(pluginName);
|
|
1305
|
-
};
|
|
1306
|
-
for (const plugin of sortedPlugins){
|
|
1307
|
-
visit(plugin.name);
|
|
1308
|
-
}
|
|
1309
|
-
return result;
|
|
1310
|
-
}
|
|
1311
|
-
/**
|
|
1312
|
-
* 注销插件
|
|
1313
|
-
*/ unregister(name) {
|
|
1314
|
-
const plugin = this.plugins.get(name);
|
|
1315
|
-
if (plugin && plugin.destroy) {
|
|
1316
|
-
plugin.destroy();
|
|
1317
|
-
}
|
|
1318
|
-
this.plugins.delete(name);
|
|
1319
|
-
this.sandboxes.delete(name);
|
|
1320
|
-
this.pluginStatus.delete(name);
|
|
1321
|
-
this.pluginLoaders.delete(name);
|
|
1322
|
-
}
|
|
1323
|
-
/**
|
|
1324
|
-
* 动态加载插件(热插拔)
|
|
1325
|
-
*
|
|
1326
|
-
* @param options - 插件加载选项
|
|
1327
|
-
* @returns 加载的插件
|
|
1328
|
-
*/ async loadPlugin(options) {
|
|
1329
|
-
let plugin;
|
|
1330
|
-
if (options.url) {
|
|
1331
|
-
// 从URL加载插件
|
|
1332
|
-
const response = await fetch(options.url);
|
|
1333
|
-
if (!response.ok) {
|
|
1334
|
-
throw new Error(`无法加载插件: ${options.url} (${response.status})`);
|
|
1174
|
+
if (!plugin || !plugin.afterInit) {
|
|
1175
|
+
continue;
|
|
1335
1176
|
}
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
}
|
|
1348
|
-
// 检查插件是否已加载
|
|
1349
|
-
if (this.plugins.has(plugin.name)) {
|
|
1350
|
-
throw new Error(`插件 ${plugin.name} 已加载`);
|
|
1351
|
-
}
|
|
1352
|
-
// 设置加载状态
|
|
1353
|
-
this.pluginStatus.set(plugin.name, 'loading');
|
|
1354
|
-
try {
|
|
1355
|
-
// 注册插件
|
|
1356
|
-
this.register(plugin);
|
|
1357
|
-
// 如果要求立即初始化
|
|
1358
|
-
if (options.initialize && options.initContext && options.startOptions) {
|
|
1359
|
-
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1177
|
+
try {
|
|
1178
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1179
|
+
if (!sandbox) {
|
|
1180
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1181
|
+
continue;
|
|
1182
|
+
}
|
|
1183
|
+
// 根据沙箱配置过滤选项
|
|
1184
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1185
|
+
await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);
|
|
1186
|
+
} catch (error) {
|
|
1187
|
+
console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);
|
|
1360
1188
|
}
|
|
1361
|
-
return plugin;
|
|
1362
|
-
} catch (error) {
|
|
1363
|
-
this.pluginStatus.delete(plugin.name);
|
|
1364
|
-
throw error;
|
|
1365
1189
|
}
|
|
1366
1190
|
}
|
|
1367
1191
|
/**
|
|
1368
|
-
*
|
|
1192
|
+
* 获取插件状态
|
|
1369
1193
|
*
|
|
1370
1194
|
* @param name - 插件名称
|
|
1371
|
-
* @
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
const plugin = this.plugins.get(name);
|
|
1375
|
-
if (!plugin) {
|
|
1376
|
-
throw new Error(`插件 ${name} 未注册`);
|
|
1377
|
-
}
|
|
1378
|
-
const status = this.pluginStatus.get(name);
|
|
1379
|
-
if (status === 'initialized') {
|
|
1380
|
-
return; // 已经初始化
|
|
1381
|
-
}
|
|
1382
|
-
try {
|
|
1383
|
-
const sandbox = this.sandboxes.get(name);
|
|
1384
|
-
if (!sandbox) {
|
|
1385
|
-
throw new Error(`插件 ${name} 的沙箱未找到`);
|
|
1386
|
-
}
|
|
1387
|
-
// 执行初始化钩子
|
|
1388
|
-
if (plugin.init) {
|
|
1389
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1390
|
-
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1391
|
-
}
|
|
1392
|
-
this.pluginStatus.set(name, 'initialized');
|
|
1393
|
-
} catch (error) {
|
|
1394
|
-
console.error(`插件 ${name} 初始化失败:`, error);
|
|
1395
|
-
throw error;
|
|
1396
|
-
}
|
|
1195
|
+
* @returns 插件状态
|
|
1196
|
+
*/ getPluginStatus(name) {
|
|
1197
|
+
return this.pluginStatus.get(name);
|
|
1397
1198
|
}
|
|
1398
1199
|
/**
|
|
1399
|
-
*
|
|
1200
|
+
* 检查插件是否已加载
|
|
1400
1201
|
*
|
|
1401
1202
|
* @param name - 插件名称
|
|
1402
|
-
* @
|
|
1403
|
-
*/
|
|
1404
|
-
|
|
1405
|
-
if (!plugin) {
|
|
1406
|
-
throw new Error(`插件 ${name} 未加载`);
|
|
1407
|
-
}
|
|
1408
|
-
// 检查是否有其他插件依赖此插件
|
|
1409
|
-
if (!force) {
|
|
1410
|
-
const dependents = Array.from(this.plugins.values()).filter((p)=>p.dependencies && p.dependencies.includes(name));
|
|
1411
|
-
if (dependents.length > 0) {
|
|
1412
|
-
throw new Error(`无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p)=>p.name).join(', ')}`);
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
// 执行销毁钩子
|
|
1416
|
-
if (plugin.destroy) {
|
|
1417
|
-
try {
|
|
1418
|
-
await plugin.destroy();
|
|
1419
|
-
} catch (error) {
|
|
1420
|
-
console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
// 从事件总线移除相关监听器(如果有)
|
|
1424
|
-
// 注意:事件总线是全局的,这里只移除插件相关的事件
|
|
1425
|
-
// 实际实现可能需要更细粒度的控制
|
|
1426
|
-
// 清理插件
|
|
1427
|
-
this.unregister(name);
|
|
1428
|
-
this.pluginStatus.set(name, 'destroyed');
|
|
1203
|
+
* @returns 是否已加载
|
|
1204
|
+
*/ isLoaded(name) {
|
|
1205
|
+
return this.plugins.has(name);
|
|
1429
1206
|
}
|
|
1430
1207
|
/**
|
|
1431
|
-
*
|
|
1208
|
+
* 获取已加载的插件列表
|
|
1432
1209
|
*
|
|
1433
|
-
* @
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
// 检查依赖是否都已加载
|
|
1437
|
-
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
1438
|
-
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
1439
|
-
if (missingDeps.length > 0) {
|
|
1440
|
-
return false;
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
return true;
|
|
1210
|
+
* @returns 插件名称数组
|
|
1211
|
+
*/ getLoadedPlugins() {
|
|
1212
|
+
return Array.from(this.plugins.keys());
|
|
1444
1213
|
}
|
|
1445
1214
|
/**
|
|
1446
|
-
*
|
|
1215
|
+
* 获取所有插件状态
|
|
1447
1216
|
*
|
|
1448
|
-
* @
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
this.pluginLoaders.set(name, loader);
|
|
1217
|
+
* @returns 插件状态映射
|
|
1218
|
+
*/ getAllPluginStatus() {
|
|
1219
|
+
return new Map(this.pluginStatus);
|
|
1452
1220
|
}
|
|
1453
1221
|
/**
|
|
1454
|
-
*
|
|
1222
|
+
* 获取插件沙箱
|
|
1455
1223
|
*
|
|
1456
1224
|
* @param name - 插件名称
|
|
1457
|
-
* @
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
const loader = this.pluginLoaders.get(name);
|
|
1461
|
-
if (!loader) {
|
|
1462
|
-
throw new Error(`插件 ${name} 的加载器未注册`);
|
|
1463
|
-
}
|
|
1464
|
-
const plugin = await loader();
|
|
1465
|
-
if (!plugin || !plugin.name) {
|
|
1466
|
-
throw new Error('插件格式无效:必须包含 name 属性');
|
|
1467
|
-
}
|
|
1468
|
-
if (plugin.name !== name) {
|
|
1469
|
-
throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);
|
|
1470
|
-
}
|
|
1471
|
-
// 检查插件是否已加载
|
|
1472
|
-
if (this.plugins.has(plugin.name)) {
|
|
1473
|
-
return this.plugins.get(plugin.name);
|
|
1474
|
-
}
|
|
1475
|
-
// 设置加载状态
|
|
1476
|
-
this.pluginStatus.set(plugin.name, 'loading');
|
|
1477
|
-
try {
|
|
1478
|
-
// 注册插件
|
|
1479
|
-
this.register(plugin);
|
|
1480
|
-
// 如果要求立即初始化
|
|
1481
|
-
if (options?.initialize && options.initContext && options.startOptions) {
|
|
1482
|
-
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1483
|
-
}
|
|
1484
|
-
return plugin;
|
|
1485
|
-
} catch (error) {
|
|
1486
|
-
this.pluginStatus.delete(plugin.name);
|
|
1487
|
-
throw error;
|
|
1488
|
-
}
|
|
1225
|
+
* @returns 插件沙箱或undefined
|
|
1226
|
+
*/ getSandbox(name) {
|
|
1227
|
+
return this.sandboxes.get(name);
|
|
1489
1228
|
}
|
|
1490
1229
|
/**
|
|
1491
|
-
*
|
|
1492
|
-
*/
|
|
1493
|
-
return
|
|
1230
|
+
* 获取事件总线
|
|
1231
|
+
*/ getEventBus() {
|
|
1232
|
+
return pluginEventBus;
|
|
1494
1233
|
}
|
|
1495
1234
|
/**
|
|
1496
|
-
*
|
|
1497
|
-
*/
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
if (!plugin || !plugin.beforeInit) {
|
|
1509
|
-
continue;
|
|
1510
|
-
}
|
|
1511
|
-
try {
|
|
1512
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1513
|
-
if (!sandbox) {
|
|
1514
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1515
|
-
continue;
|
|
1516
|
-
}
|
|
1517
|
-
// 根据沙箱配置过滤选项
|
|
1518
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1519
|
-
await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);
|
|
1520
|
-
} catch (error) {
|
|
1521
|
-
console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);
|
|
1522
|
-
}
|
|
1523
|
-
}
|
|
1524
|
-
}
|
|
1525
|
-
/**
|
|
1526
|
-
* 执行初始化钩子
|
|
1527
|
-
*
|
|
1528
|
-
* 优化:按依赖顺序执行,并更新插件状态
|
|
1529
|
-
*/ async executeInit(options, context) {
|
|
1530
|
-
const loadOrder = this.getLoadOrder();
|
|
1531
|
-
for (const pluginName of loadOrder){
|
|
1532
|
-
const plugin = this.plugins.get(pluginName);
|
|
1533
|
-
if (!plugin || !plugin.init) {
|
|
1534
|
-
continue;
|
|
1535
|
-
}
|
|
1536
|
-
try {
|
|
1537
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1538
|
-
if (!sandbox) {
|
|
1539
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
// 根据沙箱配置过滤选项
|
|
1543
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1544
|
-
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1545
|
-
this.pluginStatus.set(plugin.name, 'initialized');
|
|
1546
|
-
} catch (error) {
|
|
1547
|
-
console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);
|
|
1548
|
-
}
|
|
1549
|
-
}
|
|
1550
|
-
}
|
|
1551
|
-
/**
|
|
1552
|
-
* 执行初始化后钩子
|
|
1553
|
-
*
|
|
1554
|
-
* 优化:按依赖顺序执行(逆序,确保依赖插件先执行)
|
|
1555
|
-
*/ async executeAfterInit(options, context) {
|
|
1556
|
-
const loadOrder = this.getLoadOrder();
|
|
1557
|
-
// 逆序执行,确保依赖插件先执行
|
|
1558
|
-
const reverseOrder = [
|
|
1559
|
-
...loadOrder
|
|
1560
|
-
].reverse();
|
|
1561
|
-
for (const pluginName of reverseOrder){
|
|
1562
|
-
const plugin = this.plugins.get(pluginName);
|
|
1563
|
-
if (!plugin || !plugin.afterInit) {
|
|
1564
|
-
continue;
|
|
1565
|
-
}
|
|
1566
|
-
try {
|
|
1567
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1568
|
-
if (!sandbox) {
|
|
1569
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1570
|
-
continue;
|
|
1571
|
-
}
|
|
1572
|
-
// 根据沙箱配置过滤选项
|
|
1573
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1574
|
-
await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);
|
|
1575
|
-
} catch (error) {
|
|
1576
|
-
console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
/**
|
|
1581
|
-
* 获取插件状态
|
|
1582
|
-
*
|
|
1583
|
-
* @param name - 插件名称
|
|
1584
|
-
* @returns 插件状态
|
|
1585
|
-
*/ getPluginStatus(name) {
|
|
1586
|
-
return this.pluginStatus.get(name);
|
|
1587
|
-
}
|
|
1588
|
-
/**
|
|
1589
|
-
* 检查插件是否已加载
|
|
1590
|
-
*
|
|
1591
|
-
* @param name - 插件名称
|
|
1592
|
-
* @returns 是否已加载
|
|
1593
|
-
*/ isLoaded(name) {
|
|
1594
|
-
return this.plugins.has(name);
|
|
1595
|
-
}
|
|
1596
|
-
/**
|
|
1597
|
-
* 获取已加载的插件列表
|
|
1598
|
-
*
|
|
1599
|
-
* @returns 插件名称数组
|
|
1600
|
-
*/ getLoadedPlugins() {
|
|
1601
|
-
return Array.from(this.plugins.keys());
|
|
1602
|
-
}
|
|
1603
|
-
/**
|
|
1604
|
-
* 获取所有插件状态
|
|
1605
|
-
*
|
|
1606
|
-
* @returns 插件状态映射
|
|
1607
|
-
*/ getAllPluginStatus() {
|
|
1608
|
-
return new Map(this.pluginStatus);
|
|
1609
|
-
}
|
|
1610
|
-
/**
|
|
1611
|
-
* 获取插件沙箱
|
|
1612
|
-
*
|
|
1613
|
-
* @param name - 插件名称
|
|
1614
|
-
* @returns 插件沙箱或undefined
|
|
1615
|
-
*/ getSandbox(name) {
|
|
1616
|
-
return this.sandboxes.get(name);
|
|
1617
|
-
}
|
|
1618
|
-
/**
|
|
1619
|
-
* 获取事件总线
|
|
1620
|
-
*/ getEventBus() {
|
|
1621
|
-
return pluginEventBus;
|
|
1622
|
-
}
|
|
1623
|
-
/**
|
|
1624
|
-
* 销毁所有插件
|
|
1625
|
-
*/ async destroyAll() {
|
|
1626
|
-
for (const plugin of this.plugins.values()){
|
|
1627
|
-
if (plugin.destroy) {
|
|
1628
|
-
try {
|
|
1629
|
-
await plugin.destroy();
|
|
1630
|
-
} catch (error) {
|
|
1631
|
-
console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);
|
|
1632
|
-
}
|
|
1633
|
-
}
|
|
1634
|
-
}
|
|
1635
|
-
this.plugins.clear();
|
|
1235
|
+
* 销毁所有插件
|
|
1236
|
+
*/ async destroyAll() {
|
|
1237
|
+
for (const plugin of this.plugins.values()){
|
|
1238
|
+
if (plugin.destroy) {
|
|
1239
|
+
try {
|
|
1240
|
+
await plugin.destroy();
|
|
1241
|
+
} catch (error) {
|
|
1242
|
+
console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
this.plugins.clear();
|
|
1636
1247
|
}
|
|
1637
1248
|
constructor(){
|
|
1638
|
-
_define_property$
|
|
1639
|
-
_define_property$
|
|
1640
|
-
_define_property$
|
|
1641
|
-
_define_property$
|
|
1249
|
+
_define_property$G(this, "plugins", new Map());
|
|
1250
|
+
_define_property$G(this, "sandboxes", new Map());
|
|
1251
|
+
_define_property$G(this, "pluginStatus", new Map());
|
|
1252
|
+
_define_property$G(this, "pluginLoaders", new Map());
|
|
1642
1253
|
}
|
|
1643
1254
|
}
|
|
1644
1255
|
/**
|
|
@@ -1719,7 +1330,7 @@
|
|
|
1719
1330
|
}
|
|
1720
1331
|
}
|
|
1721
1332
|
|
|
1722
|
-
function _define_property$
|
|
1333
|
+
function _define_property$F(obj, key, value) {
|
|
1723
1334
|
if (key in obj) {
|
|
1724
1335
|
Object.defineProperty(obj, key, {
|
|
1725
1336
|
value: value,
|
|
@@ -1740,7 +1351,7 @@
|
|
|
1740
1351
|
/**
|
|
1741
1352
|
* 设置错误
|
|
1742
1353
|
*/ setError(error) {
|
|
1743
|
-
this.error =
|
|
1354
|
+
this.error = vlianUtils.errorUtils.normalizeError(error);
|
|
1744
1355
|
// 通知所有监听器
|
|
1745
1356
|
this.listeners.forEach((listener)=>listener());
|
|
1746
1357
|
}
|
|
@@ -1769,8 +1380,8 @@
|
|
|
1769
1380
|
return this.error !== null;
|
|
1770
1381
|
}
|
|
1771
1382
|
constructor(){
|
|
1772
|
-
_define_property$
|
|
1773
|
-
_define_property$
|
|
1383
|
+
_define_property$F(this, "error", null);
|
|
1384
|
+
_define_property$F(this, "listeners", new Set());
|
|
1774
1385
|
}
|
|
1775
1386
|
};
|
|
1776
1387
|
/**
|
|
@@ -2120,7 +1731,7 @@
|
|
|
2120
1731
|
return true;
|
|
2121
1732
|
}
|
|
2122
1733
|
|
|
2123
|
-
function _define_property$
|
|
1734
|
+
function _define_property$E(obj, key, value) {
|
|
2124
1735
|
if (key in obj) {
|
|
2125
1736
|
Object.defineProperty(obj, key, {
|
|
2126
1737
|
value: value,
|
|
@@ -2173,7 +1784,7 @@
|
|
|
2173
1784
|
return this.middlewares.length;
|
|
2174
1785
|
}
|
|
2175
1786
|
constructor(){
|
|
2176
|
-
_define_property$
|
|
1787
|
+
_define_property$E(this, "middlewares", []);
|
|
2177
1788
|
}
|
|
2178
1789
|
}
|
|
2179
1790
|
/**
|
|
@@ -2182,7 +1793,7 @@
|
|
|
2182
1793
|
|
|
2183
1794
|
/**
|
|
2184
1795
|
* 状态实例核心实现
|
|
2185
|
-
*/ function _define_property$
|
|
1796
|
+
*/ function _define_property$D(obj, key, value) {
|
|
2186
1797
|
if (key in obj) {
|
|
2187
1798
|
Object.defineProperty(obj, key, {
|
|
2188
1799
|
value: value,
|
|
@@ -2314,25 +1925,25 @@
|
|
|
2314
1925
|
*/ constructor(initialValue, options = {}){
|
|
2315
1926
|
/**
|
|
2316
1927
|
* 状态实例标识符
|
|
2317
|
-
*/ _define_property$
|
|
1928
|
+
*/ _define_property$D(this, "id", void 0);
|
|
2318
1929
|
/**
|
|
2319
1930
|
* 状态作用域
|
|
2320
|
-
*/ _define_property$
|
|
1931
|
+
*/ _define_property$D(this, "scope", void 0);
|
|
2321
1932
|
/**
|
|
2322
1933
|
* 当前状态值
|
|
2323
|
-
*/ _define_property$
|
|
1934
|
+
*/ _define_property$D(this, "value", void 0);
|
|
2324
1935
|
/**
|
|
2325
1936
|
* 订阅者集合
|
|
2326
|
-
*/ _define_property$
|
|
1937
|
+
*/ _define_property$D(this, "subscribers", new Set());
|
|
2327
1938
|
/**
|
|
2328
1939
|
* 是否已销毁
|
|
2329
|
-
*/ _define_property$
|
|
1940
|
+
*/ _define_property$D(this, "destroyed", false);
|
|
2330
1941
|
/**
|
|
2331
1942
|
* 开发模式标志
|
|
2332
|
-
*/ _define_property$
|
|
1943
|
+
*/ _define_property$D(this, "devMode", void 0);
|
|
2333
1944
|
/**
|
|
2334
1945
|
* 中间件函数数组
|
|
2335
|
-
*/ _define_property$
|
|
1946
|
+
*/ _define_property$D(this, "middleware", void 0);
|
|
2336
1947
|
this.value = initialValue;
|
|
2337
1948
|
this.id = options.id ?? Symbol('StateInstance');
|
|
2338
1949
|
this.scope = options.scope;
|
|
@@ -2349,7 +1960,7 @@
|
|
|
2349
1960
|
|
|
2350
1961
|
/**
|
|
2351
1962
|
* 状态作用域管理
|
|
2352
|
-
*/ function _define_property$
|
|
1963
|
+
*/ function _define_property$C(obj, key, value) {
|
|
2353
1964
|
if (key in obj) {
|
|
2354
1965
|
Object.defineProperty(obj, key, {
|
|
2355
1966
|
value: value,
|
|
@@ -2472,16 +2083,16 @@
|
|
|
2472
2083
|
constructor(){
|
|
2473
2084
|
/**
|
|
2474
2085
|
* 作用域到状态实例的映射
|
|
2475
|
-
*/ _define_property$
|
|
2086
|
+
*/ _define_property$C(this, "scopeMap", new Map());
|
|
2476
2087
|
/**
|
|
2477
2088
|
* 状态实例到作用域的映射(用于快速查找)
|
|
2478
|
-
*/ _define_property$
|
|
2089
|
+
*/ _define_property$C(this, "instanceToScopeMap", new Map());
|
|
2479
2090
|
}
|
|
2480
2091
|
}
|
|
2481
2092
|
|
|
2482
2093
|
/**
|
|
2483
2094
|
* 状态注册表实现
|
|
2484
|
-
*/ function _define_property$
|
|
2095
|
+
*/ function _define_property$B(obj, key, value) {
|
|
2485
2096
|
if (key in obj) {
|
|
2486
2097
|
Object.defineProperty(obj, key, {
|
|
2487
2098
|
value: value,
|
|
@@ -2575,17 +2186,17 @@
|
|
|
2575
2186
|
*/ constructor(){
|
|
2576
2187
|
/**
|
|
2577
2188
|
* 状态实例映射表(ID -> Instance)
|
|
2578
|
-
*/ _define_property$
|
|
2189
|
+
*/ _define_property$B(this, "instances", new Map());
|
|
2579
2190
|
/**
|
|
2580
2191
|
* 作用域管理器
|
|
2581
|
-
*/ _define_property$
|
|
2192
|
+
*/ _define_property$B(this, "scopeManager", void 0);
|
|
2582
2193
|
this.scopeManager = new StateScopeManager();
|
|
2583
2194
|
}
|
|
2584
2195
|
}
|
|
2585
2196
|
|
|
2586
2197
|
/**
|
|
2587
2198
|
* 派生状态实例实现
|
|
2588
|
-
*/ function _define_property$
|
|
2199
|
+
*/ function _define_property$A(obj, key, value) {
|
|
2589
2200
|
if (key in obj) {
|
|
2590
2201
|
Object.defineProperty(obj, key, {
|
|
2591
2202
|
value: value,
|
|
@@ -2723,28 +2334,28 @@
|
|
|
2723
2334
|
*/ constructor(config, options = {}){
|
|
2724
2335
|
/**
|
|
2725
2336
|
* 状态实例标识符
|
|
2726
|
-
*/ _define_property$
|
|
2337
|
+
*/ _define_property$A(this, "id", void 0);
|
|
2727
2338
|
/**
|
|
2728
2339
|
* 状态作用域
|
|
2729
|
-
*/ _define_property$
|
|
2340
|
+
*/ _define_property$A(this, "scope", void 0);
|
|
2730
2341
|
/**
|
|
2731
2342
|
* 派生状态配置
|
|
2732
|
-
*/ _define_property$
|
|
2343
|
+
*/ _define_property$A(this, "config", void 0);
|
|
2733
2344
|
/**
|
|
2734
2345
|
* 当前派生值
|
|
2735
|
-
*/ _define_property$
|
|
2346
|
+
*/ _define_property$A(this, "value", void 0);
|
|
2736
2347
|
/**
|
|
2737
2348
|
* 订阅者集合
|
|
2738
|
-
*/ _define_property$
|
|
2349
|
+
*/ _define_property$A(this, "subscribers", new Set());
|
|
2739
2350
|
/**
|
|
2740
2351
|
* 依赖状态的取消订阅函数数组
|
|
2741
|
-
*/ _define_property$
|
|
2352
|
+
*/ _define_property$A(this, "dependencyUnsubscribes", []);
|
|
2742
2353
|
/**
|
|
2743
2354
|
* 是否已销毁
|
|
2744
|
-
*/ _define_property$
|
|
2355
|
+
*/ _define_property$A(this, "destroyed", false);
|
|
2745
2356
|
/**
|
|
2746
2357
|
* 是否正在重新计算
|
|
2747
|
-
*/ _define_property$
|
|
2358
|
+
*/ _define_property$A(this, "recomputing", false);
|
|
2748
2359
|
this.config = config;
|
|
2749
2360
|
this.id = options.id ?? Symbol('DerivedStateInstance');
|
|
2750
2361
|
this.scope = options.scope;
|
|
@@ -2760,7 +2371,7 @@
|
|
|
2760
2371
|
*
|
|
2761
2372
|
* 这是 Secra Framework 内置的默认状态适配器实现
|
|
2762
2373
|
* 不依赖任何外部状态管理库,提供基础的状态管理能力
|
|
2763
|
-
*/ function _define_property$
|
|
2374
|
+
*/ function _define_property$z(obj, key, value) {
|
|
2764
2375
|
if (key in obj) {
|
|
2765
2376
|
Object.defineProperty(obj, key, {
|
|
2766
2377
|
value: value,
|
|
@@ -2814,19 +2425,19 @@
|
|
|
2814
2425
|
constructor(){
|
|
2815
2426
|
/**
|
|
2816
2427
|
* 适配器名称
|
|
2817
|
-
*/ _define_property$
|
|
2428
|
+
*/ _define_property$z(this, "name", 'DefaultAdapter');
|
|
2818
2429
|
/**
|
|
2819
2430
|
* 是否已销毁
|
|
2820
|
-
*/ _define_property$
|
|
2431
|
+
*/ _define_property$z(this, "destroyed", false);
|
|
2821
2432
|
/**
|
|
2822
2433
|
* 创建的状态实例集合(用于销毁时清理)
|
|
2823
|
-
*/ _define_property$
|
|
2434
|
+
*/ _define_property$z(this, "instances", new Set());
|
|
2824
2435
|
}
|
|
2825
2436
|
}
|
|
2826
2437
|
|
|
2827
2438
|
/**
|
|
2828
2439
|
* 状态适配器工厂
|
|
2829
|
-
*/ function _define_property$
|
|
2440
|
+
*/ function _define_property$y(obj, key, value) {
|
|
2830
2441
|
if (key in obj) {
|
|
2831
2442
|
Object.defineProperty(obj, key, {
|
|
2832
2443
|
value: value,
|
|
@@ -2902,10 +2513,10 @@
|
|
|
2902
2513
|
}
|
|
2903
2514
|
/**
|
|
2904
2515
|
* 默认适配器实例
|
|
2905
|
-
*/ _define_property$
|
|
2516
|
+
*/ _define_property$y(AdapterFactory, "defaultAdapter", null);
|
|
2906
2517
|
/**
|
|
2907
2518
|
* 自定义适配器映射
|
|
2908
|
-
*/ _define_property$
|
|
2519
|
+
*/ _define_property$y(AdapterFactory, "customAdapters", new Map());
|
|
2909
2520
|
|
|
2910
2521
|
/**
|
|
2911
2522
|
* Redux Toolkit 适配器
|
|
@@ -2928,7 +2539,7 @@
|
|
|
2928
2539
|
* state.set(1);
|
|
2929
2540
|
* console.log(state.get()); // 1
|
|
2930
2541
|
* ```
|
|
2931
|
-
*/ function _define_property$
|
|
2542
|
+
*/ function _define_property$x(obj, key, value) {
|
|
2932
2543
|
if (key in obj) {
|
|
2933
2544
|
Object.defineProperty(obj, key, {
|
|
2934
2545
|
value: value,
|
|
@@ -3086,37 +2697,37 @@
|
|
|
3086
2697
|
*/ constructor(store, sliceName, actions, initialValue, options = {}){
|
|
3087
2698
|
/**
|
|
3088
2699
|
* 状态实例标识符
|
|
3089
|
-
*/ _define_property$
|
|
2700
|
+
*/ _define_property$x(this, "id", void 0);
|
|
3090
2701
|
/**
|
|
3091
2702
|
* 状态作用域
|
|
3092
|
-
*/ _define_property$
|
|
2703
|
+
*/ _define_property$x(this, "scope", void 0);
|
|
3093
2704
|
/**
|
|
3094
2705
|
* Redux store 引用
|
|
3095
|
-
*/ _define_property$
|
|
2706
|
+
*/ _define_property$x(this, "store", void 0);
|
|
3096
2707
|
/**
|
|
3097
2708
|
* Redux slice 名称(在 store 中的路径)
|
|
3098
|
-
*/ _define_property$
|
|
2709
|
+
*/ _define_property$x(this, "sliceName", void 0);
|
|
3099
2710
|
/**
|
|
3100
2711
|
* Redux slice actions
|
|
3101
|
-
*/ _define_property$
|
|
2712
|
+
*/ _define_property$x(this, "actions", void 0);
|
|
3102
2713
|
/**
|
|
3103
2714
|
* 订阅者集合
|
|
3104
|
-
*/ _define_property$
|
|
2715
|
+
*/ _define_property$x(this, "subscribers", new Set());
|
|
3105
2716
|
/**
|
|
3106
2717
|
* Redux store 订阅取消函数
|
|
3107
|
-
*/ _define_property$
|
|
2718
|
+
*/ _define_property$x(this, "unsubscribeStore", void 0);
|
|
3108
2719
|
/**
|
|
3109
2720
|
* 是否已销毁
|
|
3110
|
-
*/ _define_property$
|
|
2721
|
+
*/ _define_property$x(this, "destroyed", false);
|
|
3111
2722
|
/**
|
|
3112
2723
|
* 开发模式标志
|
|
3113
|
-
*/ _define_property$
|
|
2724
|
+
*/ _define_property$x(this, "devMode", void 0);
|
|
3114
2725
|
/**
|
|
3115
2726
|
* 中间件函数数组
|
|
3116
|
-
*/ _define_property$
|
|
2727
|
+
*/ _define_property$x(this, "middleware", void 0);
|
|
3117
2728
|
/**
|
|
3118
2729
|
* 上一次的状态值(用于订阅通知)
|
|
3119
|
-
*/ _define_property$
|
|
2730
|
+
*/ _define_property$x(this, "previousValue", void 0);
|
|
3120
2731
|
this.store = store;
|
|
3121
2732
|
this.sliceName = sliceName;
|
|
3122
2733
|
this.actions = actions;
|
|
@@ -3168,10 +2779,10 @@
|
|
|
3168
2779
|
*/ constructor(){
|
|
3169
2780
|
/**
|
|
3170
2781
|
* 当前 reducer 映射
|
|
3171
|
-
*/ _define_property$
|
|
2782
|
+
*/ _define_property$x(this, "reducers", new Map());
|
|
3172
2783
|
/**
|
|
3173
2784
|
* 根 reducer 函数
|
|
3174
|
-
*/ _define_property$
|
|
2785
|
+
*/ _define_property$x(this, "rootReducer", void 0);
|
|
3175
2786
|
this.rootReducer = (state, action)=>{
|
|
3176
2787
|
const stateRecord = state ?? {};
|
|
3177
2788
|
const newState = {
|
|
@@ -3315,28 +2926,28 @@
|
|
|
3315
2926
|
*/ constructor(options){
|
|
3316
2927
|
/**
|
|
3317
2928
|
* 适配器名称
|
|
3318
|
-
*/ _define_property$
|
|
2929
|
+
*/ _define_property$x(this, "name", 'ReduxAdapter');
|
|
3319
2930
|
/**
|
|
3320
2931
|
* 是否已销毁
|
|
3321
|
-
*/ _define_property$
|
|
2932
|
+
*/ _define_property$x(this, "destroyed", false);
|
|
3322
2933
|
/**
|
|
3323
2934
|
* 创建的状态实例集合
|
|
3324
|
-
*/ _define_property$
|
|
2935
|
+
*/ _define_property$x(this, "instances", new Set());
|
|
3325
2936
|
/**
|
|
3326
2937
|
* Redux store 实例
|
|
3327
|
-
*/ _define_property$
|
|
2938
|
+
*/ _define_property$x(this, "store", null);
|
|
3328
2939
|
/**
|
|
3329
2940
|
* Redux slice 名称计数器(用于生成唯一的 slice 名称)
|
|
3330
|
-
*/ _define_property$
|
|
2941
|
+
*/ _define_property$x(this, "sliceCounter", 0);
|
|
3331
2942
|
/**
|
|
3332
2943
|
* Redux slice 名称到状态实例的映射
|
|
3333
|
-
*/ _define_property$
|
|
2944
|
+
*/ _define_property$x(this, "sliceToInstance", new Map());
|
|
3334
2945
|
/**
|
|
3335
2946
|
* 动态 reducer 管理器
|
|
3336
|
-
*/ _define_property$
|
|
2947
|
+
*/ _define_property$x(this, "reducerManager", void 0);
|
|
3337
2948
|
/**
|
|
3338
2949
|
* 是否启用开发模式
|
|
3339
|
-
*/ _define_property$
|
|
2950
|
+
*/ _define_property$x(this, "devMode", void 0);
|
|
3340
2951
|
this.devMode = options?.devMode ?? false;
|
|
3341
2952
|
this.reducerManager = new DynamicReducerManager();
|
|
3342
2953
|
this.store = options?.store ?? null;
|
|
@@ -3351,7 +2962,7 @@
|
|
|
3351
2962
|
* 这是一个适配器接口示例,展示如何将 Zustand 集成到 Secra 状态管理器
|
|
3352
2963
|
*
|
|
3353
2964
|
* ⚠️ 注意:这是一个占位实现,实际使用时需要安装 zustand 依赖
|
|
3354
|
-
*/ function _define_property$
|
|
2965
|
+
*/ function _define_property$w(obj, key, value) {
|
|
3355
2966
|
if (key in obj) {
|
|
3356
2967
|
Object.defineProperty(obj, key, {
|
|
3357
2968
|
value: value,
|
|
@@ -3404,13 +3015,13 @@
|
|
|
3404
3015
|
constructor(){
|
|
3405
3016
|
/**
|
|
3406
3017
|
* 适配器名称
|
|
3407
|
-
*/ _define_property$
|
|
3018
|
+
*/ _define_property$w(this, "name", 'ZustandAdapter');
|
|
3408
3019
|
/**
|
|
3409
3020
|
* 是否已销毁
|
|
3410
|
-
*/ _define_property$
|
|
3021
|
+
*/ _define_property$w(this, "destroyed", false);
|
|
3411
3022
|
/**
|
|
3412
3023
|
* 创建的状态实例集合
|
|
3413
|
-
*/ _define_property$
|
|
3024
|
+
*/ _define_property$w(this, "instances", new Set());
|
|
3414
3025
|
}
|
|
3415
3026
|
}
|
|
3416
3027
|
|
|
@@ -3418,7 +3029,7 @@
|
|
|
3418
3029
|
* 状态管理器主类
|
|
3419
3030
|
*
|
|
3420
3031
|
* 这是状态管理器的核心入口,提供统一的状态管理 API
|
|
3421
|
-
*/ function _define_property$
|
|
3032
|
+
*/ function _define_property$v(obj, key, value) {
|
|
3422
3033
|
if (key in obj) {
|
|
3423
3034
|
Object.defineProperty(obj, key, {
|
|
3424
3035
|
value: value,
|
|
@@ -3543,19 +3154,19 @@
|
|
|
3543
3154
|
*/ constructor(options = {}){
|
|
3544
3155
|
/**
|
|
3545
3156
|
* 默认适配器
|
|
3546
|
-
*/ _define_property$
|
|
3157
|
+
*/ _define_property$v(this, "adapter", void 0);
|
|
3547
3158
|
/**
|
|
3548
3159
|
* 状态注册表(如果启用)
|
|
3549
|
-
*/ _define_property$
|
|
3160
|
+
*/ _define_property$v(this, "registry", void 0);
|
|
3550
3161
|
/**
|
|
3551
3162
|
* 默认作用域
|
|
3552
|
-
*/ _define_property$
|
|
3163
|
+
*/ _define_property$v(this, "defaultScope", void 0);
|
|
3553
3164
|
/**
|
|
3554
3165
|
* 是否启用开发模式
|
|
3555
|
-
*/ _define_property$
|
|
3166
|
+
*/ _define_property$v(this, "devMode", void 0);
|
|
3556
3167
|
/**
|
|
3557
3168
|
* 是否已销毁
|
|
3558
|
-
*/ _define_property$
|
|
3169
|
+
*/ _define_property$v(this, "destroyed", false);
|
|
3559
3170
|
this.adapter = options.defaultAdapter ?? AdapterFactory.getDefaultAdapter();
|
|
3560
3171
|
this.defaultScope = options.defaultScope;
|
|
3561
3172
|
this.devMode = options.devMode ?? false;
|
|
@@ -3570,7 +3181,7 @@
|
|
|
3570
3181
|
}
|
|
3571
3182
|
}
|
|
3572
3183
|
|
|
3573
|
-
function _define_property$
|
|
3184
|
+
function _define_property$u(obj, key, value) {
|
|
3574
3185
|
if (key in obj) {
|
|
3575
3186
|
Object.defineProperty(obj, key, {
|
|
3576
3187
|
value: value,
|
|
@@ -3970,25 +3581,25 @@
|
|
|
3970
3581
|
/**
|
|
3971
3582
|
* 事件监听器映射表
|
|
3972
3583
|
* 使用 Map + Set 结构提高性能
|
|
3973
|
-
*/ _define_property$
|
|
3584
|
+
*/ _define_property$u(this, "listeners", new Map());
|
|
3974
3585
|
/**
|
|
3975
3586
|
* 事件历史记录
|
|
3976
|
-
*/ _define_property$
|
|
3587
|
+
*/ _define_property$u(this, "eventHistory", []);
|
|
3977
3588
|
/**
|
|
3978
3589
|
* 事件中间件列表
|
|
3979
|
-
*/ _define_property$
|
|
3590
|
+
*/ _define_property$u(this, "middlewares", []);
|
|
3980
3591
|
/**
|
|
3981
3592
|
* 事件统计信息
|
|
3982
|
-
*/ _define_property$
|
|
3593
|
+
*/ _define_property$u(this, "stats", new Map());
|
|
3983
3594
|
/**
|
|
3984
3595
|
* 配置
|
|
3985
|
-
*/ _define_property$
|
|
3596
|
+
*/ _define_property$u(this, "config", void 0);
|
|
3986
3597
|
/**
|
|
3987
3598
|
* 事件计数器(用于生成唯一事件ID)
|
|
3988
|
-
*/ _define_property$
|
|
3599
|
+
*/ _define_property$u(this, "eventCounter", 0);
|
|
3989
3600
|
/**
|
|
3990
3601
|
* 监听器ID计数器
|
|
3991
|
-
*/ _define_property$
|
|
3602
|
+
*/ _define_property$u(this, "listenerIdCounter", 0);
|
|
3992
3603
|
this.config = {
|
|
3993
3604
|
enableTracking: config.enableTracking ?? process.env.NODE_ENV === 'development',
|
|
3994
3605
|
maxHistorySize: config.maxHistorySize ?? 100,
|
|
@@ -4094,7 +3705,7 @@
|
|
|
4094
3705
|
]);
|
|
4095
3706
|
logger.logger.info('关键服务初始化完成');
|
|
4096
3707
|
// 初始化性能监控(依赖监控服务,必须在监控服务初始化后)
|
|
4097
|
-
const performanceMonitor = new
|
|
3708
|
+
const performanceMonitor = new vlianUtils.PerformanceMonitor({
|
|
4098
3709
|
...options.performanceMonitor,
|
|
4099
3710
|
onReport: (metrics)=>{
|
|
4100
3711
|
monitoring$1.reportPerformance(metrics);
|
|
@@ -4181,7 +3792,7 @@
|
|
|
4181
3792
|
};
|
|
4182
3793
|
}
|
|
4183
3794
|
|
|
4184
|
-
function _define_property$
|
|
3795
|
+
function _define_property$t(obj, key, value) {
|
|
4185
3796
|
if (key in obj) {
|
|
4186
3797
|
Object.defineProperty(obj, key, {
|
|
4187
3798
|
value: value,
|
|
@@ -4299,7 +3910,7 @@
|
|
|
4299
3910
|
/**
|
|
4300
3911
|
* 私有构造函数,防止外部直接实例化
|
|
4301
3912
|
*/ constructor(){
|
|
4302
|
-
_define_property$
|
|
3913
|
+
_define_property$t(this, "_config", void 0);
|
|
4303
3914
|
this._config = {
|
|
4304
3915
|
theme: {
|
|
4305
3916
|
mode: 'light'
|
|
@@ -4308,7 +3919,7 @@
|
|
|
4308
3919
|
};
|
|
4309
3920
|
}
|
|
4310
3921
|
};
|
|
4311
|
-
_define_property$
|
|
3922
|
+
_define_property$t(AppConfigManager, "instance", null);
|
|
4312
3923
|
/**
|
|
4313
3924
|
* 应用配置单例实例
|
|
4314
3925
|
*/ const appConfig = AppConfigManager.getInstance();
|
|
@@ -4914,7 +4525,7 @@
|
|
|
4914
4525
|
return r.length !== e.length || r.some((t, o) => !Object.is(t, e[o]));
|
|
4915
4526
|
}
|
|
4916
4527
|
|
|
4917
|
-
function _define_property$
|
|
4528
|
+
function _define_property$s(obj, key, value) {
|
|
4918
4529
|
if (key in obj) {
|
|
4919
4530
|
Object.defineProperty(obj, key, {
|
|
4920
4531
|
value: value,
|
|
@@ -4943,9 +4554,9 @@
|
|
|
4943
4554
|
* @returns 错误处理结果
|
|
4944
4555
|
*/ async handleError(error, context) {
|
|
4945
4556
|
// 标准化错误对象
|
|
4946
|
-
const normalizedError =
|
|
4557
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
4947
4558
|
// 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)
|
|
4948
|
-
const errorWithContext = context ? new
|
|
4559
|
+
const errorWithContext = context ? new vlianUtils.FrameworkError(normalizedError.message, normalizedError.type, normalizedError.severity, {
|
|
4949
4560
|
code: normalizedError.code,
|
|
4950
4561
|
originalError: normalizedError.originalError,
|
|
4951
4562
|
context: {
|
|
@@ -5025,23 +4636,23 @@
|
|
|
5025
4636
|
/**
|
|
5026
4637
|
* 记录错误
|
|
5027
4638
|
*/ logError(error) {
|
|
5028
|
-
const errorInfo =
|
|
4639
|
+
const errorInfo = vlianUtils.errorUtils.extractErrorInfo(error);
|
|
5029
4640
|
// 根据错误严重程度选择日志级别
|
|
5030
4641
|
switch(error.severity){
|
|
5031
|
-
case
|
|
5032
|
-
case
|
|
4642
|
+
case vlianUtils.ErrorSeverity.CRITICAL:
|
|
4643
|
+
case vlianUtils.ErrorSeverity.HIGH:
|
|
5033
4644
|
logger.logger.error('错误:', errorInfo);
|
|
5034
4645
|
break;
|
|
5035
|
-
case
|
|
4646
|
+
case vlianUtils.ErrorSeverity.MEDIUM:
|
|
5036
4647
|
logger.logger.warn('警告:', errorInfo);
|
|
5037
4648
|
break;
|
|
5038
|
-
case
|
|
4649
|
+
case vlianUtils.ErrorSeverity.LOW:
|
|
5039
4650
|
logger.logger.info('信息:', errorInfo);
|
|
5040
4651
|
break;
|
|
5041
4652
|
}
|
|
5042
4653
|
// 开发环境显示详细错误信息
|
|
5043
4654
|
if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {
|
|
5044
|
-
const detailedError =
|
|
4655
|
+
const detailedError = vlianUtils.errorUtils.formatErrorForDev(error);
|
|
5045
4656
|
console.error(detailedError);
|
|
5046
4657
|
}
|
|
5047
4658
|
}
|
|
@@ -5113,8 +4724,8 @@
|
|
|
5113
4724
|
return new ErrorHandler(config);
|
|
5114
4725
|
}
|
|
5115
4726
|
constructor(config = {}){
|
|
5116
|
-
_define_property$
|
|
5117
|
-
_define_property$
|
|
4727
|
+
_define_property$s(this, "config", void 0);
|
|
4728
|
+
_define_property$s(this, "monitoring", void 0);
|
|
5118
4729
|
this.monitoring = config.monitoring;
|
|
5119
4730
|
this.config = {
|
|
5120
4731
|
defaultStrategies: config.defaultStrategies ?? [
|
|
@@ -5176,7 +4787,7 @@
|
|
|
5176
4787
|
const errorHandler = React.useMemo(()=>getDefaultErrorHandler(), []);
|
|
5177
4788
|
// 处理错误,将标准 Error 转换为 FrameworkError
|
|
5178
4789
|
const handleError = React.useCallback(async (error, errorInfo)=>{
|
|
5179
|
-
const normalizedError =
|
|
4790
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5180
4791
|
// 将 react-error-boundary 的 errorInfo 转换为 React 的 ErrorInfo 格式
|
|
5181
4792
|
const reactErrorInfo = {
|
|
5182
4793
|
componentStack: errorInfo.componentStack || ''
|
|
@@ -5221,7 +4832,7 @@
|
|
|
5221
4832
|
// 默认 fallback UI(使用无框架 HTML 组件)
|
|
5222
4833
|
// 使用内部组件来管理重试计数状态,使用 React.memo 优化性能
|
|
5223
4834
|
const DefaultFallbackComponent = /*#__PURE__*/ React.memo(({ error, resetErrorBoundary })=>{
|
|
5224
|
-
const normalizedError =
|
|
4835
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5225
4836
|
const [retryCount, setRetryCount] = React.useState(retryCountRef.current);
|
|
5226
4837
|
const [showDetails, setShowDetails] = React.useState(false);
|
|
5227
4838
|
// 同步 ref 的值到 state,确保组件重新创建时能读取到最新的重试计数
|
|
@@ -5451,7 +5062,7 @@
|
|
|
5451
5062
|
};
|
|
5452
5063
|
// 如果提供了自定义 fallback,使用自定义的
|
|
5453
5064
|
const fallbackRender = fallback ? ({ error, resetErrorBoundary })=>{
|
|
5454
|
-
const normalizedError =
|
|
5065
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5455
5066
|
return fallback(normalizedError, ()=>{
|
|
5456
5067
|
handleReset();
|
|
5457
5068
|
resetErrorBoundary();
|
|
@@ -5531,7 +5142,7 @@
|
|
|
5531
5142
|
};
|
|
5532
5143
|
}
|
|
5533
5144
|
|
|
5534
|
-
function _define_property$
|
|
5145
|
+
function _define_property$r(obj, key, value) {
|
|
5535
5146
|
if (key in obj) {
|
|
5536
5147
|
Object.defineProperty(obj, key, {
|
|
5537
5148
|
value: value,
|
|
@@ -5590,8 +5201,8 @@
|
|
|
5590
5201
|
}
|
|
5591
5202
|
}
|
|
5592
5203
|
constructor(maxSize = 50){
|
|
5593
|
-
_define_property$
|
|
5594
|
-
_define_property$
|
|
5204
|
+
_define_property$r(this, "cache", new Map());
|
|
5205
|
+
_define_property$r(this, "maxSize", void 0);
|
|
5595
5206
|
this.maxSize = maxSize;
|
|
5596
5207
|
}
|
|
5597
5208
|
};
|
|
@@ -5829,7 +5440,7 @@
|
|
|
5829
5440
|
}
|
|
5830
5441
|
}
|
|
5831
5442
|
// 使用 SecurityUtils 验证输入(最后检查,因为可能较慢)
|
|
5832
|
-
const validation =
|
|
5443
|
+
const validation = vlianUtils.SecurityUtils.validateInput(path);
|
|
5833
5444
|
if (!validation.safe) {
|
|
5834
5445
|
return {
|
|
5835
5446
|
valid: false,
|
|
@@ -5940,7 +5551,7 @@
|
|
|
5940
5551
|
if (!validation.valid) {
|
|
5941
5552
|
// 生产环境错误信息脱敏
|
|
5942
5553
|
const errorMessage = process.env.NODE_ENV === 'development' ? `路径验证失败: ${validation.error}` : '路径验证失败';
|
|
5943
|
-
const error = new
|
|
5554
|
+
const error = new vlianUtils.SecurityError(errorMessage, undefined, process.env.NODE_ENV === 'development' ? {
|
|
5944
5555
|
path: normalizedPath
|
|
5945
5556
|
} : {});
|
|
5946
5557
|
if (options.enableDebugLog) {
|
|
@@ -5985,8 +5596,8 @@
|
|
|
5985
5596
|
}
|
|
5986
5597
|
}
|
|
5987
5598
|
constructor(){
|
|
5988
|
-
_define_property$
|
|
5989
|
-
_define_property$
|
|
5599
|
+
_define_property$r(this, "pool", []);
|
|
5600
|
+
_define_property$r(this, "maxPoolSize", 100);
|
|
5990
5601
|
}
|
|
5991
5602
|
};
|
|
5992
5603
|
const stackNodePool = new StackNodePool();
|
|
@@ -6201,7 +5812,7 @@
|
|
|
6201
5812
|
} catch (error) {
|
|
6202
5813
|
const err = error instanceof Error ? error : new Error('路由配置加载失败');
|
|
6203
5814
|
logger.logger.error('路由配置加载失败:', err);
|
|
6204
|
-
throw new
|
|
5815
|
+
throw new vlianUtils.ValidationError('路由配置加载失败', {
|
|
6205
5816
|
originalError: err
|
|
6206
5817
|
});
|
|
6207
5818
|
}
|
|
@@ -6313,7 +5924,7 @@
|
|
|
6313
5924
|
} catch (error) {
|
|
6314
5925
|
const err = error instanceof Error ? error : new Error('路由转换失败');
|
|
6315
5926
|
logger.logger.error('路由转换失败:', err);
|
|
6316
|
-
throw new
|
|
5927
|
+
throw new vlianUtils.ValidationError('路由转换失败', {
|
|
6317
5928
|
originalError: err
|
|
6318
5929
|
});
|
|
6319
5930
|
}
|
|
@@ -6816,7 +6427,7 @@
|
|
|
6816
6427
|
return routerConfigSchema.safeParse(config);
|
|
6817
6428
|
}
|
|
6818
6429
|
|
|
6819
|
-
function _define_property$
|
|
6430
|
+
function _define_property$q(obj, key, value) {
|
|
6820
6431
|
if (key in obj) {
|
|
6821
6432
|
Object.defineProperty(obj, key, {
|
|
6822
6433
|
value: value,
|
|
@@ -6833,7 +6444,7 @@
|
|
|
6833
6444
|
* 配置验证错误
|
|
6834
6445
|
*/ class ConfigValidationError extends Error {
|
|
6835
6446
|
constructor(message, errors){
|
|
6836
|
-
super(message), _define_property$
|
|
6447
|
+
super(message), _define_property$q(this, "errors", void 0), this.errors = errors;
|
|
6837
6448
|
this.name = 'ConfigValidationError';
|
|
6838
6449
|
}
|
|
6839
6450
|
}
|
|
@@ -7002,7 +6613,7 @@
|
|
|
7002
6613
|
}
|
|
7003
6614
|
}
|
|
7004
6615
|
|
|
7005
|
-
function _define_property$
|
|
6616
|
+
function _define_property$p(obj, key, value) {
|
|
7006
6617
|
if (key in obj) {
|
|
7007
6618
|
Object.defineProperty(obj, key, {
|
|
7008
6619
|
value: value,
|
|
@@ -7114,7 +6725,7 @@
|
|
|
7114
6725
|
return this.hooks.length;
|
|
7115
6726
|
}
|
|
7116
6727
|
constructor(){
|
|
7117
|
-
_define_property$
|
|
6728
|
+
_define_property$p(this, "hooks", []);
|
|
7118
6729
|
}
|
|
7119
6730
|
}
|
|
7120
6731
|
/**
|
|
@@ -7127,7 +6738,7 @@
|
|
|
7127
6738
|
return lifecycleManagerInstance;
|
|
7128
6739
|
}
|
|
7129
6740
|
|
|
7130
|
-
function _define_property$
|
|
6741
|
+
function _define_property$o(obj, key, value) {
|
|
7131
6742
|
if (key in obj) {
|
|
7132
6743
|
Object.defineProperty(obj, key, {
|
|
7133
6744
|
value: value,
|
|
@@ -7287,10 +6898,10 @@
|
|
|
7287
6898
|
return this.middlewares.length;
|
|
7288
6899
|
}
|
|
7289
6900
|
constructor(){
|
|
7290
|
-
_define_property$
|
|
6901
|
+
_define_property$o(this, "middlewares", []);
|
|
7291
6902
|
}
|
|
7292
6903
|
}
|
|
7293
|
-
_define_property$
|
|
6904
|
+
_define_property$o(RouterMiddlewareManager, "SAFE_REDIRECT_PATH_REGEX", /^(\/|\.\/|\.\.\/|#)/);
|
|
7294
6905
|
/**
|
|
7295
6906
|
* 获取路由中间件管理器单例
|
|
7296
6907
|
*/ let middlewareManagerInstance = null;
|
|
@@ -7360,6 +6971,22 @@
|
|
|
7360
6971
|
};
|
|
7361
6972
|
}
|
|
7362
6973
|
|
|
6974
|
+
const utils = vlianUtils__namespace;
|
|
6975
|
+
const ErrorCode = utils.ErrorCode;
|
|
6976
|
+
const ErrorMessages = utils.ErrorMessages;
|
|
6977
|
+
const getErrorMessage = utils.getErrorMessage;
|
|
6978
|
+
const getUserFriendlyMessage = utils.getUserFriendlyMessage;
|
|
6979
|
+
const ErrorType = utils.ErrorType;
|
|
6980
|
+
const ErrorSeverity = utils.ErrorSeverity;
|
|
6981
|
+
const FrameworkError = utils.FrameworkError;
|
|
6982
|
+
const InitializationError = utils.InitializationError;
|
|
6983
|
+
const ConfigError = utils.ConfigError;
|
|
6984
|
+
const StorageError = utils.StorageError;
|
|
6985
|
+
const NetworkError = utils.NetworkError;
|
|
6986
|
+
const ValidationError = utils.ValidationError;
|
|
6987
|
+
const SecurityError = utils.SecurityError;
|
|
6988
|
+
const errorUtils = utils.errorUtils;
|
|
6989
|
+
|
|
7363
6990
|
/**
|
|
7364
6991
|
* 路由错误代码
|
|
7365
6992
|
*/ var RouterErrorCode = /*#__PURE__*/ function(RouterErrorCode) {
|
|
@@ -7388,9 +7015,9 @@
|
|
|
7388
7015
|
}({});
|
|
7389
7016
|
/**
|
|
7390
7017
|
* 路由错误
|
|
7391
|
-
*/ class RouterError extends
|
|
7392
|
-
constructor(message, code, severity =
|
|
7393
|
-
super(message,
|
|
7018
|
+
*/ class RouterError extends FrameworkError {
|
|
7019
|
+
constructor(message, code, severity = ErrorSeverity.MEDIUM, cause, context){
|
|
7020
|
+
super(message, ErrorType.RUNTIME, severity, {
|
|
7394
7021
|
code,
|
|
7395
7022
|
originalError: cause,
|
|
7396
7023
|
context: context || {}
|
|
@@ -7404,7 +7031,7 @@
|
|
|
7404
7031
|
return new RouterError(message, code, severity, cause, context);
|
|
7405
7032
|
}
|
|
7406
7033
|
|
|
7407
|
-
function _define_property$
|
|
7034
|
+
function _define_property$n(obj, key, value) {
|
|
7408
7035
|
if (key in obj) {
|
|
7409
7036
|
Object.defineProperty(obj, key, {
|
|
7410
7037
|
value: value,
|
|
@@ -7642,12 +7269,12 @@
|
|
|
7642
7269
|
};
|
|
7643
7270
|
}
|
|
7644
7271
|
constructor(config = {}){
|
|
7645
|
-
_define_property$
|
|
7646
|
-
_define_property$
|
|
7647
|
-
_define_property$
|
|
7648
|
-
_define_property$
|
|
7649
|
-
_define_property$
|
|
7650
|
-
_define_property$
|
|
7272
|
+
_define_property$n(this, "cache", new Map());
|
|
7273
|
+
_define_property$n(this, "matchCache", new Map());
|
|
7274
|
+
_define_property$n(this, "config", void 0);
|
|
7275
|
+
_define_property$n(this, "persistenceEnabled", false);
|
|
7276
|
+
_define_property$n(this, "cleanupTimer", null);
|
|
7277
|
+
_define_property$n(this, "stats", {
|
|
7651
7278
|
transformHits: 0,
|
|
7652
7279
|
transformMisses: 0,
|
|
7653
7280
|
matchHits: 0,
|
|
@@ -7677,7 +7304,7 @@
|
|
|
7677
7304
|
return routeCacheInstance;
|
|
7678
7305
|
}
|
|
7679
7306
|
|
|
7680
|
-
function _define_property$
|
|
7307
|
+
function _define_property$m(obj, key, value) {
|
|
7681
7308
|
if (key in obj) {
|
|
7682
7309
|
Object.defineProperty(obj, key, {
|
|
7683
7310
|
value: value,
|
|
@@ -7927,10 +7554,10 @@
|
|
|
7927
7554
|
return stats;
|
|
7928
7555
|
}
|
|
7929
7556
|
constructor(config = {}){
|
|
7930
|
-
_define_property$
|
|
7931
|
-
_define_property$
|
|
7932
|
-
_define_property$
|
|
7933
|
-
_define_property$
|
|
7557
|
+
_define_property$m(this, "tasks", new Map());
|
|
7558
|
+
_define_property$m(this, "config", void 0);
|
|
7559
|
+
_define_property$m(this, "preloadTimer", null);
|
|
7560
|
+
_define_property$m(this, "idleHandle", null);
|
|
7934
7561
|
this.config = {
|
|
7935
7562
|
strategy: config.strategy ?? "none",
|
|
7936
7563
|
delay: config.delay ?? 1000,
|
|
@@ -7981,7 +7608,7 @@
|
|
|
7981
7608
|
return PluginLifecycleStage;
|
|
7982
7609
|
}({});
|
|
7983
7610
|
|
|
7984
|
-
function _define_property$
|
|
7611
|
+
function _define_property$l(obj, key, value) {
|
|
7985
7612
|
if (key in obj) {
|
|
7986
7613
|
Object.defineProperty(obj, key, {
|
|
7987
7614
|
value: value,
|
|
@@ -8210,7 +7837,7 @@
|
|
|
8210
7837
|
return this.plugins.size;
|
|
8211
7838
|
}
|
|
8212
7839
|
constructor(){
|
|
8213
|
-
_define_property$
|
|
7840
|
+
_define_property$l(this, "plugins", new Map());
|
|
8214
7841
|
}
|
|
8215
7842
|
}
|
|
8216
7843
|
/**
|
|
@@ -8223,7 +7850,7 @@
|
|
|
8223
7850
|
return pluginManagerInstance;
|
|
8224
7851
|
}
|
|
8225
7852
|
|
|
8226
|
-
function _define_property$
|
|
7853
|
+
function _define_property$k(obj, key, value) {
|
|
8227
7854
|
if (key in obj) {
|
|
8228
7855
|
Object.defineProperty(obj, key, {
|
|
8229
7856
|
value: value,
|
|
@@ -8404,12 +8031,12 @@
|
|
|
8404
8031
|
};
|
|
8405
8032
|
}
|
|
8406
8033
|
constructor(config = {}){
|
|
8407
|
-
_define_property$
|
|
8408
|
-
_define_property$
|
|
8409
|
-
_define_property$
|
|
8410
|
-
_define_property$
|
|
8411
|
-
_define_property$
|
|
8412
|
-
_define_property$
|
|
8034
|
+
_define_property$k(this, "accessRecords", []);
|
|
8035
|
+
_define_property$k(this, "performanceMetrics", new Map());
|
|
8036
|
+
_define_property$k(this, "config", void 0);
|
|
8037
|
+
_define_property$k(this, "monitoringService", monitoring.getMonitoring());
|
|
8038
|
+
_define_property$k(this, "currentRouteStartTime", 0);
|
|
8039
|
+
_define_property$k(this, "currentRoute", void 0);
|
|
8413
8040
|
this.config = {
|
|
8414
8041
|
enabled: config.enabled ?? true,
|
|
8415
8042
|
trackAccess: config.trackAccess ?? true,
|
|
@@ -8430,7 +8057,7 @@
|
|
|
8430
8057
|
return routerMonitoringInstance;
|
|
8431
8058
|
}
|
|
8432
8059
|
|
|
8433
|
-
function _define_property$
|
|
8060
|
+
function _define_property$j(obj, key, value) {
|
|
8434
8061
|
if (key in obj) {
|
|
8435
8062
|
Object.defineProperty(obj, key, {
|
|
8436
8063
|
value: value,
|
|
@@ -8630,9 +8257,9 @@
|
|
|
8630
8257
|
return this.adapters.size;
|
|
8631
8258
|
}
|
|
8632
8259
|
constructor(){
|
|
8633
|
-
_define_property$
|
|
8634
|
-
_define_property$
|
|
8635
|
-
_define_property$
|
|
8260
|
+
_define_property$j(this, "adapters", new Map());
|
|
8261
|
+
_define_property$j(this, "currentAdapter", null);
|
|
8262
|
+
_define_property$j(this, "defaultAdapterName", null);
|
|
8636
8263
|
}
|
|
8637
8264
|
}
|
|
8638
8265
|
/**
|
|
@@ -8647,7 +8274,7 @@
|
|
|
8647
8274
|
|
|
8648
8275
|
/**
|
|
8649
8276
|
* React Router 适配器实现
|
|
8650
|
-
*/ function _define_property$
|
|
8277
|
+
*/ function _define_property$i(obj, key, value) {
|
|
8651
8278
|
if (key in obj) {
|
|
8652
8279
|
Object.defineProperty(obj, key, {
|
|
8653
8280
|
value: value,
|
|
@@ -8743,9 +8370,9 @@
|
|
|
8743
8370
|
logger.logger.debug('React Router 适配器已销毁');
|
|
8744
8371
|
}
|
|
8745
8372
|
constructor(){
|
|
8746
|
-
_define_property$
|
|
8747
|
-
_define_property$
|
|
8748
|
-
_define_property$
|
|
8373
|
+
_define_property$i(this, "name", 'react-router');
|
|
8374
|
+
_define_property$i(this, "version", '6.0.0');
|
|
8375
|
+
_define_property$i(this, "router", null);
|
|
8749
8376
|
}
|
|
8750
8377
|
}
|
|
8751
8378
|
/**
|
|
@@ -8756,7 +8383,7 @@
|
|
|
8756
8383
|
};
|
|
8757
8384
|
}
|
|
8758
8385
|
|
|
8759
|
-
function _define_property$
|
|
8386
|
+
function _define_property$h(obj, key, value) {
|
|
8760
8387
|
if (key in obj) {
|
|
8761
8388
|
Object.defineProperty(obj, key, {
|
|
8762
8389
|
value: value,
|
|
@@ -8978,25 +8605,25 @@
|
|
|
8978
8605
|
/**
|
|
8979
8606
|
* 路由实例
|
|
8980
8607
|
* 只能在 initialize 方法中赋值
|
|
8981
|
-
*/ _define_property$
|
|
8608
|
+
*/ _define_property$h(this, "router", null);
|
|
8982
8609
|
/**
|
|
8983
8610
|
* 是否已初始化
|
|
8984
|
-
*/ _define_property$
|
|
8611
|
+
*/ _define_property$h(this, "initialized", false);
|
|
8985
8612
|
/**
|
|
8986
8613
|
* 路由缓存实例
|
|
8987
|
-
*/ _define_property$
|
|
8614
|
+
*/ _define_property$h(this, "cache", getRouteCache());
|
|
8988
8615
|
/**
|
|
8989
8616
|
* 路由预加载器实例
|
|
8990
|
-
*/ _define_property$
|
|
8617
|
+
*/ _define_property$h(this, "preloader", getRoutePreloader());
|
|
8991
8618
|
/**
|
|
8992
8619
|
* 路由插件管理器实例
|
|
8993
|
-
*/ _define_property$
|
|
8620
|
+
*/ _define_property$h(this, "pluginManager", getRouterPluginManager());
|
|
8994
8621
|
/**
|
|
8995
8622
|
* 路由监控服务实例
|
|
8996
|
-
*/ _define_property$
|
|
8623
|
+
*/ _define_property$h(this, "monitoring", getRouterMonitoring());
|
|
8997
8624
|
/**
|
|
8998
8625
|
* 路由适配器管理器实例
|
|
8999
|
-
*/ _define_property$
|
|
8626
|
+
*/ _define_property$h(this, "adapterManager", getAdapterManager());
|
|
9000
8627
|
// 私有构造函数
|
|
9001
8628
|
// 注册默认的 React Router 适配器
|
|
9002
8629
|
this.adapterManager.register({
|
|
@@ -9006,7 +8633,7 @@
|
|
|
9006
8633
|
});
|
|
9007
8634
|
}
|
|
9008
8635
|
}
|
|
9009
|
-
_define_property$
|
|
8636
|
+
_define_property$h(RouterManager, "instance", null);
|
|
9010
8637
|
/**
|
|
9011
8638
|
* 获取路由管理器
|
|
9012
8639
|
*/ function getRouterManager() {
|
|
@@ -9019,7 +8646,7 @@
|
|
|
9019
8646
|
getRouterManager: getRouterManager
|
|
9020
8647
|
});
|
|
9021
8648
|
|
|
9022
|
-
function _define_property$
|
|
8649
|
+
function _define_property$g(obj, key, value) {
|
|
9023
8650
|
if (key in obj) {
|
|
9024
8651
|
Object.defineProperty(obj, key, {
|
|
9025
8652
|
value: value,
|
|
@@ -9147,7 +8774,7 @@
|
|
|
9147
8774
|
Promise.resolve().then(()=>{
|
|
9148
8775
|
try {
|
|
9149
8776
|
const configStr = JSON.stringify(options);
|
|
9150
|
-
const validation =
|
|
8777
|
+
const validation = vlianUtils.SecurityUtils.validateInput(configStr);
|
|
9151
8778
|
if (!validation.safe) {
|
|
9152
8779
|
services.monitoring.captureError(new Error('配置项包含不安全内容'), {
|
|
9153
8780
|
reason: validation.reason
|
|
@@ -9267,15 +8894,15 @@
|
|
|
9267
8894
|
return this.container;
|
|
9268
8895
|
}
|
|
9269
8896
|
constructor(){
|
|
9270
|
-
_define_property$
|
|
9271
|
-
_define_property$
|
|
8897
|
+
_define_property$g(this, "root", null);
|
|
8898
|
+
_define_property$g(this, "container", null);
|
|
9272
8899
|
}
|
|
9273
8900
|
}
|
|
9274
8901
|
|
|
9275
8902
|
/**
|
|
9276
8903
|
* 性能追踪模块
|
|
9277
8904
|
* 负责收集和上报启动性能指标
|
|
9278
|
-
*/ function _define_property$
|
|
8905
|
+
*/ function _define_property$f(obj, key, value) {
|
|
9279
8906
|
if (key in obj) {
|
|
9280
8907
|
Object.defineProperty(obj, key, {
|
|
9281
8908
|
value: value,
|
|
@@ -9430,9 +9057,9 @@
|
|
|
9430
9057
|
return performance.now() - this.startTime;
|
|
9431
9058
|
}
|
|
9432
9059
|
constructor(monitoring){
|
|
9433
|
-
_define_property$
|
|
9434
|
-
_define_property$
|
|
9435
|
-
_define_property$
|
|
9060
|
+
_define_property$f(this, "monitoring", void 0);
|
|
9061
|
+
_define_property$f(this, "metrics", {});
|
|
9062
|
+
_define_property$f(this, "startTime", void 0);
|
|
9436
9063
|
this.monitoring = monitoring;
|
|
9437
9064
|
this.startTime = performance.now();
|
|
9438
9065
|
}
|
|
@@ -9441,7 +9068,7 @@
|
|
|
9441
9068
|
/**
|
|
9442
9069
|
* 应用实例管理模块
|
|
9443
9070
|
* 支持多实例隔离
|
|
9444
|
-
*/ function _define_property$
|
|
9071
|
+
*/ function _define_property$e(obj, key, value) {
|
|
9445
9072
|
if (key in obj) {
|
|
9446
9073
|
Object.defineProperty(obj, key, {
|
|
9447
9074
|
value: value,
|
|
@@ -9533,25 +9160,25 @@
|
|
|
9533
9160
|
constructor(id, options){
|
|
9534
9161
|
/**
|
|
9535
9162
|
* 实例ID
|
|
9536
|
-
*/ _define_property$
|
|
9163
|
+
*/ _define_property$e(this, "id", void 0);
|
|
9537
9164
|
/**
|
|
9538
9165
|
* 应用渲染器
|
|
9539
|
-
*/ _define_property$
|
|
9166
|
+
*/ _define_property$e(this, "renderer", void 0);
|
|
9540
9167
|
/**
|
|
9541
9168
|
* 服务实例
|
|
9542
|
-
*/ _define_property$
|
|
9169
|
+
*/ _define_property$e(this, "services", null);
|
|
9543
9170
|
/**
|
|
9544
9171
|
* 性能追踪器
|
|
9545
|
-
*/ _define_property$
|
|
9172
|
+
*/ _define_property$e(this, "performanceTracker", null);
|
|
9546
9173
|
/**
|
|
9547
9174
|
* 启动配置
|
|
9548
|
-
*/ _define_property$
|
|
9175
|
+
*/ _define_property$e(this, "options", void 0);
|
|
9549
9176
|
/**
|
|
9550
9177
|
* 是否已初始化
|
|
9551
|
-
*/ _define_property$
|
|
9178
|
+
*/ _define_property$e(this, "initialized", false);
|
|
9552
9179
|
/**
|
|
9553
9180
|
* 是否已销毁
|
|
9554
|
-
*/ _define_property$
|
|
9181
|
+
*/ _define_property$e(this, "destroyed", false);
|
|
9555
9182
|
this.id = id;
|
|
9556
9183
|
this.options = options;
|
|
9557
9184
|
this.renderer = new AppRenderer();
|
|
@@ -9649,19 +9276,19 @@
|
|
|
9649
9276
|
this.defaultInstanceId = null;
|
|
9650
9277
|
}
|
|
9651
9278
|
constructor(){
|
|
9652
|
-
_define_property$
|
|
9653
|
-
_define_property$
|
|
9279
|
+
_define_property$e(this, "instances", new Map());
|
|
9280
|
+
_define_property$e(this, "defaultInstanceId", null);
|
|
9654
9281
|
// 私有构造函数
|
|
9655
9282
|
}
|
|
9656
9283
|
}
|
|
9657
|
-
_define_property$
|
|
9284
|
+
_define_property$e(AppInstanceManager, "instance", null);
|
|
9658
9285
|
/**
|
|
9659
9286
|
* 获取应用实例管理器
|
|
9660
9287
|
*/ function getAppInstanceManager() {
|
|
9661
9288
|
return AppInstanceManager.getInstance();
|
|
9662
9289
|
}
|
|
9663
9290
|
|
|
9664
|
-
function _define_property$
|
|
9291
|
+
function _define_property$d(obj, key, value) {
|
|
9665
9292
|
if (key in obj) {
|
|
9666
9293
|
Object.defineProperty(obj, key, {
|
|
9667
9294
|
value: value,
|
|
@@ -9797,17 +9424,17 @@
|
|
|
9797
9424
|
}
|
|
9798
9425
|
}
|
|
9799
9426
|
constructor(){
|
|
9800
|
-
_define_property$
|
|
9801
|
-
_define_property$
|
|
9802
|
-
_define_property$
|
|
9803
|
-
_define_property$
|
|
9427
|
+
_define_property$d(this, "environment", void 0);
|
|
9428
|
+
_define_property$d(this, "isBrowser", void 0);
|
|
9429
|
+
_define_property$d(this, "isSSR", void 0);
|
|
9430
|
+
_define_property$d(this, "isMicroFrontend", void 0);
|
|
9804
9431
|
this.isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
9805
9432
|
this.isSSR = typeof window === 'undefined' && typeof process !== 'undefined';
|
|
9806
9433
|
this.isMicroFrontend = this.detectMicroFrontend();
|
|
9807
9434
|
this.environment = this.detectEnvironment();
|
|
9808
9435
|
}
|
|
9809
9436
|
}
|
|
9810
|
-
_define_property$
|
|
9437
|
+
_define_property$d(EnvironmentDetector, "instance", null);
|
|
9811
9438
|
/**
|
|
9812
9439
|
* 获取环境检测器实例
|
|
9813
9440
|
*/ function getEnvironmentDetector() {
|
|
@@ -9872,7 +9499,7 @@
|
|
|
9872
9499
|
/**
|
|
9873
9500
|
* 框架生命周期事件集成
|
|
9874
9501
|
* 自动在框架关键节点触发事件
|
|
9875
|
-
*/ function _define_property$
|
|
9502
|
+
*/ function _define_property$c(obj, key, value) {
|
|
9876
9503
|
if (key in obj) {
|
|
9877
9504
|
Object.defineProperty(obj, key, {
|
|
9878
9505
|
value: value,
|
|
@@ -9997,12 +9624,12 @@
|
|
|
9997
9624
|
});
|
|
9998
9625
|
}
|
|
9999
9626
|
constructor(eventBus){
|
|
10000
|
-
_define_property$
|
|
9627
|
+
_define_property$c(this, "eventBus", void 0);
|
|
10001
9628
|
this.eventBus = eventBus;
|
|
10002
9629
|
}
|
|
10003
9630
|
}
|
|
10004
9631
|
|
|
10005
|
-
function _define_property$
|
|
9632
|
+
function _define_property$b(obj, key, value) {
|
|
10006
9633
|
if (key in obj) {
|
|
10007
9634
|
Object.defineProperty(obj, key, {
|
|
10008
9635
|
value: value,
|
|
@@ -10024,7 +9651,7 @@
|
|
|
10024
9651
|
}
|
|
10025
9652
|
class KernelBootError extends Error {
|
|
10026
9653
|
constructor(message, options){
|
|
10027
|
-
super(message), _define_property$
|
|
9654
|
+
super(message), _define_property$b(this, "code", void 0), _define_property$b(this, "phase", void 0), _define_property$b(this, "severity", void 0), _define_property$b(this, "retryable", void 0), _define_property$b(this, "traceId", void 0), _define_property$b(this, "cause", void 0);
|
|
10028
9655
|
this.name = 'KernelBootError';
|
|
10029
9656
|
this.code = options.code;
|
|
10030
9657
|
this.phase = options.phase;
|
|
@@ -10054,7 +9681,7 @@
|
|
|
10054
9681
|
});
|
|
10055
9682
|
}
|
|
10056
9683
|
|
|
10057
|
-
function _define_property$
|
|
9684
|
+
function _define_property$a(obj, key, value) {
|
|
10058
9685
|
if (key in obj) {
|
|
10059
9686
|
Object.defineProperty(obj, key, {
|
|
10060
9687
|
value: value,
|
|
@@ -10131,7 +9758,7 @@
|
|
|
10131
9758
|
}
|
|
10132
9759
|
}
|
|
10133
9760
|
constructor(){
|
|
10134
|
-
_define_property$
|
|
9761
|
+
_define_property$a(this, "instance", null);
|
|
10135
9762
|
}
|
|
10136
9763
|
};
|
|
10137
9764
|
let DefaultEventBusAdapter = class DefaultEventBusAdapter {
|
|
@@ -10163,7 +9790,7 @@
|
|
|
10163
9790
|
}
|
|
10164
9791
|
}
|
|
10165
9792
|
constructor(){
|
|
10166
|
-
_define_property$
|
|
9793
|
+
_define_property$a(this, "bus", null);
|
|
10167
9794
|
}
|
|
10168
9795
|
};
|
|
10169
9796
|
const defaultI18nAdapter = {
|
|
@@ -10432,9 +10059,9 @@
|
|
|
10432
10059
|
// 1. 环境检测和容器获取
|
|
10433
10060
|
const container = options.container || envDetector.safeGetElement('#root');
|
|
10434
10061
|
if (!container) {
|
|
10435
|
-
throw new
|
|
10062
|
+
throw new vlianUtils.InitializationError('未找到挂载容器', undefined, {
|
|
10436
10063
|
container: options.container
|
|
10437
|
-
},
|
|
10064
|
+
}, vlianUtils.ErrorCode.CONTAINER_NOT_FOUND);
|
|
10438
10065
|
}
|
|
10439
10066
|
logger.logger.info('框架启动中...');
|
|
10440
10067
|
if (options.antd && !options.uiProvider) {
|
|
@@ -10710,7 +10337,7 @@
|
|
|
10710
10337
|
}
|
|
10711
10338
|
}
|
|
10712
10339
|
|
|
10713
|
-
function _define_property$
|
|
10340
|
+
function _define_property$9(obj, key, value) {
|
|
10714
10341
|
if (key in obj) {
|
|
10715
10342
|
Object.defineProperty(obj, key, {
|
|
10716
10343
|
value: value,
|
|
@@ -10764,7 +10391,7 @@
|
|
|
10764
10391
|
this.listeners.clear();
|
|
10765
10392
|
}
|
|
10766
10393
|
constructor(){
|
|
10767
|
-
_define_property$
|
|
10394
|
+
_define_property$9(this, "listeners", new Set());
|
|
10768
10395
|
}
|
|
10769
10396
|
};
|
|
10770
10397
|
/**
|
|
@@ -11015,7 +10642,7 @@
|
|
|
11015
10642
|
}
|
|
11016
10643
|
}
|
|
11017
10644
|
|
|
11018
|
-
function _define_property$
|
|
10645
|
+
function _define_property$8(obj, key, value) {
|
|
11019
10646
|
if (key in obj) {
|
|
11020
10647
|
Object.defineProperty(obj, key, {
|
|
11021
10648
|
value: value,
|
|
@@ -11198,9 +10825,9 @@
|
|
|
11198
10825
|
});
|
|
11199
10826
|
}
|
|
11200
10827
|
}
|
|
11201
|
-
_define_property$
|
|
10828
|
+
_define_property$8(RouterNavigation, "MAX_REDIRECTS", 10);
|
|
11202
10829
|
|
|
11203
|
-
function _define_property$
|
|
10830
|
+
function _define_property$7(obj, key, value) {
|
|
11204
10831
|
if (key in obj) {
|
|
11205
10832
|
Object.defineProperty(obj, key, {
|
|
11206
10833
|
value: value,
|
|
@@ -11357,8 +10984,8 @@
|
|
|
11357
10984
|
logger.logger.info('路由重新加载完成');
|
|
11358
10985
|
}
|
|
11359
10986
|
constructor(){
|
|
11360
|
-
_define_property$
|
|
11361
|
-
_define_property$
|
|
10987
|
+
_define_property$7(this, "registeredRoutes", new Map());
|
|
10988
|
+
_define_property$7(this, "routeVersion", 0);
|
|
11362
10989
|
}
|
|
11363
10990
|
}
|
|
11364
10991
|
/**
|
|
@@ -11371,7 +10998,7 @@
|
|
|
11371
10998
|
return dynamicRouteManagerInstance;
|
|
11372
10999
|
}
|
|
11373
11000
|
|
|
11374
|
-
function _define_property$
|
|
11001
|
+
function _define_property$6(obj, key, value) {
|
|
11375
11002
|
if (key in obj) {
|
|
11376
11003
|
Object.defineProperty(obj, key, {
|
|
11377
11004
|
value: value,
|
|
@@ -11533,9 +11160,9 @@
|
|
|
11533
11160
|
return this.migrate(this.config.currentVersion, version, routes);
|
|
11534
11161
|
}
|
|
11535
11162
|
constructor(config){
|
|
11536
|
-
_define_property$
|
|
11537
|
-
_define_property$
|
|
11538
|
-
_define_property$
|
|
11163
|
+
_define_property$6(this, "versions", new Map());
|
|
11164
|
+
_define_property$6(this, "migrations", new Map());
|
|
11165
|
+
_define_property$6(this, "config", void 0);
|
|
11539
11166
|
this.config = {
|
|
11540
11167
|
enableVersionCheck: config.enableVersionCheck ?? true,
|
|
11541
11168
|
enableAutoMigration: config.enableAutoMigration ?? false,
|
|
@@ -11844,85 +11471,493 @@
|
|
|
11844
11471
|
]
|
|
11845
11472
|
});
|
|
11846
11473
|
}
|
|
11847
|
-
function resolvePosition(position) {
|
|
11848
|
-
const style = {
|
|
11849
|
-
position: 'fixed',
|
|
11850
|
-
zIndex: 9998
|
|
11851
|
-
};
|
|
11852
|
-
const pos = position || 'bottom-right';
|
|
11853
|
-
if (pos.includes('bottom')) style.bottom = 16;
|
|
11854
|
-
if (pos.includes('top')) style.top = 16;
|
|
11855
|
-
if (pos.includes('right')) style.right = 16;
|
|
11856
|
-
if (pos.includes('left')) style.left = 16;
|
|
11857
|
-
return style;
|
|
11474
|
+
function resolvePosition(position) {
|
|
11475
|
+
const style = {
|
|
11476
|
+
position: 'fixed',
|
|
11477
|
+
zIndex: 9998
|
|
11478
|
+
};
|
|
11479
|
+
const pos = position || 'bottom-right';
|
|
11480
|
+
if (pos.includes('bottom')) style.bottom = 16;
|
|
11481
|
+
if (pos.includes('top')) style.top = 16;
|
|
11482
|
+
if (pos.includes('right')) style.right = 16;
|
|
11483
|
+
if (pos.includes('left')) style.left = 16;
|
|
11484
|
+
return style;
|
|
11485
|
+
}
|
|
11486
|
+
function DevToolsTrigger({ appInstance, position = 'bottom-right' }) {
|
|
11487
|
+
const [visible, setVisible] = React.useState(false);
|
|
11488
|
+
if (process.env.NODE_ENV !== 'development') {
|
|
11489
|
+
return null;
|
|
11490
|
+
}
|
|
11491
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
11492
|
+
children: [
|
|
11493
|
+
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
11494
|
+
onClick: ()=>setVisible(true),
|
|
11495
|
+
style: {
|
|
11496
|
+
...resolvePosition(position),
|
|
11497
|
+
border: 'none',
|
|
11498
|
+
background: '#2f80ed',
|
|
11499
|
+
color: '#fff',
|
|
11500
|
+
borderRadius: 999,
|
|
11501
|
+
padding: '8px 14px',
|
|
11502
|
+
cursor: 'pointer'
|
|
11503
|
+
},
|
|
11504
|
+
children: "DevTools"
|
|
11505
|
+
}),
|
|
11506
|
+
/*#__PURE__*/ jsxRuntime.jsx(DevTools, {
|
|
11507
|
+
appInstance: appInstance,
|
|
11508
|
+
visible: visible,
|
|
11509
|
+
onClose: ()=>setVisible(false)
|
|
11510
|
+
})
|
|
11511
|
+
]
|
|
11512
|
+
});
|
|
11513
|
+
}
|
|
11514
|
+
|
|
11515
|
+
/**
|
|
11516
|
+
* 启动框架
|
|
11517
|
+
*
|
|
11518
|
+
* @param options - 启动配置选项
|
|
11519
|
+
* @returns Promise<void>
|
|
11520
|
+
*
|
|
11521
|
+
* @example
|
|
11522
|
+
* ```typescript
|
|
11523
|
+
* import { start } from '@vlian/framework';
|
|
11524
|
+
*
|
|
11525
|
+
* start({
|
|
11526
|
+
* loggerLevel: LogLevel.DEBUG,
|
|
11527
|
+
* lifecycle: {
|
|
11528
|
+
* beforeInitialization: async () => {
|
|
11529
|
+
* console.log('初始化前执行');
|
|
11530
|
+
* },
|
|
11531
|
+
* },
|
|
11532
|
+
* });
|
|
11533
|
+
* ```
|
|
11534
|
+
*/ /**
|
|
11535
|
+
* 启动框架(向后兼容的API)
|
|
11536
|
+
*
|
|
11537
|
+
* @param options - 启动配置选项
|
|
11538
|
+
* @returns Promise<void>
|
|
11539
|
+
*
|
|
11540
|
+
* @deprecated 建议使用 startApp 函数,支持多实例
|
|
11541
|
+
*/ const start = async (options = {})=>{
|
|
11542
|
+
// 使用新的启动函数,保持向后兼容
|
|
11543
|
+
await startApp(options);
|
|
11544
|
+
};
|
|
11545
|
+
// 导出getStateManager(向后兼容)
|
|
11546
|
+
const getStateManager = ()=>{
|
|
11547
|
+
const instanceManager = getAppInstanceManager();
|
|
11548
|
+
const instance = instanceManager.getInstance();
|
|
11549
|
+
if (instance) {
|
|
11550
|
+
return instance.getServices().stateManager;
|
|
11551
|
+
}
|
|
11552
|
+
return null;
|
|
11553
|
+
};
|
|
11554
|
+
|
|
11555
|
+
/**
|
|
11556
|
+
* 配置安全工具类
|
|
11557
|
+
*/ class ConfigSecurity {
|
|
11558
|
+
/**
|
|
11559
|
+
* 验证配置签名
|
|
11560
|
+
*/ static async verifySignature(config, signature, options) {
|
|
11561
|
+
if (!options.enabled) {
|
|
11562
|
+
return true;
|
|
11563
|
+
}
|
|
11564
|
+
if (!options.publicKey) {
|
|
11565
|
+
throw new SecurityError('签名验证需要提供公钥');
|
|
11566
|
+
}
|
|
11567
|
+
if (!signature || signature.length === 0) {
|
|
11568
|
+
throw new SecurityError('签名不能为空');
|
|
11569
|
+
}
|
|
11570
|
+
try {
|
|
11571
|
+
// 使用 Web Crypto API 验证签名
|
|
11572
|
+
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
11573
|
+
throw new SecurityError('签名验证需要浏览器支持 Web Crypto API');
|
|
11574
|
+
}
|
|
11575
|
+
// 将配置转换为字符串(用于签名验证)
|
|
11576
|
+
// 使用稳定的 JSON 序列化(按键排序)
|
|
11577
|
+
const configString = JSON.stringify(config, Object.keys(config).sort());
|
|
11578
|
+
const encoder = new TextEncoder();
|
|
11579
|
+
const data = encoder.encode(configString);
|
|
11580
|
+
// 将签名从 Base64 解码
|
|
11581
|
+
const signatureBuffer = Uint8Array.from(atob(signature), (c)=>c.charCodeAt(0));
|
|
11582
|
+
// 导入公钥(支持 PEM 格式)
|
|
11583
|
+
const algorithm = options.algorithm || 'RSASSA-PKCS1-v1_5';
|
|
11584
|
+
let publicKey;
|
|
11585
|
+
try {
|
|
11586
|
+
// 尝试导入 PEM 格式的公钥
|
|
11587
|
+
const pemHeader = '-----BEGIN PUBLIC KEY-----';
|
|
11588
|
+
const pemFooter = '-----END PUBLIC KEY-----';
|
|
11589
|
+
let pemKey = options.publicKey;
|
|
11590
|
+
if (!pemKey.includes(pemHeader)) {
|
|
11591
|
+
pemKey = `${pemHeader}\n${pemKey}\n${pemFooter}`;
|
|
11592
|
+
}
|
|
11593
|
+
// 将 PEM 转换为 ArrayBuffer
|
|
11594
|
+
const pemContents = pemKey.replace(pemHeader, '').replace(pemFooter, '').replace(/\s/g, '');
|
|
11595
|
+
const binaryDer = Uint8Array.from(atob(pemContents), (c)=>c.charCodeAt(0));
|
|
11596
|
+
publicKey = await window.crypto.subtle.importKey('spki', binaryDer.buffer, {
|
|
11597
|
+
name: algorithm,
|
|
11598
|
+
hash: 'SHA-256'
|
|
11599
|
+
}, false, [
|
|
11600
|
+
'verify'
|
|
11601
|
+
]);
|
|
11602
|
+
} catch (importError) {
|
|
11603
|
+
throw new SecurityError('公钥导入失败', importError instanceof Error ? importError : undefined);
|
|
11604
|
+
}
|
|
11605
|
+
// 验证签名
|
|
11606
|
+
const isValid = await window.crypto.subtle.verify({
|
|
11607
|
+
name: algorithm
|
|
11608
|
+
}, publicKey, signatureBuffer, data);
|
|
11609
|
+
return isValid;
|
|
11610
|
+
} catch (error) {
|
|
11611
|
+
if (error instanceof SecurityError) {
|
|
11612
|
+
throw error;
|
|
11613
|
+
}
|
|
11614
|
+
throw new SecurityError('签名验证失败', error instanceof Error ? error : undefined);
|
|
11615
|
+
}
|
|
11616
|
+
}
|
|
11617
|
+
/**
|
|
11618
|
+
* 验证配置来源
|
|
11619
|
+
*/ static verifyOrigin(options) {
|
|
11620
|
+
if (!options.allowedOrigins || options.allowedOrigins.length === 0) {
|
|
11621
|
+
return true; // 如果没有配置白名单,允许所有来源
|
|
11622
|
+
}
|
|
11623
|
+
if (typeof window === 'undefined') {
|
|
11624
|
+
return true; // 非浏览器环境,跳过验证
|
|
11625
|
+
}
|
|
11626
|
+
const currentOrigin = window.location.origin;
|
|
11627
|
+
const referer = document.referrer;
|
|
11628
|
+
// 验证当前来源
|
|
11629
|
+
if (options.allowedOrigins.includes(currentOrigin)) {
|
|
11630
|
+
return true;
|
|
11631
|
+
}
|
|
11632
|
+
// 验证 Referer
|
|
11633
|
+
if (options.verifyReferer && referer) {
|
|
11634
|
+
try {
|
|
11635
|
+
const refererOrigin = new URL(referer).origin;
|
|
11636
|
+
if (options.allowedOrigins.includes(refererOrigin)) {
|
|
11637
|
+
return true;
|
|
11638
|
+
}
|
|
11639
|
+
} catch {
|
|
11640
|
+
// Referer 解析失败
|
|
11641
|
+
}
|
|
11642
|
+
}
|
|
11643
|
+
return false;
|
|
11644
|
+
}
|
|
11645
|
+
/**
|
|
11646
|
+
* 验证配置白名单
|
|
11647
|
+
*/ static verifyWhitelist(config, options) {
|
|
11648
|
+
const errors = [];
|
|
11649
|
+
// 检查允许的键
|
|
11650
|
+
if (options.allowedKeys && options.allowedKeys.length > 0) {
|
|
11651
|
+
const configKeys = Object.keys(config);
|
|
11652
|
+
const invalidKeys = configKeys.filter((key)=>!options.allowedKeys.includes(key));
|
|
11653
|
+
if (invalidKeys.length > 0) {
|
|
11654
|
+
errors.push(`配置包含不允许的键: ${invalidKeys.join(', ')}`);
|
|
11655
|
+
}
|
|
11656
|
+
}
|
|
11657
|
+
// 检查禁止的键
|
|
11658
|
+
if (options.forbiddenKeys && options.forbiddenKeys.length > 0) {
|
|
11659
|
+
const configKeys = Object.keys(config);
|
|
11660
|
+
const forbiddenFound = configKeys.filter((key)=>options.forbiddenKeys.includes(key));
|
|
11661
|
+
if (forbiddenFound.length > 0) {
|
|
11662
|
+
errors.push(`配置包含禁止的键: ${forbiddenFound.join(', ')}`);
|
|
11663
|
+
}
|
|
11664
|
+
}
|
|
11665
|
+
// 验证配置值
|
|
11666
|
+
if (options.valueSchema) {
|
|
11667
|
+
const result = vlianUtils.Validator.validateObject(options.valueSchema, config);
|
|
11668
|
+
if (!result.valid) {
|
|
11669
|
+
errors.push(...result.errors);
|
|
11670
|
+
}
|
|
11671
|
+
}
|
|
11672
|
+
return {
|
|
11673
|
+
valid: errors.length === 0,
|
|
11674
|
+
errors
|
|
11675
|
+
};
|
|
11676
|
+
}
|
|
11677
|
+
/**
|
|
11678
|
+
* 清理配置中的危险内容
|
|
11679
|
+
*/ static sanitizeConfig(config) {
|
|
11680
|
+
const sanitized = {};
|
|
11681
|
+
for (const [key, value] of Object.entries(config)){
|
|
11682
|
+
if (typeof value === 'string') {
|
|
11683
|
+
// 检查是否包含危险内容
|
|
11684
|
+
const validation = vlianUtils.SecurityUtils.validateInput(value);
|
|
11685
|
+
if (validation.safe && validation.sanitized) {
|
|
11686
|
+
sanitized[key] = validation.sanitized;
|
|
11687
|
+
} else {
|
|
11688
|
+
// 包含危险内容,跳过或记录警告
|
|
11689
|
+
console.warn(`配置项 ${key} 包含潜在危险内容,已跳过`);
|
|
11690
|
+
}
|
|
11691
|
+
} else if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
11692
|
+
// 递归清理对象
|
|
11693
|
+
sanitized[key] = this.sanitizeConfig(value);
|
|
11694
|
+
} else {
|
|
11695
|
+
sanitized[key] = value;
|
|
11696
|
+
}
|
|
11697
|
+
}
|
|
11698
|
+
return sanitized;
|
|
11699
|
+
}
|
|
11700
|
+
/**
|
|
11701
|
+
* 验证配置安全性
|
|
11702
|
+
*/ static async validateConfigSecurity(config, options) {
|
|
11703
|
+
const errors = [];
|
|
11704
|
+
// 验证来源
|
|
11705
|
+
if (options.origin) {
|
|
11706
|
+
const originValid = this.verifyOrigin(options.origin);
|
|
11707
|
+
if (!originValid) {
|
|
11708
|
+
errors.push('配置来源验证失败');
|
|
11709
|
+
}
|
|
11710
|
+
}
|
|
11711
|
+
// 验证白名单
|
|
11712
|
+
if (options.whitelist) {
|
|
11713
|
+
const whitelistResult = this.verifyWhitelist(config, options.whitelist);
|
|
11714
|
+
if (!whitelistResult.valid) {
|
|
11715
|
+
errors.push(...whitelistResult.errors);
|
|
11716
|
+
}
|
|
11717
|
+
}
|
|
11718
|
+
// 清理配置(已实现但暂不使用返回值)
|
|
11719
|
+
// const sanitizedConfig = this.sanitizeConfig(config);
|
|
11720
|
+
return {
|
|
11721
|
+
valid: errors.length === 0,
|
|
11722
|
+
errors
|
|
11723
|
+
};
|
|
11724
|
+
}
|
|
11725
|
+
}
|
|
11726
|
+
|
|
11727
|
+
var runtimeSecurity = /*#__PURE__*/Object.freeze({
|
|
11728
|
+
__proto__: null,
|
|
11729
|
+
RuntimeSecurity: vlianUtils.RuntimeSecurity
|
|
11730
|
+
});
|
|
11731
|
+
|
|
11732
|
+
function _define_property$5(obj, key, value) {
|
|
11733
|
+
if (key in obj) {
|
|
11734
|
+
Object.defineProperty(obj, key, {
|
|
11735
|
+
value: value,
|
|
11736
|
+
enumerable: true,
|
|
11737
|
+
configurable: true,
|
|
11738
|
+
writable: true
|
|
11739
|
+
});
|
|
11740
|
+
} else {
|
|
11741
|
+
obj[key] = value;
|
|
11742
|
+
}
|
|
11743
|
+
return obj;
|
|
11744
|
+
}
|
|
11745
|
+
/**
|
|
11746
|
+
* 分析服务类
|
|
11747
|
+
*/ class AnalyticsService {
|
|
11748
|
+
/**
|
|
11749
|
+
* 启动批量上报定时器
|
|
11750
|
+
*/ startBatchTimer() {
|
|
11751
|
+
if (this.batchTimer) {
|
|
11752
|
+
return;
|
|
11753
|
+
}
|
|
11754
|
+
this.batchTimer = setInterval(()=>{
|
|
11755
|
+
this.flush();
|
|
11756
|
+
}, this.config.batchInterval);
|
|
11757
|
+
}
|
|
11758
|
+
/**
|
|
11759
|
+
* 停止批量上报定时器
|
|
11760
|
+
*/ stopBatchTimer() {
|
|
11761
|
+
if (this.batchTimer) {
|
|
11762
|
+
clearInterval(this.batchTimer);
|
|
11763
|
+
this.batchTimer = null;
|
|
11764
|
+
}
|
|
11765
|
+
}
|
|
11766
|
+
/**
|
|
11767
|
+
* 记录事件
|
|
11768
|
+
*/ track(event) {
|
|
11769
|
+
if (!this.config.enabled) {
|
|
11770
|
+
return;
|
|
11771
|
+
}
|
|
11772
|
+
// 采样检查
|
|
11773
|
+
if (Math.random() > this.config.sampleRate) {
|
|
11774
|
+
return;
|
|
11775
|
+
}
|
|
11776
|
+
// 匿名化处理
|
|
11777
|
+
const anonymizedEvent = {
|
|
11778
|
+
...event,
|
|
11779
|
+
timestamp: Date.now(),
|
|
11780
|
+
properties: this.anonymizeProperties(event.properties)
|
|
11781
|
+
};
|
|
11782
|
+
// 添加到队列
|
|
11783
|
+
this.eventQueue.push(anonymizedEvent);
|
|
11784
|
+
// 立即上报单个事件
|
|
11785
|
+
if (this.config.onEvent) {
|
|
11786
|
+
this.config.onEvent(anonymizedEvent);
|
|
11787
|
+
}
|
|
11788
|
+
// 检查是否需要批量上报
|
|
11789
|
+
if (this.eventQueue.length >= this.config.batchSize) {
|
|
11790
|
+
this.flush();
|
|
11791
|
+
}
|
|
11792
|
+
}
|
|
11793
|
+
/**
|
|
11794
|
+
* 记录页面浏览
|
|
11795
|
+
*/ trackPageView(page, properties) {
|
|
11796
|
+
this.track({
|
|
11797
|
+
type: 'pageview',
|
|
11798
|
+
name: 'page_view',
|
|
11799
|
+
properties: {
|
|
11800
|
+
page,
|
|
11801
|
+
...properties
|
|
11802
|
+
}
|
|
11803
|
+
});
|
|
11804
|
+
}
|
|
11805
|
+
/**
|
|
11806
|
+
* 记录点击事件
|
|
11807
|
+
*/ trackClick(element, properties) {
|
|
11808
|
+
this.track({
|
|
11809
|
+
type: 'click',
|
|
11810
|
+
name: 'click',
|
|
11811
|
+
properties: {
|
|
11812
|
+
element,
|
|
11813
|
+
...properties
|
|
11814
|
+
}
|
|
11815
|
+
});
|
|
11816
|
+
}
|
|
11817
|
+
/**
|
|
11818
|
+
* 记录自定义事件
|
|
11819
|
+
*/ trackCustom(name, properties) {
|
|
11820
|
+
this.track({
|
|
11821
|
+
type: 'custom',
|
|
11822
|
+
name,
|
|
11823
|
+
properties
|
|
11824
|
+
});
|
|
11825
|
+
}
|
|
11826
|
+
/**
|
|
11827
|
+
* 记录错误事件
|
|
11828
|
+
*/ trackError(error, properties) {
|
|
11829
|
+
this.track({
|
|
11830
|
+
type: 'error',
|
|
11831
|
+
name: 'error',
|
|
11832
|
+
properties: {
|
|
11833
|
+
errorName: error.name,
|
|
11834
|
+
errorMessage: error.message,
|
|
11835
|
+
errorStack: error.stack,
|
|
11836
|
+
...properties
|
|
11837
|
+
}
|
|
11838
|
+
});
|
|
11839
|
+
}
|
|
11840
|
+
/**
|
|
11841
|
+
* 记录性能事件
|
|
11842
|
+
*/ trackPerformance(metrics, properties) {
|
|
11843
|
+
this.track({
|
|
11844
|
+
type: 'performance',
|
|
11845
|
+
name: 'performance',
|
|
11846
|
+
properties: {
|
|
11847
|
+
...metrics,
|
|
11848
|
+
...properties
|
|
11849
|
+
}
|
|
11850
|
+
});
|
|
11851
|
+
}
|
|
11852
|
+
/**
|
|
11853
|
+
* 匿名化属性(使用深度脱敏)
|
|
11854
|
+
*/ anonymizeProperties(properties) {
|
|
11855
|
+
if (!this.config.anonymize || !properties) {
|
|
11856
|
+
return properties;
|
|
11857
|
+
}
|
|
11858
|
+
// 使用深度脱敏处理
|
|
11859
|
+
return vlianUtils.SecurityUtils.deepSanitize(properties);
|
|
11860
|
+
}
|
|
11861
|
+
/**
|
|
11862
|
+
* 刷新队列(批量上报)
|
|
11863
|
+
*/ flush() {
|
|
11864
|
+
if (this.eventQueue.length === 0) {
|
|
11865
|
+
return;
|
|
11866
|
+
}
|
|
11867
|
+
const events = [
|
|
11868
|
+
...this.eventQueue
|
|
11869
|
+
];
|
|
11870
|
+
this.eventQueue = [];
|
|
11871
|
+
if (this.config.onBatch) {
|
|
11872
|
+
this.config.onBatch(events);
|
|
11873
|
+
}
|
|
11874
|
+
logger.logger.debug(`分析服务批量上报 ${events.length} 个事件`);
|
|
11875
|
+
}
|
|
11876
|
+
/**
|
|
11877
|
+
* 启用分析
|
|
11878
|
+
*/ enable() {
|
|
11879
|
+
this.config.enabled = true;
|
|
11880
|
+
this.startBatchTimer();
|
|
11881
|
+
}
|
|
11882
|
+
/**
|
|
11883
|
+
* 禁用分析
|
|
11884
|
+
*/ disable() {
|
|
11885
|
+
this.config.enabled = false;
|
|
11886
|
+
this.stopBatchTimer();
|
|
11887
|
+
this.flush();
|
|
11888
|
+
}
|
|
11889
|
+
/**
|
|
11890
|
+
* 销毁服务
|
|
11891
|
+
*/ destroy() {
|
|
11892
|
+
this.stopBatchTimer();
|
|
11893
|
+
this.flush();
|
|
11894
|
+
}
|
|
11895
|
+
constructor(config = {}){
|
|
11896
|
+
_define_property$5(this, "config", void 0);
|
|
11897
|
+
_define_property$5(this, "eventQueue", []);
|
|
11898
|
+
_define_property$5(this, "batchTimer", null);
|
|
11899
|
+
this.config = {
|
|
11900
|
+
enabled: config.enabled ?? true,
|
|
11901
|
+
sampleRate: config.sampleRate ?? 1.0,
|
|
11902
|
+
anonymize: config.anonymize ?? true,
|
|
11903
|
+
onEvent: config.onEvent ?? (()=>{}),
|
|
11904
|
+
onBatch: config.onBatch ?? (()=>{}),
|
|
11905
|
+
batchSize: config.batchSize ?? 10,
|
|
11906
|
+
batchInterval: config.batchInterval ?? 5000
|
|
11907
|
+
};
|
|
11908
|
+
if (this.config.enabled) {
|
|
11909
|
+
this.startBatchTimer();
|
|
11910
|
+
}
|
|
11911
|
+
}
|
|
11912
|
+
}
|
|
11913
|
+
/**
|
|
11914
|
+
* 默认分析服务实例
|
|
11915
|
+
*/ let defaultAnalyticsService = null;
|
|
11916
|
+
/**
|
|
11917
|
+
* 初始化默认分析服务
|
|
11918
|
+
*/ function initAnalytics(config) {
|
|
11919
|
+
if (!defaultAnalyticsService) {
|
|
11920
|
+
defaultAnalyticsService = new AnalyticsService(config);
|
|
11921
|
+
}
|
|
11922
|
+
return defaultAnalyticsService;
|
|
11858
11923
|
}
|
|
11859
|
-
|
|
11860
|
-
|
|
11861
|
-
|
|
11862
|
-
|
|
11924
|
+
/**
|
|
11925
|
+
* 获取默认分析服务
|
|
11926
|
+
*/ function getAnalytics() {
|
|
11927
|
+
if (!defaultAnalyticsService) {
|
|
11928
|
+
return initAnalytics();
|
|
11863
11929
|
}
|
|
11864
|
-
return
|
|
11865
|
-
children: [
|
|
11866
|
-
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
11867
|
-
onClick: ()=>setVisible(true),
|
|
11868
|
-
style: {
|
|
11869
|
-
...resolvePosition(position),
|
|
11870
|
-
border: 'none',
|
|
11871
|
-
background: '#2f80ed',
|
|
11872
|
-
color: '#fff',
|
|
11873
|
-
borderRadius: 999,
|
|
11874
|
-
padding: '8px 14px',
|
|
11875
|
-
cursor: 'pointer'
|
|
11876
|
-
},
|
|
11877
|
-
children: "DevTools"
|
|
11878
|
-
}),
|
|
11879
|
-
/*#__PURE__*/ jsxRuntime.jsx(DevTools, {
|
|
11880
|
-
appInstance: appInstance,
|
|
11881
|
-
visible: visible,
|
|
11882
|
-
onClose: ()=>setVisible(false)
|
|
11883
|
-
})
|
|
11884
|
-
]
|
|
11885
|
-
});
|
|
11930
|
+
return defaultAnalyticsService;
|
|
11886
11931
|
}
|
|
11887
11932
|
|
|
11933
|
+
var analytics = /*#__PURE__*/Object.freeze({
|
|
11934
|
+
__proto__: null,
|
|
11935
|
+
AnalyticsService: AnalyticsService,
|
|
11936
|
+
getAnalytics: getAnalytics,
|
|
11937
|
+
initAnalytics: initAnalytics
|
|
11938
|
+
});
|
|
11939
|
+
|
|
11888
11940
|
/**
|
|
11889
|
-
*
|
|
11941
|
+
* 等待指定时间后解析的 Promise 工具函数
|
|
11890
11942
|
*
|
|
11891
|
-
* @param
|
|
11892
|
-
* @returns Promise
|
|
11943
|
+
* @param time - 等待时间(毫秒),默认为 100 毫秒
|
|
11944
|
+
* @returns 返回一个 Promise,在指定时间后解析为 true
|
|
11893
11945
|
*
|
|
11894
11946
|
* @example
|
|
11895
11947
|
* ```typescript
|
|
11896
|
-
*
|
|
11948
|
+
* // 等待 500 毫秒
|
|
11949
|
+
* await waitTime(500);
|
|
11897
11950
|
*
|
|
11898
|
-
*
|
|
11899
|
-
*
|
|
11900
|
-
* lifecycle: {
|
|
11901
|
-
* beforeInitialization: async () => {
|
|
11902
|
-
* console.log('初始化前执行');
|
|
11903
|
-
* },
|
|
11904
|
-
* },
|
|
11905
|
-
* });
|
|
11951
|
+
* // 使用默认等待时间(100 毫秒)
|
|
11952
|
+
* await waitTime();
|
|
11906
11953
|
* ```
|
|
11907
|
-
|
|
11908
|
-
|
|
11909
|
-
|
|
11910
|
-
|
|
11911
|
-
|
|
11912
|
-
|
|
11913
|
-
|
|
11914
|
-
*/ const start = async (options = {})=>{
|
|
11915
|
-
// 使用新的启动函数,保持向后兼容
|
|
11916
|
-
await startApp(options);
|
|
11917
|
-
};
|
|
11918
|
-
// 导出getStateManager(向后兼容)
|
|
11919
|
-
const getStateManager = ()=>{
|
|
11920
|
-
const instanceManager = getAppInstanceManager();
|
|
11921
|
-
const instance = instanceManager.getInstance();
|
|
11922
|
-
if (instance) {
|
|
11923
|
-
return instance.getServices().stateManager;
|
|
11924
|
-
}
|
|
11925
|
-
return null;
|
|
11954
|
+
* @deprecated 建议使用基于实际完成状态的机制,而不是固定等待时间
|
|
11955
|
+
*/ const waitTime = (time = 100)=>{
|
|
11956
|
+
return new Promise((resolve)=>{
|
|
11957
|
+
setTimeout(()=>{
|
|
11958
|
+
resolve(true);
|
|
11959
|
+
}, time);
|
|
11960
|
+
});
|
|
11926
11961
|
};
|
|
11927
11962
|
|
|
11928
11963
|
function resolveStorage(storage) {
|
|
@@ -12753,119 +12788,45 @@
|
|
|
12753
12788
|
return startup(options, instanceId);
|
|
12754
12789
|
}
|
|
12755
12790
|
|
|
12756
|
-
// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查
|
|
12757
|
-
async function undiciAdapter() {
|
|
12758
|
-
const { undiciAdapter: adapter } = await import('@vlian/request');
|
|
12759
|
-
return adapter();
|
|
12760
|
-
}
|
|
12761
|
-
|
|
12762
|
-
Object.defineProperty(exports, "ConfigError", {
|
|
12763
|
-
enumerable: true,
|
|
12764
|
-
get: function () { return utils.ConfigError; }
|
|
12765
|
-
});
|
|
12766
|
-
Object.defineProperty(exports, "ErrorCode", {
|
|
12767
|
-
enumerable: true,
|
|
12768
|
-
get: function () { return utils.ErrorCode; }
|
|
12769
|
-
});
|
|
12770
|
-
Object.defineProperty(exports, "ErrorMessages", {
|
|
12771
|
-
enumerable: true,
|
|
12772
|
-
get: function () { return utils.ErrorMessages; }
|
|
12773
|
-
});
|
|
12774
|
-
Object.defineProperty(exports, "ErrorSeverity", {
|
|
12775
|
-
enumerable: true,
|
|
12776
|
-
get: function () { return utils.ErrorSeverity; }
|
|
12777
|
-
});
|
|
12778
|
-
Object.defineProperty(exports, "ErrorType", {
|
|
12779
|
-
enumerable: true,
|
|
12780
|
-
get: function () { return utils.ErrorType; }
|
|
12781
|
-
});
|
|
12782
|
-
Object.defineProperty(exports, "FrameworkError", {
|
|
12783
|
-
enumerable: true,
|
|
12784
|
-
get: function () { return utils.FrameworkError; }
|
|
12785
|
-
});
|
|
12786
|
-
Object.defineProperty(exports, "InitializationError", {
|
|
12787
|
-
enumerable: true,
|
|
12788
|
-
get: function () { return utils.InitializationError; }
|
|
12789
|
-
});
|
|
12790
|
-
Object.defineProperty(exports, "NetworkError", {
|
|
12791
|
-
enumerable: true,
|
|
12792
|
-
get: function () { return utils.NetworkError; }
|
|
12793
|
-
});
|
|
12794
12791
|
Object.defineProperty(exports, "PERFORMANCE_METRIC_UNITS", {
|
|
12795
12792
|
enumerable: true,
|
|
12796
|
-
get: function () { return
|
|
12793
|
+
get: function () { return vlianUtils.PERFORMANCE_METRIC_UNITS; }
|
|
12797
12794
|
});
|
|
12798
12795
|
Object.defineProperty(exports, "PerformanceMonitor", {
|
|
12799
12796
|
enumerable: true,
|
|
12800
|
-
get: function () { return
|
|
12797
|
+
get: function () { return vlianUtils.PerformanceMonitor; }
|
|
12801
12798
|
});
|
|
12802
12799
|
Object.defineProperty(exports, "ResourceLoader", {
|
|
12803
12800
|
enumerable: true,
|
|
12804
|
-
get: function () { return
|
|
12801
|
+
get: function () { return vlianUtils.ResourceLoader; }
|
|
12805
12802
|
});
|
|
12806
12803
|
Object.defineProperty(exports, "RuntimeSecurity", {
|
|
12807
12804
|
enumerable: true,
|
|
12808
|
-
get: function () { return
|
|
12805
|
+
get: function () { return vlianUtils.RuntimeSecurity; }
|
|
12809
12806
|
});
|
|
12810
12807
|
Object.defineProperty(exports, "SENSITIVE_FIELDS", {
|
|
12811
12808
|
enumerable: true,
|
|
12812
|
-
get: function () { return
|
|
12813
|
-
});
|
|
12814
|
-
Object.defineProperty(exports, "SecurityError", {
|
|
12815
|
-
enumerable: true,
|
|
12816
|
-
get: function () { return utils.SecurityError; }
|
|
12809
|
+
get: function () { return vlianUtils.SENSITIVE_FIELDS; }
|
|
12817
12810
|
});
|
|
12818
12811
|
Object.defineProperty(exports, "SecurityUtils", {
|
|
12819
12812
|
enumerable: true,
|
|
12820
|
-
get: function () { return
|
|
12821
|
-
});
|
|
12822
|
-
Object.defineProperty(exports, "StorageError", {
|
|
12823
|
-
enumerable: true,
|
|
12824
|
-
get: function () { return utils.StorageError; }
|
|
12825
|
-
});
|
|
12826
|
-
Object.defineProperty(exports, "ValidationError", {
|
|
12827
|
-
enumerable: true,
|
|
12828
|
-
get: function () { return utils.ValidationError; }
|
|
12813
|
+
get: function () { return vlianUtils.SecurityUtils; }
|
|
12829
12814
|
});
|
|
12830
12815
|
Object.defineProperty(exports, "Validator", {
|
|
12831
12816
|
enumerable: true,
|
|
12832
|
-
get: function () { return
|
|
12817
|
+
get: function () { return vlianUtils.Validator; }
|
|
12833
12818
|
});
|
|
12834
12819
|
Object.defineProperty(exports, "commonSchemas", {
|
|
12835
12820
|
enumerable: true,
|
|
12836
|
-
get: function () { return
|
|
12821
|
+
get: function () { return vlianUtils.commonSchemas; }
|
|
12837
12822
|
});
|
|
12838
12823
|
Object.defineProperty(exports, "convertMetricsToWithUnits", {
|
|
12839
12824
|
enumerable: true,
|
|
12840
|
-
get: function () { return
|
|
12841
|
-
});
|
|
12842
|
-
Object.defineProperty(exports, "errorUtils", {
|
|
12843
|
-
enumerable: true,
|
|
12844
|
-
get: function () { return utils.errorUtils; }
|
|
12845
|
-
});
|
|
12846
|
-
Object.defineProperty(exports, "getErrorMessage", {
|
|
12847
|
-
enumerable: true,
|
|
12848
|
-
get: function () { return utils.getErrorMessage; }
|
|
12849
|
-
});
|
|
12850
|
-
Object.defineProperty(exports, "getUserFriendlyMessage", {
|
|
12851
|
-
enumerable: true,
|
|
12852
|
-
get: function () { return utils.getUserFriendlyMessage; }
|
|
12825
|
+
get: function () { return vlianUtils.convertMetricsToWithUnits; }
|
|
12853
12826
|
});
|
|
12854
12827
|
Object.defineProperty(exports, "resourceLoader", {
|
|
12855
12828
|
enumerable: true,
|
|
12856
|
-
get: function () { return
|
|
12857
|
-
});
|
|
12858
|
-
Object.defineProperty(exports, "MonitoringService", {
|
|
12859
|
-
enumerable: true,
|
|
12860
|
-
get: function () { return monitoring.MonitoringService; }
|
|
12861
|
-
});
|
|
12862
|
-
Object.defineProperty(exports, "getMonitoring", {
|
|
12863
|
-
enumerable: true,
|
|
12864
|
-
get: function () { return monitoring.getMonitoring; }
|
|
12865
|
-
});
|
|
12866
|
-
Object.defineProperty(exports, "initMonitoring", {
|
|
12867
|
-
enumerable: true,
|
|
12868
|
-
get: function () { return monitoring.initMonitoring; }
|
|
12829
|
+
get: function () { return vlianUtils.resourceLoader; }
|
|
12869
12830
|
});
|
|
12870
12831
|
Object.defineProperty(exports, "LogFormat", {
|
|
12871
12832
|
enumerable: true,
|
|
@@ -12919,89 +12880,17 @@
|
|
|
12919
12880
|
enumerable: true,
|
|
12920
12881
|
get: function () { return logger.setCurrentTraceId; }
|
|
12921
12882
|
});
|
|
12922
|
-
Object.defineProperty(exports, "
|
|
12923
|
-
enumerable: true,
|
|
12924
|
-
get: function () { return request.MonitoringEventType; }
|
|
12925
|
-
});
|
|
12926
|
-
Object.defineProperty(exports, "PluginLifecycleStage", {
|
|
12927
|
-
enumerable: true,
|
|
12928
|
-
get: function () { return request.PluginLifecycleStage; }
|
|
12929
|
-
});
|
|
12930
|
-
Object.defineProperty(exports, "PluginPriority", {
|
|
12931
|
-
enumerable: true,
|
|
12932
|
-
get: function () { return request.PluginPriority; }
|
|
12933
|
-
});
|
|
12934
|
-
Object.defineProperty(exports, "RequestClient", {
|
|
12935
|
-
enumerable: true,
|
|
12936
|
-
get: function () { return request.RequestClient; }
|
|
12937
|
-
});
|
|
12938
|
-
Object.defineProperty(exports, "RequestErrorCode", {
|
|
12939
|
-
enumerable: true,
|
|
12940
|
-
get: function () { return request.RequestErrorCode; }
|
|
12941
|
-
});
|
|
12942
|
-
Object.defineProperty(exports, "RequestErrorType", {
|
|
12943
|
-
enumerable: true,
|
|
12944
|
-
get: function () { return request.RequestErrorType; }
|
|
12945
|
-
});
|
|
12946
|
-
Object.defineProperty(exports, "RequestPluginManager", {
|
|
12947
|
-
enumerable: true,
|
|
12948
|
-
get: function () { return request.PluginManager; }
|
|
12949
|
-
});
|
|
12950
|
-
Object.defineProperty(exports, "adapterRegistry", {
|
|
12951
|
-
enumerable: true,
|
|
12952
|
-
get: function () { return request.adapterRegistry; }
|
|
12953
|
-
});
|
|
12954
|
-
Object.defineProperty(exports, "axiosAdapter", {
|
|
12955
|
-
enumerable: true,
|
|
12956
|
-
get: function () { return request.axiosAdapter; }
|
|
12957
|
-
});
|
|
12958
|
-
Object.defineProperty(exports, "cancelRequestContext", {
|
|
12959
|
-
enumerable: true,
|
|
12960
|
-
get: function () { return request.cancelRequestContext; }
|
|
12961
|
-
});
|
|
12962
|
-
Object.defineProperty(exports, "completeRequestContext", {
|
|
12963
|
-
enumerable: true,
|
|
12964
|
-
get: function () { return request.completeRequestContext; }
|
|
12965
|
-
});
|
|
12966
|
-
Object.defineProperty(exports, "createCachePlugin", {
|
|
12967
|
-
enumerable: true,
|
|
12968
|
-
get: function () { return request.createCachePlugin; }
|
|
12969
|
-
});
|
|
12970
|
-
Object.defineProperty(exports, "createMonitoringPlugin", {
|
|
12971
|
-
enumerable: true,
|
|
12972
|
-
get: function () { return request.createMonitoringPlugin; }
|
|
12973
|
-
});
|
|
12974
|
-
Object.defineProperty(exports, "createRequestClient", {
|
|
12975
|
-
enumerable: true,
|
|
12976
|
-
get: function () { return request.createRequestClient; }
|
|
12977
|
-
});
|
|
12978
|
-
Object.defineProperty(exports, "createRequestContext", {
|
|
12979
|
-
enumerable: true,
|
|
12980
|
-
get: function () { return request.createRequestContext; }
|
|
12981
|
-
});
|
|
12982
|
-
Object.defineProperty(exports, "createRetryPlugin", {
|
|
12983
|
-
enumerable: true,
|
|
12984
|
-
get: function () { return request.createRetryPlugin; }
|
|
12985
|
-
});
|
|
12986
|
-
Object.defineProperty(exports, "createValidationPlugin", {
|
|
12987
|
-
enumerable: true,
|
|
12988
|
-
get: function () { return request.createValidationPlugin; }
|
|
12989
|
-
});
|
|
12990
|
-
Object.defineProperty(exports, "failRequestContext", {
|
|
12991
|
-
enumerable: true,
|
|
12992
|
-
get: function () { return request.failRequestContext; }
|
|
12993
|
-
});
|
|
12994
|
-
Object.defineProperty(exports, "fetchAdapter", {
|
|
12883
|
+
Object.defineProperty(exports, "MonitoringService", {
|
|
12995
12884
|
enumerable: true,
|
|
12996
|
-
get: function () { return
|
|
12885
|
+
get: function () { return monitoring.MonitoringService; }
|
|
12997
12886
|
});
|
|
12998
|
-
Object.defineProperty(exports, "
|
|
12887
|
+
Object.defineProperty(exports, "getMonitoring", {
|
|
12999
12888
|
enumerable: true,
|
|
13000
|
-
get: function () { return
|
|
12889
|
+
get: function () { return monitoring.getMonitoring; }
|
|
13001
12890
|
});
|
|
13002
|
-
Object.defineProperty(exports, "
|
|
12891
|
+
Object.defineProperty(exports, "initMonitoring", {
|
|
13003
12892
|
enumerable: true,
|
|
13004
|
-
get: function () { return
|
|
12893
|
+
get: function () { return monitoring.initMonitoring; }
|
|
13005
12894
|
});
|
|
13006
12895
|
Object.defineProperty(exports, "CSRFTokenManager", {
|
|
13007
12896
|
enumerable: true,
|
|
@@ -13022,6 +12911,7 @@
|
|
|
13022
12911
|
exports.AppContextProvider = AppContextProvider;
|
|
13023
12912
|
exports.AppEventBus = AppEventBus;
|
|
13024
12913
|
exports.AppRenderer = AppRenderer;
|
|
12914
|
+
exports.ConfigError = ConfigError;
|
|
13025
12915
|
exports.ConfigFileFormat = ConfigFileFormat;
|
|
13026
12916
|
exports.ConfigLoader = ConfigLoader;
|
|
13027
12917
|
exports.ConfigSecurity = ConfigSecurity;
|
|
@@ -13034,13 +12924,21 @@
|
|
|
13034
12924
|
exports.DynamicRouteManager = DynamicRouteManager;
|
|
13035
12925
|
exports.EnvironmentDetector = EnvironmentDetector;
|
|
13036
12926
|
exports.ErrorBoundary = ErrorBoundary;
|
|
12927
|
+
exports.ErrorCode = ErrorCode;
|
|
12928
|
+
exports.ErrorMessages = ErrorMessages;
|
|
12929
|
+
exports.ErrorSeverity = ErrorSeverity;
|
|
12930
|
+
exports.ErrorType = ErrorType;
|
|
12931
|
+
exports.FrameworkError = FrameworkError;
|
|
13037
12932
|
exports.FrameworkEventManager = FrameworkEventManager;
|
|
13038
12933
|
exports.FrameworkEventType = FrameworkEventType;
|
|
12934
|
+
exports.InitializationError = InitializationError;
|
|
13039
12935
|
exports.Kernel = Kernel;
|
|
13040
12936
|
exports.KernelBootError = KernelBootError;
|
|
13041
12937
|
exports.LocaleSwitch = LocaleSwitch;
|
|
13042
12938
|
exports.MiddlewareManager = MiddlewareManager;
|
|
12939
|
+
exports.NetworkError = NetworkError;
|
|
13043
12940
|
exports.PerformanceTracker = PerformanceTracker;
|
|
12941
|
+
exports.PluginLifecycleStage = PluginLifecycleStage;
|
|
13044
12942
|
exports.PluginManager = PluginManager;
|
|
13045
12943
|
exports.PreloadStrategy = PreloadStrategy;
|
|
13046
12944
|
exports.ReactRouterAdapter = ReactRouterAdapter;
|
|
@@ -13059,22 +12957,27 @@
|
|
|
13059
12957
|
exports.RouterPluginManager = RouterPluginManager;
|
|
13060
12958
|
exports.RuntimeEnvironment = RuntimeEnvironment;
|
|
13061
12959
|
exports.STARTUP_METRIC_UNITS = STARTUP_METRIC_UNITS;
|
|
12960
|
+
exports.SecurityError = SecurityError;
|
|
13062
12961
|
exports.StateInstance = StateInstance;
|
|
13063
12962
|
exports.StateManager = StateManager;
|
|
13064
12963
|
exports.StateRegistry = StateRegistry;
|
|
13065
12964
|
exports.StateScopeManager = StateScopeManager;
|
|
12965
|
+
exports.StorageError = StorageError;
|
|
13066
12966
|
exports.ThemeSwitch = ThemeSwitch;
|
|
12967
|
+
exports.ValidationError = ValidationError;
|
|
13067
12968
|
exports.ZustandAdapter = ZustandAdapter;
|
|
13068
12969
|
exports.appConfig = appConfig;
|
|
13069
12970
|
exports.componentImportSchema = componentImportSchema;
|
|
13070
12971
|
exports.createAuthMiddleware = createAuthMiddleware;
|
|
13071
12972
|
exports.createReactRouterAdapter = createReactRouterAdapter;
|
|
13072
12973
|
exports.createRouterError = createRouterError;
|
|
12974
|
+
exports.errorUtils = errorUtils;
|
|
13073
12975
|
exports.getAdapterManager = getAdapterManager;
|
|
13074
12976
|
exports.getAnalytics = getAnalytics;
|
|
13075
12977
|
exports.getAppInstanceManager = getAppInstanceManager;
|
|
13076
12978
|
exports.getDynamicRouteManager = getDynamicRouteManager;
|
|
13077
12979
|
exports.getEnvironmentDetector = getEnvironmentDetector;
|
|
12980
|
+
exports.getErrorMessage = getErrorMessage;
|
|
13078
12981
|
exports.getKernel = getKernel;
|
|
13079
12982
|
exports.getRouteCache = getRouteCache;
|
|
13080
12983
|
exports.getRoutePreloader = getRoutePreloader;
|
|
@@ -13085,6 +12988,7 @@
|
|
|
13085
12988
|
exports.getRouterMonitoring = getRouterMonitoring;
|
|
13086
12989
|
exports.getRouterPluginManager = getRouterPluginManager;
|
|
13087
12990
|
exports.getStateManager = getStateManager;
|
|
12991
|
+
exports.getUserFriendlyMessage = getUserFriendlyMessage;
|
|
13088
12992
|
exports.initAnalytics = initAnalytics;
|
|
13089
12993
|
exports.initializeServices = initializeServices;
|
|
13090
12994
|
exports.kernelStartApp = kernelStartApp;
|
|
@@ -13101,7 +13005,6 @@
|
|
|
13101
13005
|
exports.startKernel = startKernel;
|
|
13102
13006
|
exports.startup = startup;
|
|
13103
13007
|
exports.storage = storage;
|
|
13104
|
-
exports.undiciAdapter = undiciAdapter;
|
|
13105
13008
|
exports.useAppContext = useAppContext;
|
|
13106
13009
|
exports.useAppEvent = useAppEvent;
|
|
13107
13010
|
exports.useAppEventEmitter = useAppEventEmitter;
|