@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.
Files changed (156) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/core/Test.cjs +2 -2
  3. package/dist/core/Test.cjs.map +1 -1
  4. package/dist/core/Test.js +1 -1
  5. package/dist/core/Test.js.map +1 -1
  6. package/dist/core/config/ConfigLoader.cjs +7 -7
  7. package/dist/core/config/ConfigLoader.cjs.map +1 -1
  8. package/dist/core/config/ConfigLoader.js +1 -1
  9. package/dist/core/config/ConfigLoader.js.map +1 -1
  10. package/dist/core/error/ErrorBoundary.cjs +6 -6
  11. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  12. package/dist/core/error/ErrorBoundary.d.ts +1 -1
  13. package/dist/core/error/ErrorBoundary.js +2 -2
  14. package/dist/core/error/ErrorBoundary.js.map +1 -1
  15. package/dist/core/error/ErrorHandler.cjs +19 -19
  16. package/dist/core/error/ErrorHandler.cjs.map +1 -1
  17. package/dist/core/error/ErrorHandler.d.ts +1 -1
  18. package/dist/core/error/ErrorHandler.js +2 -2
  19. package/dist/core/error/ErrorHandler.js.map +1 -1
  20. package/dist/core/event/AppEventBus.cjs +5 -5
  21. package/dist/core/event/AppEventBus.cjs.map +1 -1
  22. package/dist/core/event/AppEventBus.js +1 -1
  23. package/dist/core/event/AppEventBus.js.map +1 -1
  24. package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
  25. package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
  26. package/dist/core/initialization/initialization.cjs +3 -3
  27. package/dist/core/initialization/initialization.cjs.map +1 -1
  28. package/dist/core/initialization/initialization.d.ts +1 -1
  29. package/dist/core/initialization/initialization.js +1 -1
  30. package/dist/core/initialization/initialization.js.map +1 -1
  31. package/dist/core/initialization/initializationErrorState.cjs +2 -2
  32. package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
  33. package/dist/core/initialization/initializationErrorState.d.ts +1 -1
  34. package/dist/core/initialization/initializationErrorState.js +1 -1
  35. package/dist/core/initialization/initializationErrorState.js.map +1 -1
  36. package/dist/core/kernel/defaultAdapters.cjs +14 -13
  37. package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
  38. package/dist/core/kernel/defaultAdapters.js +2 -1
  39. package/dist/core/kernel/defaultAdapters.js.map +1 -1
  40. package/dist/core/kernel/types.d.ts +1 -1
  41. package/dist/core/kernel/types.js.map +1 -1
  42. package/dist/core/router/RouterManager.cjs +9 -9
  43. package/dist/core/router/RouterManager.cjs.map +1 -1
  44. package/dist/core/router/RouterManager.js +1 -1
  45. package/dist/core/router/RouterManager.js.map +1 -1
  46. package/dist/core/router/adapter/AdapterManager.cjs +10 -10
  47. package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
  48. package/dist/core/router/adapter/AdapterManager.js +1 -1
  49. package/dist/core/router/adapter/AdapterManager.js.map +1 -1
  50. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
  51. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  52. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
  53. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  54. package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
  55. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
  56. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
  57. package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
  58. package/dist/core/router/errors/RouterError.cjs.map +1 -1
  59. package/dist/core/router/errors/RouterError.d.ts +4 -3
  60. package/dist/core/router/errors/RouterError.js.map +1 -1
  61. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
  62. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
  63. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
  64. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
  65. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
  66. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  67. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
  68. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  69. package/dist/core/router/middleware/auth.cjs +4 -4
  70. package/dist/core/router/middleware/auth.cjs.map +1 -1
  71. package/dist/core/router/middleware/auth.js +1 -1
  72. package/dist/core/router/middleware/auth.js.map +1 -1
  73. package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -1
  74. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
  75. package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
  76. package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
  77. package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
  78. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  79. package/dist/core/router/navigation/RouterNavigation.js +1 -1
  80. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  81. package/dist/core/router/performance/RouteCache.cjs +7 -7
  82. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  83. package/dist/core/router/performance/RouteCache.js +1 -1
  84. package/dist/core/router/performance/RouteCache.js.map +1 -1
  85. package/dist/core/router/performance/RoutePreloader.cjs +6 -6
  86. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  87. package/dist/core/router/performance/RoutePreloader.js +1 -1
  88. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  89. package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
  90. package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
  91. package/dist/core/router/plugin/RouterPluginManager.js +1 -1
  92. package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
  93. package/dist/core/router/utils/adapters/react-router/transform.cjs +2 -2
  94. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  95. package/dist/core/router/utils/adapters/react-router/transform.js +1 -1
  96. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  97. package/dist/core/router/utils/transform.cjs +13 -12
  98. package/dist/core/router/utils/transform.cjs.map +1 -1
  99. package/dist/core/router/utils/transform.js +2 -1
  100. package/dist/core/router/utils/transform.js.map +1 -1
  101. package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
  102. package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
  103. package/dist/core/router/validation/RouterConfigValidator.js +1 -1
  104. package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
  105. package/dist/core/router/version/RouteVersionManager.cjs +6 -6
  106. package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
  107. package/dist/core/router/version/RouteVersionManager.js +1 -1
  108. package/dist/core/router/version/RouteVersionManager.js.map +1 -1
  109. package/dist/core/splash/SplashScreen.cjs +4 -4
  110. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  111. package/dist/core/splash/SplashScreen.js +1 -1
  112. package/dist/core/splash/SplashScreen.js.map +1 -1
  113. package/dist/core/startup/initializeServices.cjs +14 -14
  114. package/dist/core/startup/initializeServices.cjs.map +1 -1
  115. package/dist/core/startup/initializeServices.d.ts +1 -1
  116. package/dist/core/startup/initializeServices.js +2 -2
  117. package/dist/core/startup/initializeServices.js.map +1 -1
  118. package/dist/core/startup/renderApp.cjs +2 -2
  119. package/dist/core/startup/renderApp.cjs.map +1 -1
  120. package/dist/core/startup/renderApp.js +1 -1
  121. package/dist/core/startup/renderApp.js.map +1 -1
  122. package/dist/core/startup/startApp.cjs +22 -22
  123. package/dist/core/startup/startApp.cjs.map +1 -1
  124. package/dist/core/startup/startApp.js +2 -2
  125. package/dist/core/startup/startApp.js.map +1 -1
  126. package/dist/core/types.d.ts +2 -2
  127. package/dist/core/types.js.map +1 -1
  128. package/dist/index.cjs +0 -112
  129. package/dist/index.cjs.map +1 -1
  130. package/dist/index.d.ts +0 -4
  131. package/dist/index.js +0 -8
  132. package/dist/index.js.map +1 -1
  133. package/dist/index.umd.js +1389 -1486
  134. package/dist/index.umd.js.map +1 -1
  135. package/dist/kernel/constants.cjs +2 -2
  136. package/dist/kernel/constants.cjs.map +1 -1
  137. package/dist/kernel/constants.js +1 -1
  138. package/dist/kernel/constants.js.map +1 -1
  139. package/dist/kernel/manager/loggerManager.cjs +10 -10
  140. package/dist/kernel/manager/loggerManager.cjs.map +1 -1
  141. package/dist/kernel/manager/loggerManager.d.ts +1 -1
  142. package/dist/kernel/manager/loggerManager.js +1 -1
  143. package/dist/kernel/manager/loggerManager.js.map +1 -1
  144. package/dist/kernel/types.d.ts +1 -1
  145. package/dist/kernel/types.js.map +1 -1
  146. package/dist/library/storage/encryption.cjs +12 -13
  147. package/dist/library/storage/encryption.cjs.map +1 -1
  148. package/dist/library/storage/encryption.js +1 -2
  149. package/dist/library/storage/encryption.js.map +1 -1
  150. package/dist/state.umd.js +1 -1
  151. package/dist/utils/errors.cjs +71 -15
  152. package/dist/utils/errors.cjs.map +1 -1
  153. package/dist/utils/errors.d.ts +30 -1
  154. package/dist/utils/errors.js +16 -1
  155. package/dist/utils/errors.js.map +1 -1
  156. package/package.json +1 -1
package/dist/index.umd.js CHANGED
@@ -1,14 +1,33 @@
1
1
  /*!
2
- * @vlian/framework v1.2.36
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/monitoring'), require('@vlian/logger'), require('react/jsx-runtime'), require('react-dom/client'), require('react'), require('react-router-dom'), require('zod'), require('i18next'), require('react-i18next'), require('@vlian/request'), require('@vlian/csrf')) :
9
- typeof define === 'function' && define.amd ? define(['exports', '@vlian/utils', '@vlian/monitoring', '@vlian/logger', 'react/jsx-runtime', 'react-dom/client', 'react', 'react-router-dom', 'zod', 'i18next', 'react-i18next', '@vlian/request', '@vlian/csrf'], factory) :
10
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.utils, global.monitoring, global.logger, global.jsxRuntime, global.ReactDOMClient, global.React, global.ReactRouterDOM, global.z, global.i18next, global.ReactI18next, global.request, global.csrf));
11
- })(this, (function (exports, utils, monitoring, logger, jsxRuntime, client, React, reactRouterDom, zod, i18n, reactI18next, request, csrf) { 'use strict';
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 = utils.createStorage({
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 = utils.createStorage({
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 = utils.createStorage({
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
- */ class ConfigSecurity {
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
- */ static async verifySignature(config, signature, options) {
425
- if (!options.enabled) {
426
- return true;
427
- }
428
- if (!options.publicKey) {
429
- throw new utils.SecurityError('签名验证需要提供公钥');
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
- */ static verifyOrigin(options) {
484
- if (!options.allowedOrigins || options.allowedOrigins.length === 0) {
485
- return true; // 如果没有配置白名单,允许所有来源
469
+ * 检查是否可以访问配置键
470
+ *
471
+ * @param key - 配置键
472
+ * @returns 是否可以访问
473
+ */ canAccessConfig(key) {
474
+ if (!this.hasPermission("access_config")) {
475
+ return false;
486
476
  }
487
- if (typeof window === 'undefined') {
488
- return true; // 非浏览器环境,跳过验证
477
+ if (this.config.configWhitelist && this.config.configWhitelist.length > 0) {
478
+ return this.config.configWhitelist.includes(key);
489
479
  }
490
- const currentOrigin = window.location.origin;
491
- const referer = document.referrer;
492
- // 验证当前来源
493
- if (options.allowedOrigins.includes(currentOrigin)) {
494
- return true;
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
- // 验证 Referer
497
- if (options.verifyReferer && referer) {
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 false;
494
+ return true;
508
495
  }
509
496
  /**
510
- * 验证配置白名单
511
- */ static verifyWhitelist(config, options) {
512
- const errors = [];
513
- // 检查允许的键
514
- if (options.allowedKeys && options.allowedKeys.length > 0) {
515
- const configKeys = Object.keys(config);
516
- const invalidKeys = configKeys.filter((key)=>!options.allowedKeys.includes(key));
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
- if (options.forbiddenKeys && options.forbiddenKeys.length > 0) {
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
- if (options.valueSchema) {
531
- const result = utils.Validator.validateObject(options.valueSchema, config);
532
- if (!result.valid) {
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
- valid: errors.length === 0,
538
- errors
520
+ ...this.config
539
521
  };
540
522
  }
541
523
  /**
542
- * 清理配置中的危险内容
543
- */ static sanitizeConfig(config) {
544
- const sanitized = {};
545
- for (const [key, value] of Object.entries(config)){
546
- if (typeof value === 'string') {
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
- */ static async validateConfigSecurity(config, options) {
567
- const errors = [];
568
- // 验证来源
569
- if (options.origin) {
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
- var runtimeSecurity = /*#__PURE__*/Object.freeze({
592
- __proto__: null,
593
- RuntimeSecurity: RuntimeSecurity
594
- });
595
-
596
- function _define_property$I(obj, key, value) {
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 AnalyticsService {
561
+ * 事件总线
562
+ */ class PluginEventBus {
612
563
  /**
613
- * 启动批量上报定时器
614
- */ startBatchTimer() {
615
- if (this.batchTimer) {
616
- return;
617
- }
618
- this.batchTimer = setInterval(()=>{
619
- this.flush();
620
- }, this.config.batchInterval);
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
- */ track(event) {
633
- if (!this.config.enabled) {
634
- return;
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
- if (Math.random() > this.config.sampleRate) {
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 anonymizedEvent = {
642
- ...event,
643
- timestamp: Date.now(),
644
- properties: this.anonymizeProperties(event.properties)
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.eventQueue.push(anonymizedEvent);
648
- // 立即上报单个事件
649
- if (this.config.onEvent) {
650
- this.config.onEvent(anonymizedEvent);
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 (this.eventQueue.length >= this.config.batchSize) {
654
- this.flush();
628
+ const listeners = this.listeners.get(event);
629
+ if (!listeners || listeners.size === 0) {
630
+ return;
655
631
  }
656
- }
657
- /**
658
- * 记录页面浏览
659
- */ trackPageView(page, properties) {
660
- this.track({
661
- type: 'pageview',
662
- name: 'page_view',
663
- properties: {
664
- page,
665
- ...properties
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
- */ trackClick(element, properties) {
672
- this.track({
673
- type: 'click',
674
- name: 'click',
675
- properties: {
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
- */ trackCustom(name, properties) {
684
- this.track({
685
- type: 'custom',
686
- name,
687
- properties
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
- */ trackError(error, properties) {
693
- this.track({
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
- */ trackPerformance(metrics, properties) {
707
- this.track({
708
- type: 'performance',
709
- name: 'performance',
710
- properties: {
711
- ...metrics,
712
- ...properties
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
- */ anonymizeProperties(properties) {
719
- if (!this.config.anonymize || !properties) {
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
- */ flush() {
728
- if (this.eventQueue.length === 0) {
729
- return;
697
+ * 获取事件历史记录
698
+ *
699
+ * @param event - 事件名称(可选,如果提供则只返回该事件的历史)
700
+ * @param limit - 限制返回的记录数
701
+ * @returns 事件历史记录
702
+ */ getEventHistory(event, limit) {
703
+ if (!this.config.enableTracking) {
704
+ return [];
730
705
  }
731
- const events = [
732
- ...this.eventQueue
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
- logger.logger.debug(`分析服务批量上报 ${events.length} 个事件`);
710
+ if (limit) {
711
+ history = history.slice(-limit);
712
+ }
713
+ return [
714
+ ...history
715
+ ];
739
716
  }
740
717
  /**
741
- * 启用分析
742
- */ enable() {
743
- this.config.enabled = true;
744
- this.startBatchTimer();
718
+ * 清空事件历史记录
719
+ */ clearHistory() {
720
+ this.eventHistory = [];
745
721
  }
746
722
  /**
747
- * 禁用分析
748
- */ disable() {
749
- this.config.enabled = false;
750
- this.stopBatchTimer();
751
- this.flush();
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
- */ destroy() {
756
- this.stopBatchTimer();
757
- this.flush();
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
- constructor(config = {}){
760
- _define_property$I(this, "config", void 0);
761
- _define_property$I(this, "eventQueue", []);
762
- _define_property$I(this, "batchTimer", null);
791
+ /**
792
+ * 获取配置
793
+ */ getConfig() {
794
+ return {
795
+ ...this.config
796
+ };
797
+ }
798
+ /**
799
+ * 更新配置
800
+ */ updateConfig(config) {
763
801
  this.config = {
764
- enabled: config.enabled ?? true,
765
- sampleRate: config.sampleRate ?? 1.0,
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
- */ let defaultAnalyticsService = null;
780
- /**
781
- * 初始化默认分析服务
782
- */ function initAnalytics(config) {
783
- if (!defaultAnalyticsService) {
784
- defaultAnalyticsService = new AnalyticsService(config);
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
- */ function getAnalytics() {
791
- if (!defaultAnalyticsService) {
792
- return initAnalytics();
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
- */ class PluginSandbox {
841
+ * 插件管理器
842
+ *
843
+ * 优化:
844
+ * 1. 支持插件依赖管理
845
+ * 2. 支持插件优先级控制
846
+ * 3. 支持插件生命周期管理
847
+ * 4. 支持插件热插拔(动态加载/卸载)
848
+ */ class PluginManager {
846
849
  /**
847
- * 检查权限
848
- *
849
- * @param permission - 权限
850
- * @returns 是否有权限
851
- */ hasPermission(permission) {
852
- if (!this.config.strictMode) {
853
- return true; // 非严格模式,允许所有权限
850
+ * 注册插件
851
+ *
852
+ * 优化:检查插件依赖是否已注册
853
+ */ register(plugin) {
854
+ if (this.plugins.has(plugin.name)) {
855
+ console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);
854
856
  }
855
- return this.permissions.has(permission);
856
- }
857
- /**
858
- * 检查是否可以访问配置键
859
- *
860
- * @param key - 配置键
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
- if (this.config.configWhitelist && this.config.configWhitelist.length > 0) {
867
- return this.config.configWhitelist.includes(key);
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
- * @param scope - 状态作用域
875
- * @returns 是否可以访问
876
- */ canAccessStateScope(scope) {
877
- if (!this.hasPermission("access_state_manager")) {
878
- return false;
879
- }
880
- if (this.config.stateScopeWhitelist && this.config.stateScopeWhitelist.length > 0) {
881
- return this.config.stateScopeWhitelist.includes(scope);
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 true;
920
+ return result;
884
921
  }
885
922
  /**
886
- * 过滤配置(根据白名单)
887
- *
888
- * @param config - 完整配置
889
- * @returns 过滤后的配置
890
- */ filterConfig(config) {
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
- return filtered;
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
- */ getConfig() {
908
- return {
909
- ...this.config
910
- };
911
- }
912
- /**
913
- * 更新权限
914
- *
915
- * @param permissions - 权限列表
916
- */ updatePermissions(permissions) {
917
- this.permissions = new Set(permissions);
918
- this.config.permissions = permissions;
919
- }
920
- constructor(config){
921
- _define_property$H(this, "config", void 0);
922
- _define_property$H(this, "permissions", void 0);
923
- this.config = {
924
- strictMode: true,
925
- ...config
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
- const listeners = this.listeners.get(event);
963
- listeners.add(listener);
964
- // 返回取消订阅函数
965
- return ()=>{
966
- listeners.delete(listener);
967
- if (listeners.size === 0) {
968
- this.listeners.delete(event);
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 event - 事件名称
976
- * @param listener - 事件监听器
977
- */ off(event, listener) {
978
- const listeners = this.listeners.get(event);
979
- if (listeners) {
980
- listeners.delete(listener);
981
- if (listeners.size === 0) {
982
- this.listeners.delete(event);
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 event - 事件名称
990
- * @param data - 事件数据
991
- * @param metadata - 事件元数据(可选)
992
- */ async emit(event, data, metadata) {
993
- // 事件验证
994
- if (this.config.enableValidation && !this.config.validator(event, data)) {
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
- const eventMetadata = {
1000
- source: metadata?.source,
1001
- timestamp: metadata?.timestamp ?? Date.now(),
1002
- eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,
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
- const listeners = this.listeners.get(event);
1018
- if (!listeners || listeners.size === 0) {
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
- return Promise.resolve(listener(eventWrapper));
1029
+ await plugin.destroy();
1032
1030
  } catch (error) {
1033
- console.error(`事件 ${event} 的监听器执行失败:`, error);
1034
- return Promise.resolve();
1031
+ console.error(`插件 ${name} destroy 钩子执行失败:`, error);
1035
1032
  }
1036
- });
1037
- await Promise.allSettled(promises);
1038
- }
1039
- /**
1040
- * 发布事件(仅数据,向后兼容)
1041
- *
1042
- * @param event - 事件名称
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 event - 事件名称
1051
- * @param listener - 事件监听器
1052
- */ once(event, listener) {
1053
- const wrappedListener = async (data)=>{
1054
- // 处理 EventWrapper 或直接数据
1055
- const actualData = data.data !== undefined ? data.data : data;
1056
- await listener(actualData);
1057
- this.off(event, wrappedListener);
1058
- };
1059
- this.on(event, wrappedListener);
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
- */ clear() {
1064
- this.listeners.clear();
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 event - 事件名称,如果不提供则返回所有事件的监听器总数
1070
- */ listenerCount(event) {
1071
- if (event) {
1072
- return this.listeners.get(event)?.size || 0;
1073
- }
1074
- let count = 0;
1075
- for (const listeners of this.listeners.values()){
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
- return count;
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
- let history = this.eventHistory;
1096
- if (event) {
1097
- history = history.filter((h)=>h.event === event);
1079
+ if (plugin.name !== name) {
1080
+ throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);
1098
1081
  }
1099
- if (limit) {
1100
- history = history.slice(-limit);
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
- */ clearHistory() {
1109
- this.eventHistory = [];
1102
+ * 获取插件
1103
+ */ get(name) {
1104
+ return this.plugins.get(name);
1110
1105
  }
1111
1106
  /**
1112
- * 请求-响应模式:发送请求并等待响应
1113
- *
1114
- * @param event - 事件名称
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
- * @param event - 事件名称
1150
- * @param handler - 请求处理器
1151
- * @returns 取消注册函数
1152
- */ onRequest(event, handler) {
1153
- const requestEvent = `${event}:request`;
1154
- const responseEvent = `${event}:response`;
1155
- return this.on(requestEvent, async (wrapper)=>{
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
- // 处理 EventWrapper 或直接数据
1158
- const actualWrapper = wrapper.data !== undefined ? wrapper : {
1159
- data: wrapper,
1160
- metadata: {
1161
- timestamp: Date.now()
1162
- }
1163
- };
1164
- const response = await handler(actualWrapper.data.data, actualWrapper.metadata);
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
- const actualWrapper = wrapper.data !== undefined ? wrapper : {
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
- */ register(plugin) {
1243
- if (this.plugins.has(plugin.name)) {
1244
- console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);
1245
- }
1246
- // 检查依赖是否已注册
1247
- if (plugin.dependencies && plugin.dependencies.length > 0) {
1248
- const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
1249
- if (missingDeps.length > 0) {
1250
- console.warn(`插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`);
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
- * @returns 插件名称数组,按加载顺序排列
1275
- */ getLoadOrder() {
1276
- const plugins = Array.from(this.plugins.values());
1277
- // 按优先级排序
1278
- const sortedPlugins = plugins.sort((a, b)=>{
1279
- const priorityA = a.priority ?? 100;
1280
- const priorityB = b.priority ?? 100;
1281
- return priorityA - priorityB;
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?.dependencies) {
1298
- for (const dep of plugin.dependencies){
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
- const pluginModule = await response.json();
1337
- plugin = pluginModule.default || pluginModule;
1338
- } else if (options.modulePath) {
1339
- // 从模块路径动态导入
1340
- const pluginModule = await import(/* @vite-ignore */ options.modulePath);
1341
- plugin = pluginModule.default || pluginModule;
1342
- } else {
1343
- throw new Error('必须提供 url 或 modulePath');
1344
- }
1345
- if (!plugin || !plugin.name) {
1346
- throw new Error('插件格式无效:必须包含 name 属性');
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
- * @param options - 启动选项
1372
- * @param context - 初始化上下文
1373
- */ async initializePlugin(name, options, context) {
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
- * @param force - 是否强制卸载(即使有依赖)
1403
- */ async unloadPlugin(name, force = false) {
1404
- const plugin = this.plugins.get(name);
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
- * @param plugin - 插件
1434
- * @returns 是否可以热加载
1435
- */ canHotLoad(plugin) {
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
- * @param name - 插件名称
1449
- * @param loader - 加载器函数
1450
- */ registerLoader(name, loader) {
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
- * @param options - 加载选项
1458
- * @returns 加载的插件
1459
- */ async loadPluginByLoader(name, options) {
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
- */ get(name) {
1493
- return this.plugins.get(name);
1230
+ * 获取事件总线
1231
+ */ getEventBus() {
1232
+ return pluginEventBus;
1494
1233
  }
1495
1234
  /**
1496
- * 获取所有插件
1497
- */ getAll() {
1498
- return Array.from(this.plugins.values());
1499
- }
1500
- /**
1501
- * 执行初始化前钩子
1502
- *
1503
- * 优化:按依赖顺序执行
1504
- */ async executeBeforeInit(options) {
1505
- const loadOrder = this.getLoadOrder();
1506
- for (const pluginName of loadOrder){
1507
- const plugin = this.plugins.get(pluginName);
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$F(this, "plugins", new Map());
1639
- _define_property$F(this, "sandboxes", new Map());
1640
- _define_property$F(this, "pluginStatus", new Map());
1641
- _define_property$F(this, "pluginLoaders", new Map());
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$E(obj, key, value) {
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 = utils.errorUtils.normalizeError(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$E(this, "error", null);
1773
- _define_property$E(this, "listeners", new Set());
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$D(obj, key, value) {
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$D(this, "middlewares", []);
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$C(obj, key, value) {
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$C(this, "id", void 0);
1928
+ */ _define_property$D(this, "id", void 0);
2318
1929
  /**
2319
1930
  * 状态作用域
2320
- */ _define_property$C(this, "scope", void 0);
1931
+ */ _define_property$D(this, "scope", void 0);
2321
1932
  /**
2322
1933
  * 当前状态值
2323
- */ _define_property$C(this, "value", void 0);
1934
+ */ _define_property$D(this, "value", void 0);
2324
1935
  /**
2325
1936
  * 订阅者集合
2326
- */ _define_property$C(this, "subscribers", new Set());
1937
+ */ _define_property$D(this, "subscribers", new Set());
2327
1938
  /**
2328
1939
  * 是否已销毁
2329
- */ _define_property$C(this, "destroyed", false);
1940
+ */ _define_property$D(this, "destroyed", false);
2330
1941
  /**
2331
1942
  * 开发模式标志
2332
- */ _define_property$C(this, "devMode", void 0);
1943
+ */ _define_property$D(this, "devMode", void 0);
2333
1944
  /**
2334
1945
  * 中间件函数数组
2335
- */ _define_property$C(this, "middleware", void 0);
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$B(obj, key, value) {
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$B(this, "scopeMap", new Map());
2086
+ */ _define_property$C(this, "scopeMap", new Map());
2476
2087
  /**
2477
2088
  * 状态实例到作用域的映射(用于快速查找)
2478
- */ _define_property$B(this, "instanceToScopeMap", new Map());
2089
+ */ _define_property$C(this, "instanceToScopeMap", new Map());
2479
2090
  }
2480
2091
  }
2481
2092
 
2482
2093
  /**
2483
2094
  * 状态注册表实现
2484
- */ function _define_property$A(obj, key, value) {
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$A(this, "instances", new Map());
2189
+ */ _define_property$B(this, "instances", new Map());
2579
2190
  /**
2580
2191
  * 作用域管理器
2581
- */ _define_property$A(this, "scopeManager", void 0);
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$z(obj, key, value) {
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$z(this, "id", void 0);
2337
+ */ _define_property$A(this, "id", void 0);
2727
2338
  /**
2728
2339
  * 状态作用域
2729
- */ _define_property$z(this, "scope", void 0);
2340
+ */ _define_property$A(this, "scope", void 0);
2730
2341
  /**
2731
2342
  * 派生状态配置
2732
- */ _define_property$z(this, "config", void 0);
2343
+ */ _define_property$A(this, "config", void 0);
2733
2344
  /**
2734
2345
  * 当前派生值
2735
- */ _define_property$z(this, "value", void 0);
2346
+ */ _define_property$A(this, "value", void 0);
2736
2347
  /**
2737
2348
  * 订阅者集合
2738
- */ _define_property$z(this, "subscribers", new Set());
2349
+ */ _define_property$A(this, "subscribers", new Set());
2739
2350
  /**
2740
2351
  * 依赖状态的取消订阅函数数组
2741
- */ _define_property$z(this, "dependencyUnsubscribes", []);
2352
+ */ _define_property$A(this, "dependencyUnsubscribes", []);
2742
2353
  /**
2743
2354
  * 是否已销毁
2744
- */ _define_property$z(this, "destroyed", false);
2355
+ */ _define_property$A(this, "destroyed", false);
2745
2356
  /**
2746
2357
  * 是否正在重新计算
2747
- */ _define_property$z(this, "recomputing", false);
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$y(obj, key, value) {
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$y(this, "name", 'DefaultAdapter');
2428
+ */ _define_property$z(this, "name", 'DefaultAdapter');
2818
2429
  /**
2819
2430
  * 是否已销毁
2820
- */ _define_property$y(this, "destroyed", false);
2431
+ */ _define_property$z(this, "destroyed", false);
2821
2432
  /**
2822
2433
  * 创建的状态实例集合(用于销毁时清理)
2823
- */ _define_property$y(this, "instances", new Set());
2434
+ */ _define_property$z(this, "instances", new Set());
2824
2435
  }
2825
2436
  }
2826
2437
 
2827
2438
  /**
2828
2439
  * 状态适配器工厂
2829
- */ function _define_property$x(obj, key, value) {
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$x(AdapterFactory, "defaultAdapter", null);
2516
+ */ _define_property$y(AdapterFactory, "defaultAdapter", null);
2906
2517
  /**
2907
2518
  * 自定义适配器映射
2908
- */ _define_property$x(AdapterFactory, "customAdapters", new Map());
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$w(obj, key, value) {
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$w(this, "id", void 0);
2700
+ */ _define_property$x(this, "id", void 0);
3090
2701
  /**
3091
2702
  * 状态作用域
3092
- */ _define_property$w(this, "scope", void 0);
2703
+ */ _define_property$x(this, "scope", void 0);
3093
2704
  /**
3094
2705
  * Redux store 引用
3095
- */ _define_property$w(this, "store", void 0);
2706
+ */ _define_property$x(this, "store", void 0);
3096
2707
  /**
3097
2708
  * Redux slice 名称(在 store 中的路径)
3098
- */ _define_property$w(this, "sliceName", void 0);
2709
+ */ _define_property$x(this, "sliceName", void 0);
3099
2710
  /**
3100
2711
  * Redux slice actions
3101
- */ _define_property$w(this, "actions", void 0);
2712
+ */ _define_property$x(this, "actions", void 0);
3102
2713
  /**
3103
2714
  * 订阅者集合
3104
- */ _define_property$w(this, "subscribers", new Set());
2715
+ */ _define_property$x(this, "subscribers", new Set());
3105
2716
  /**
3106
2717
  * Redux store 订阅取消函数
3107
- */ _define_property$w(this, "unsubscribeStore", void 0);
2718
+ */ _define_property$x(this, "unsubscribeStore", void 0);
3108
2719
  /**
3109
2720
  * 是否已销毁
3110
- */ _define_property$w(this, "destroyed", false);
2721
+ */ _define_property$x(this, "destroyed", false);
3111
2722
  /**
3112
2723
  * 开发模式标志
3113
- */ _define_property$w(this, "devMode", void 0);
2724
+ */ _define_property$x(this, "devMode", void 0);
3114
2725
  /**
3115
2726
  * 中间件函数数组
3116
- */ _define_property$w(this, "middleware", void 0);
2727
+ */ _define_property$x(this, "middleware", void 0);
3117
2728
  /**
3118
2729
  * 上一次的状态值(用于订阅通知)
3119
- */ _define_property$w(this, "previousValue", void 0);
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$w(this, "reducers", new Map());
2782
+ */ _define_property$x(this, "reducers", new Map());
3172
2783
  /**
3173
2784
  * 根 reducer 函数
3174
- */ _define_property$w(this, "rootReducer", void 0);
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$w(this, "name", 'ReduxAdapter');
2929
+ */ _define_property$x(this, "name", 'ReduxAdapter');
3319
2930
  /**
3320
2931
  * 是否已销毁
3321
- */ _define_property$w(this, "destroyed", false);
2932
+ */ _define_property$x(this, "destroyed", false);
3322
2933
  /**
3323
2934
  * 创建的状态实例集合
3324
- */ _define_property$w(this, "instances", new Set());
2935
+ */ _define_property$x(this, "instances", new Set());
3325
2936
  /**
3326
2937
  * Redux store 实例
3327
- */ _define_property$w(this, "store", null);
2938
+ */ _define_property$x(this, "store", null);
3328
2939
  /**
3329
2940
  * Redux slice 名称计数器(用于生成唯一的 slice 名称)
3330
- */ _define_property$w(this, "sliceCounter", 0);
2941
+ */ _define_property$x(this, "sliceCounter", 0);
3331
2942
  /**
3332
2943
  * Redux slice 名称到状态实例的映射
3333
- */ _define_property$w(this, "sliceToInstance", new Map());
2944
+ */ _define_property$x(this, "sliceToInstance", new Map());
3334
2945
  /**
3335
2946
  * 动态 reducer 管理器
3336
- */ _define_property$w(this, "reducerManager", void 0);
2947
+ */ _define_property$x(this, "reducerManager", void 0);
3337
2948
  /**
3338
2949
  * 是否启用开发模式
3339
- */ _define_property$w(this, "devMode", void 0);
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$v(obj, key, value) {
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$v(this, "name", 'ZustandAdapter');
3018
+ */ _define_property$w(this, "name", 'ZustandAdapter');
3408
3019
  /**
3409
3020
  * 是否已销毁
3410
- */ _define_property$v(this, "destroyed", false);
3021
+ */ _define_property$w(this, "destroyed", false);
3411
3022
  /**
3412
3023
  * 创建的状态实例集合
3413
- */ _define_property$v(this, "instances", new Set());
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$u(obj, key, value) {
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$u(this, "adapter", void 0);
3157
+ */ _define_property$v(this, "adapter", void 0);
3547
3158
  /**
3548
3159
  * 状态注册表(如果启用)
3549
- */ _define_property$u(this, "registry", void 0);
3160
+ */ _define_property$v(this, "registry", void 0);
3550
3161
  /**
3551
3162
  * 默认作用域
3552
- */ _define_property$u(this, "defaultScope", void 0);
3163
+ */ _define_property$v(this, "defaultScope", void 0);
3553
3164
  /**
3554
3165
  * 是否启用开发模式
3555
- */ _define_property$u(this, "devMode", void 0);
3166
+ */ _define_property$v(this, "devMode", void 0);
3556
3167
  /**
3557
3168
  * 是否已销毁
3558
- */ _define_property$u(this, "destroyed", false);
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$t(obj, key, value) {
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$t(this, "listeners", new Map());
3584
+ */ _define_property$u(this, "listeners", new Map());
3974
3585
  /**
3975
3586
  * 事件历史记录
3976
- */ _define_property$t(this, "eventHistory", []);
3587
+ */ _define_property$u(this, "eventHistory", []);
3977
3588
  /**
3978
3589
  * 事件中间件列表
3979
- */ _define_property$t(this, "middlewares", []);
3590
+ */ _define_property$u(this, "middlewares", []);
3980
3591
  /**
3981
3592
  * 事件统计信息
3982
- */ _define_property$t(this, "stats", new Map());
3593
+ */ _define_property$u(this, "stats", new Map());
3983
3594
  /**
3984
3595
  * 配置
3985
- */ _define_property$t(this, "config", void 0);
3596
+ */ _define_property$u(this, "config", void 0);
3986
3597
  /**
3987
3598
  * 事件计数器(用于生成唯一事件ID)
3988
- */ _define_property$t(this, "eventCounter", 0);
3599
+ */ _define_property$u(this, "eventCounter", 0);
3989
3600
  /**
3990
3601
  * 监听器ID计数器
3991
- */ _define_property$t(this, "listenerIdCounter", 0);
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 utils.PerformanceMonitor({
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$s(obj, key, value) {
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$s(this, "_config", void 0);
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$s(AppConfigManager, "instance", null);
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$r(obj, key, value) {
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 = utils.errorUtils.normalizeError(error);
4557
+ const normalizedError = vlianUtils.errorUtils.normalizeError(error);
4947
4558
  // 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)
4948
- const errorWithContext = context ? new utils.FrameworkError(normalizedError.message, normalizedError.type, normalizedError.severity, {
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 = utils.errorUtils.extractErrorInfo(error);
4639
+ const errorInfo = vlianUtils.errorUtils.extractErrorInfo(error);
5029
4640
  // 根据错误严重程度选择日志级别
5030
4641
  switch(error.severity){
5031
- case utils.ErrorSeverity.CRITICAL:
5032
- case utils.ErrorSeverity.HIGH:
4642
+ case vlianUtils.ErrorSeverity.CRITICAL:
4643
+ case vlianUtils.ErrorSeverity.HIGH:
5033
4644
  logger.logger.error('错误:', errorInfo);
5034
4645
  break;
5035
- case utils.ErrorSeverity.MEDIUM:
4646
+ case vlianUtils.ErrorSeverity.MEDIUM:
5036
4647
  logger.logger.warn('警告:', errorInfo);
5037
4648
  break;
5038
- case utils.ErrorSeverity.LOW:
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 = utils.errorUtils.formatErrorForDev(error);
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$r(this, "config", void 0);
5117
- _define_property$r(this, "monitoring", void 0);
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 = utils.errorUtils.normalizeError(error);
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 = utils.errorUtils.normalizeError(error);
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 = utils.errorUtils.normalizeError(error);
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$q(obj, key, value) {
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$q(this, "cache", new Map());
5594
- _define_property$q(this, "maxSize", void 0);
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 = utils.SecurityUtils.validateInput(path);
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 utils.SecurityError(errorMessage, undefined, process.env.NODE_ENV === 'development' ? {
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$q(this, "pool", []);
5989
- _define_property$q(this, "maxPoolSize", 100);
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 utils.ValidationError('路由配置加载失败', {
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 utils.ValidationError('路由转换失败', {
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$p(obj, key, value) {
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$p(this, "errors", void 0), this.errors = errors;
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$o(obj, key, value) {
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$o(this, "hooks", []);
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$n(obj, key, value) {
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$n(this, "middlewares", []);
6901
+ _define_property$o(this, "middlewares", []);
7291
6902
  }
7292
6903
  }
7293
- _define_property$n(RouterMiddlewareManager, "SAFE_REDIRECT_PATH_REGEX", /^(\/|\.\/|\.\.\/|#)/);
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 utils.FrameworkError {
7392
- constructor(message, code, severity = utils.ErrorSeverity.MEDIUM, cause, context){
7393
- super(message, utils.ErrorType.RUNTIME, severity, {
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$m(obj, key, value) {
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$m(this, "cache", new Map());
7646
- _define_property$m(this, "matchCache", new Map());
7647
- _define_property$m(this, "config", void 0);
7648
- _define_property$m(this, "persistenceEnabled", false);
7649
- _define_property$m(this, "cleanupTimer", null);
7650
- _define_property$m(this, "stats", {
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$l(obj, key, value) {
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$l(this, "tasks", new Map());
7931
- _define_property$l(this, "config", void 0);
7932
- _define_property$l(this, "preloadTimer", null);
7933
- _define_property$l(this, "idleHandle", null);
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$k(obj, key, value) {
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$k(this, "plugins", new Map());
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$j(obj, key, value) {
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$j(this, "accessRecords", []);
8408
- _define_property$j(this, "performanceMetrics", new Map());
8409
- _define_property$j(this, "config", void 0);
8410
- _define_property$j(this, "monitoringService", monitoring.getMonitoring());
8411
- _define_property$j(this, "currentRouteStartTime", 0);
8412
- _define_property$j(this, "currentRoute", void 0);
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$i(obj, key, value) {
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$i(this, "adapters", new Map());
8634
- _define_property$i(this, "currentAdapter", null);
8635
- _define_property$i(this, "defaultAdapterName", null);
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$h(obj, key, value) {
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$h(this, "name", 'react-router');
8747
- _define_property$h(this, "version", '6.0.0');
8748
- _define_property$h(this, "router", null);
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$g(obj, key, value) {
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$g(this, "router", null);
8608
+ */ _define_property$h(this, "router", null);
8982
8609
  /**
8983
8610
  * 是否已初始化
8984
- */ _define_property$g(this, "initialized", false);
8611
+ */ _define_property$h(this, "initialized", false);
8985
8612
  /**
8986
8613
  * 路由缓存实例
8987
- */ _define_property$g(this, "cache", getRouteCache());
8614
+ */ _define_property$h(this, "cache", getRouteCache());
8988
8615
  /**
8989
8616
  * 路由预加载器实例
8990
- */ _define_property$g(this, "preloader", getRoutePreloader());
8617
+ */ _define_property$h(this, "preloader", getRoutePreloader());
8991
8618
  /**
8992
8619
  * 路由插件管理器实例
8993
- */ _define_property$g(this, "pluginManager", getRouterPluginManager());
8620
+ */ _define_property$h(this, "pluginManager", getRouterPluginManager());
8994
8621
  /**
8995
8622
  * 路由监控服务实例
8996
- */ _define_property$g(this, "monitoring", getRouterMonitoring());
8623
+ */ _define_property$h(this, "monitoring", getRouterMonitoring());
8997
8624
  /**
8998
8625
  * 路由适配器管理器实例
8999
- */ _define_property$g(this, "adapterManager", getAdapterManager());
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$g(RouterManager, "instance", null);
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$f(obj, key, value) {
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 = utils.SecurityUtils.validateInput(configStr);
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$f(this, "root", null);
9271
- _define_property$f(this, "container", null);
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$e(obj, key, value) {
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$e(this, "monitoring", void 0);
9434
- _define_property$e(this, "metrics", {});
9435
- _define_property$e(this, "startTime", void 0);
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$d(obj, key, value) {
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$d(this, "id", void 0);
9163
+ */ _define_property$e(this, "id", void 0);
9537
9164
  /**
9538
9165
  * 应用渲染器
9539
- */ _define_property$d(this, "renderer", void 0);
9166
+ */ _define_property$e(this, "renderer", void 0);
9540
9167
  /**
9541
9168
  * 服务实例
9542
- */ _define_property$d(this, "services", null);
9169
+ */ _define_property$e(this, "services", null);
9543
9170
  /**
9544
9171
  * 性能追踪器
9545
- */ _define_property$d(this, "performanceTracker", null);
9172
+ */ _define_property$e(this, "performanceTracker", null);
9546
9173
  /**
9547
9174
  * 启动配置
9548
- */ _define_property$d(this, "options", void 0);
9175
+ */ _define_property$e(this, "options", void 0);
9549
9176
  /**
9550
9177
  * 是否已初始化
9551
- */ _define_property$d(this, "initialized", false);
9178
+ */ _define_property$e(this, "initialized", false);
9552
9179
  /**
9553
9180
  * 是否已销毁
9554
- */ _define_property$d(this, "destroyed", false);
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$d(this, "instances", new Map());
9653
- _define_property$d(this, "defaultInstanceId", null);
9279
+ _define_property$e(this, "instances", new Map());
9280
+ _define_property$e(this, "defaultInstanceId", null);
9654
9281
  // 私有构造函数
9655
9282
  }
9656
9283
  }
9657
- _define_property$d(AppInstanceManager, "instance", null);
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$c(obj, key, value) {
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$c(this, "environment", void 0);
9801
- _define_property$c(this, "isBrowser", void 0);
9802
- _define_property$c(this, "isSSR", void 0);
9803
- _define_property$c(this, "isMicroFrontend", void 0);
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$c(EnvironmentDetector, "instance", null);
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$b(obj, key, value) {
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$b(this, "eventBus", void 0);
9627
+ _define_property$c(this, "eventBus", void 0);
10001
9628
  this.eventBus = eventBus;
10002
9629
  }
10003
9630
  }
10004
9631
 
10005
- function _define_property$a(obj, key, value) {
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$a(this, "code", void 0), _define_property$a(this, "phase", void 0), _define_property$a(this, "severity", void 0), _define_property$a(this, "retryable", void 0), _define_property$a(this, "traceId", void 0), _define_property$a(this, "cause", void 0);
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$9(obj, key, value) {
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$9(this, "instance", null);
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$9(this, "bus", null);
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 utils.InitializationError('未找到挂载容器', undefined, {
10062
+ throw new vlianUtils.InitializationError('未找到挂载容器', undefined, {
10436
10063
  container: options.container
10437
- }, utils.ErrorCode.CONTAINER_NOT_FOUND);
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$8(obj, key, value) {
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$8(this, "listeners", new Set());
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$7(obj, key, value) {
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$7(RouterNavigation, "MAX_REDIRECTS", 10);
10828
+ _define_property$8(RouterNavigation, "MAX_REDIRECTS", 10);
11202
10829
 
11203
- function _define_property$6(obj, key, value) {
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$6(this, "registeredRoutes", new Map());
11361
- _define_property$6(this, "routeVersion", 0);
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$5(obj, key, value) {
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$5(this, "versions", new Map());
11537
- _define_property$5(this, "migrations", new Map());
11538
- _define_property$5(this, "config", void 0);
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
- function DevToolsTrigger({ appInstance, position = 'bottom-right' }) {
11860
- const [visible, setVisible] = React.useState(false);
11861
- if (process.env.NODE_ENV !== 'development') {
11862
- return null;
11924
+ /**
11925
+ * 获取默认分析服务
11926
+ */ function getAnalytics() {
11927
+ if (!defaultAnalyticsService) {
11928
+ return initAnalytics();
11863
11929
  }
11864
- return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
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 options - 启动配置选项
11892
- * @returns Promise<void>
11943
+ * @param time - 等待时间(毫秒),默认为 100 毫秒
11944
+ * @returns 返回一个 Promise,在指定时间后解析为 true
11893
11945
  *
11894
11946
  * @example
11895
11947
  * ```typescript
11896
- * import { start } from '@vlian/framework';
11948
+ * // 等待 500 毫秒
11949
+ * await waitTime(500);
11897
11950
  *
11898
- * start({
11899
- * loggerLevel: LogLevel.DEBUG,
11900
- * lifecycle: {
11901
- * beforeInitialization: async () => {
11902
- * console.log('初始化前执行');
11903
- * },
11904
- * },
11905
- * });
11951
+ * // 使用默认等待时间(100 毫秒)
11952
+ * await waitTime();
11906
11953
  * ```
11907
- */ /**
11908
- * 启动框架(向后兼容的API)
11909
- *
11910
- * @param options - 启动配置选项
11911
- * @returns Promise<void>
11912
- *
11913
- * @deprecated 建议使用 startApp 函数,支持多实例
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 utils.PERFORMANCE_METRIC_UNITS; }
12793
+ get: function () { return vlianUtils.PERFORMANCE_METRIC_UNITS; }
12797
12794
  });
12798
12795
  Object.defineProperty(exports, "PerformanceMonitor", {
12799
12796
  enumerable: true,
12800
- get: function () { return utils.PerformanceMonitor; }
12797
+ get: function () { return vlianUtils.PerformanceMonitor; }
12801
12798
  });
12802
12799
  Object.defineProperty(exports, "ResourceLoader", {
12803
12800
  enumerable: true,
12804
- get: function () { return utils.ResourceLoader; }
12801
+ get: function () { return vlianUtils.ResourceLoader; }
12805
12802
  });
12806
12803
  Object.defineProperty(exports, "RuntimeSecurity", {
12807
12804
  enumerable: true,
12808
- get: function () { return utils.RuntimeSecurity; }
12805
+ get: function () { return vlianUtils.RuntimeSecurity; }
12809
12806
  });
12810
12807
  Object.defineProperty(exports, "SENSITIVE_FIELDS", {
12811
12808
  enumerable: true,
12812
- get: function () { return utils.SENSITIVE_FIELDS; }
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 utils.SecurityUtils; }
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 utils.Validator; }
12817
+ get: function () { return vlianUtils.Validator; }
12833
12818
  });
12834
12819
  Object.defineProperty(exports, "commonSchemas", {
12835
12820
  enumerable: true,
12836
- get: function () { return utils.commonSchemas; }
12821
+ get: function () { return vlianUtils.commonSchemas; }
12837
12822
  });
12838
12823
  Object.defineProperty(exports, "convertMetricsToWithUnits", {
12839
12824
  enumerable: true,
12840
- get: function () { return utils.convertMetricsToWithUnits; }
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 utils.resourceLoader; }
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, "MonitoringEventType", {
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 request.fetchAdapter; }
12885
+ get: function () { return monitoring.MonitoringService; }
12997
12886
  });
12998
- Object.defineProperty(exports, "kyAdapter", {
12887
+ Object.defineProperty(exports, "getMonitoring", {
12999
12888
  enumerable: true,
13000
- get: function () { return request.kyAdapter; }
12889
+ get: function () { return monitoring.getMonitoring; }
13001
12890
  });
13002
- Object.defineProperty(exports, "updateRequestContext", {
12891
+ Object.defineProperty(exports, "initMonitoring", {
13003
12892
  enumerable: true,
13004
- get: function () { return request.updateRequestContext; }
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;