@vlian/framework 1.2.63 → 2.0.1

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 (185) hide show
  1. package/README.md +21 -141
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.ts +1 -9
  4. package/dist/index.js +1 -1
  5. package/dist/index.umd.js +10 -220
  6. package/dist/kernel/constants.cjs +1 -1
  7. package/dist/kernel/constants.d.ts +1 -3
  8. package/dist/kernel/constants.js +1 -1
  9. package/dist/kernel/custom-manager/i18n/constants.cjs +1 -0
  10. package/dist/kernel/custom-manager/i18n/constants.d.ts +4 -0
  11. package/dist/kernel/custom-manager/i18n/constants.js +1 -0
  12. package/dist/kernel/custom-manager/i18n/index.cjs +1 -0
  13. package/dist/kernel/custom-manager/i18n/index.d.ts +7 -0
  14. package/dist/kernel/custom-manager/i18n/index.js +1 -0
  15. package/dist/kernel/custom-manager/i18n/types.d.ts +10 -0
  16. package/dist/kernel/custom-manager/index.cjs +1 -0
  17. package/dist/kernel/custom-manager/index.d.ts +4 -0
  18. package/dist/kernel/custom-manager/index.js +1 -0
  19. package/dist/kernel/custom-manager/theme/constants.cjs +1 -0
  20. package/dist/kernel/custom-manager/theme/constants.d.ts +4 -0
  21. package/dist/kernel/custom-manager/theme/constants.js +1 -0
  22. package/dist/kernel/custom-manager/theme/index.cjs +1 -0
  23. package/dist/kernel/custom-manager/theme/index.d.ts +7 -0
  24. package/dist/kernel/custom-manager/theme/index.js +1 -0
  25. package/dist/kernel/custom-manager/theme/types.d.ts +14 -0
  26. package/dist/kernel/index.cjs +1 -1
  27. package/dist/kernel/index.d.ts +4 -2
  28. package/dist/kernel/index.js +1 -1
  29. package/dist/kernel/kernel.cjs +1 -1
  30. package/dist/kernel/kernel.d.ts +3 -7
  31. package/dist/kernel/kernel.js +1 -1
  32. package/dist/kernel/manager/i18n/I18nManager.cjs +1 -1
  33. package/dist/kernel/manager/i18n/I18nManager.d.ts +2 -1
  34. package/dist/kernel/manager/i18n/I18nManager.js +1 -1
  35. package/dist/kernel/manager/i18n/i18n.persistence.d.ts +2 -1
  36. package/dist/kernel/manager/i18n/i18n.runtime.cjs +1 -0
  37. package/dist/kernel/manager/i18n/i18n.runtime.d.ts +8 -0
  38. package/dist/kernel/manager/i18n/i18n.runtime.js +1 -0
  39. package/dist/kernel/manager/i18n/i18n.schema.d.ts +1 -1
  40. package/dist/kernel/manager/i18nManager.cjs +1 -1
  41. package/dist/kernel/manager/i18nManager.d.ts +1 -1
  42. package/dist/kernel/manager/i18nManager.js +1 -1
  43. package/dist/kernel/manager/index.cjs +1 -1
  44. package/dist/kernel/manager/index.d.ts +0 -2
  45. package/dist/kernel/manager/index.js +1 -1
  46. package/dist/kernel/manager/theme/ThemeManager.cjs +1 -1
  47. package/dist/kernel/manager/theme/ThemeManager.d.ts +8 -1
  48. package/dist/kernel/manager/theme/ThemeManager.js +1 -1
  49. package/dist/kernel/manager/theme/theme.dom.cjs +1 -1
  50. package/dist/kernel/manager/theme/theme.dom.d.ts +10 -3
  51. package/dist/kernel/manager/theme/theme.dom.js +1 -1
  52. package/dist/kernel/manager/theme/theme.persistence.d.ts +2 -1
  53. package/dist/kernel/manager/theme/theme.schema.cjs +1 -1
  54. package/dist/kernel/manager/theme/theme.schema.d.ts +3 -1
  55. package/dist/kernel/manager/theme/theme.schema.js +1 -1
  56. package/dist/kernel/manager/themeManager.cjs +1 -1
  57. package/dist/kernel/manager/themeManager.d.ts +1 -1
  58. package/dist/kernel/manager/themeManager.js +1 -1
  59. package/dist/kernel/types.d.ts +10 -39
  60. package/package.json +10 -133
  61. package/dist/analytics/index.cjs +0 -1
  62. package/dist/analytics/index.d.ts +0 -2
  63. package/dist/analytics/index.js +0 -1
  64. package/dist/analytics.umd.js +0 -19
  65. package/dist/components/index.cjs +0 -1
  66. package/dist/components/index.d.ts +0 -1
  67. package/dist/components/index.js +0 -1
  68. package/dist/components/persistence.cjs +0 -1
  69. package/dist/components/persistence.d.ts +0 -12
  70. package/dist/components/persistence.js +0 -1
  71. package/dist/library/index.cjs +0 -1
  72. package/dist/library/index.d.ts +0 -2
  73. package/dist/library/index.js +0 -1
  74. package/dist/library/locale/index.cjs +0 -1
  75. package/dist/library/locale/index.d.ts +0 -6
  76. package/dist/library/locale/index.js +0 -1
  77. package/dist/library/locale/langs/en-us/index.cjs +0 -1
  78. package/dist/library/locale/langs/en-us/index.d.ts +0 -3
  79. package/dist/library/locale/langs/en-us/index.js +0 -1
  80. package/dist/library/locale/langs/zh-cn/index.cjs +0 -1
  81. package/dist/library/locale/langs/zh-cn/index.d.ts +0 -3
  82. package/dist/library/locale/langs/zh-cn/index.js +0 -1
  83. package/dist/library/locale/types.d.ts +0 -38
  84. package/dist/library/storage/cache.cjs +0 -1
  85. package/dist/library/storage/cache.d.ts +0 -57
  86. package/dist/library/storage/cache.js +0 -1
  87. package/dist/library/storage/encryption.cjs +0 -1
  88. package/dist/library/storage/encryption.d.ts +0 -45
  89. package/dist/library/storage/encryption.js +0 -1
  90. package/dist/library/storage/index.cjs +0 -1
  91. package/dist/library/storage/index.d.ts +0 -62
  92. package/dist/library/storage/index.js +0 -1
  93. package/dist/state/StateManager.cjs +0 -1
  94. package/dist/state/StateManager.d.ts +0 -120
  95. package/dist/state/StateManager.js +0 -1
  96. package/dist/state/adapters/AdapterFactory.cjs +0 -1
  97. package/dist/state/adapters/AdapterFactory.d.ts +0 -51
  98. package/dist/state/adapters/AdapterFactory.js +0 -1
  99. package/dist/state/adapters/DefaultAdapter.cjs +0 -1
  100. package/dist/state/adapters/DefaultAdapter.d.ts +0 -38
  101. package/dist/state/adapters/DefaultAdapter.js +0 -1
  102. package/dist/state/adapters/ReduxAdapter.cjs +0 -1
  103. package/dist/state/adapters/ReduxAdapter.d.ts +0 -129
  104. package/dist/state/adapters/ReduxAdapter.js +0 -1
  105. package/dist/state/adapters/ZustandAdapter.cjs +0 -1
  106. package/dist/state/adapters/ZustandAdapter.d.ts +0 -46
  107. package/dist/state/adapters/ZustandAdapter.js +0 -1
  108. package/dist/state/adapters/index.cjs +0 -1
  109. package/dist/state/adapters/index.d.ts +0 -8
  110. package/dist/state/adapters/index.js +0 -1
  111. package/dist/state/adapters/types.cjs +0 -1
  112. package/dist/state/adapters/types.d.ts +0 -4
  113. package/dist/state/adapters/types.js +0 -1
  114. package/dist/state/core/DerivedStateInstance.cjs +0 -1
  115. package/dist/state/core/DerivedStateInstance.d.ts +0 -100
  116. package/dist/state/core/DerivedStateInstance.js +0 -1
  117. package/dist/state/core/StateInstance.cjs +0 -1
  118. package/dist/state/core/StateInstance.d.ts +0 -85
  119. package/dist/state/core/StateInstance.js +0 -1
  120. package/dist/state/core/StateRegistry.cjs +0 -1
  121. package/dist/state/core/StateRegistry.d.ts +0 -55
  122. package/dist/state/core/StateRegistry.js +0 -1
  123. package/dist/state/core/StateScope.cjs +0 -1
  124. package/dist/state/core/StateScope.d.ts +0 -71
  125. package/dist/state/core/StateScope.js +0 -1
  126. package/dist/state/core/index.cjs +0 -1
  127. package/dist/state/core/index.d.ts +0 -7
  128. package/dist/state/core/index.js +0 -1
  129. package/dist/state/index.cjs +0 -1
  130. package/dist/state/index.d.ts +0 -8
  131. package/dist/state/index.js +0 -1
  132. package/dist/state/types.d.ts +0 -230
  133. package/dist/state.umd.js +0 -41
  134. package/dist/types.cjs +0 -1
  135. package/dist/types.d.ts +0 -7
  136. package/dist/types.js +0 -1
  137. package/dist/utils/analytics.cjs +0 -1
  138. package/dist/utils/analytics.d.ts +0 -127
  139. package/dist/utils/analytics.js +0 -1
  140. package/dist/utils/configSecurity.cjs +0 -3
  141. package/dist/utils/configSecurity.d.ts +0 -100
  142. package/dist/utils/configSecurity.js +0 -3
  143. package/dist/utils/csrf.cjs +0 -1
  144. package/dist/utils/csrf.d.ts +0 -1
  145. package/dist/utils/csrf.js +0 -1
  146. package/dist/utils/errors/ErrorCodes.cjs +0 -1
  147. package/dist/utils/errors/ErrorCodes.d.ts +0 -1
  148. package/dist/utils/errors/ErrorCodes.js +0 -1
  149. package/dist/utils/errors.cjs +0 -1
  150. package/dist/utils/errors.d.ts +0 -30
  151. package/dist/utils/errors.js +0 -1
  152. package/dist/utils/index.cjs +0 -1
  153. package/dist/utils/index.d.ts +0 -39
  154. package/dist/utils/index.js +0 -1
  155. package/dist/utils/logger.cjs +0 -1
  156. package/dist/utils/logger.d.ts +0 -2
  157. package/dist/utils/logger.js +0 -1
  158. package/dist/utils/logger.types.cjs +0 -1
  159. package/dist/utils/logger.types.d.ts +0 -2
  160. package/dist/utils/logger.types.js +0 -1
  161. package/dist/utils/monitoring.cjs +0 -1
  162. package/dist/utils/monitoring.d.ts +0 -1
  163. package/dist/utils/monitoring.js +0 -1
  164. package/dist/utils/performance.cjs +0 -1
  165. package/dist/utils/performance.d.ts +0 -2
  166. package/dist/utils/performance.js +0 -1
  167. package/dist/utils/resourceLoader.cjs +0 -1
  168. package/dist/utils/resourceLoader.d.ts +0 -2
  169. package/dist/utils/resourceLoader.js +0 -1
  170. package/dist/utils/runtimeSecurity.cjs +0 -1
  171. package/dist/utils/runtimeSecurity.d.ts +0 -2
  172. package/dist/utils/runtimeSecurity.js +0 -1
  173. package/dist/utils/security.cjs +0 -1
  174. package/dist/utils/security.d.ts +0 -2
  175. package/dist/utils/security.js +0 -1
  176. package/dist/utils/traceId.cjs +0 -1
  177. package/dist/utils/traceId.d.ts +0 -1
  178. package/dist/utils/traceId.js +0 -1
  179. package/dist/utils/validation.cjs +0 -1
  180. package/dist/utils/validation.d.ts +0 -2
  181. package/dist/utils/validation.js +0 -1
  182. /package/dist/{library/locale → kernel/custom-manager/i18n}/types.cjs +0 -0
  183. /package/dist/{library/locale → kernel/custom-manager/i18n}/types.js +0 -0
  184. /package/dist/{state → kernel/custom-manager/theme}/types.cjs +0 -0
  185. /package/dist/{state → kernel/custom-manager/theme}/types.js +0 -0
package/README.md CHANGED
@@ -1,170 +1,51 @@
1
1
  # @vlian/framework
2
2
 
3
- Secra Framework - 一个现代化的低代码前端应用框架
3
+ Secra Framework - kernel-only runtime package
4
4
 
5
5
  ## 简介
6
6
 
7
- Secra Framework 是一个低门槛、高可扩展、面向团队的前端应用启动框架,让开发者一行配置即可快速启动完整基础设施,同时保持长期可演进与插件生态自由。
8
-
9
- ## 特性
10
-
11
- - 🚀 **开箱即用**:一行配置即可启动完整基础设施
12
- - 🔌 **插件化架构**:支持中间件和插件系统,灵活扩展
13
- - 🌍 **国际化支持**:基于 i18next 的多语言支持
14
- - 🎨 **主题系统**:支持浅色/深色/自动主题切换
15
- - 🔄 **状态管理**:统一的状态管理抽象,支持多种适配器
16
- - 🛣️ **路由系统**:配置驱动的路由系统,支持权限控制
17
- - 📡 **请求库**:企业级请求库,支持多种 HTTP 适配器
18
- - 🔒 **安全防护**:XSS 防护、配置验证、输入清理等安全功能
19
- - 📊 **性能监控**:Web Vitals 收集和性能指标监控
20
- - 🐛 **错误处理**:完整的错误类型体系和错误边界
7
+ `@vlian/framework@2.0.0` 开始只保留 kernel 运行时能力。根入口 `@vlian/framework` 与子路径 `@vlian/framework/kernel` 都只导出 kernel API,历史上的 `utils`、`state`、`library`、`components`、`analytics` 已从当前版本移除。
21
8
 
22
9
  ## 安装
23
10
 
24
11
  ```bash
25
- # 使用 pnpm
26
- pnpm add @vlian/framework
27
-
28
- # 使用 npm
29
- npm install @vlian/framework
30
-
31
- # 使用 yarn
32
- yarn add @vlian/framework
12
+ pnpm add @vlian/framework i18next @vlian/logger @vlian/utils
33
13
  ```
34
14
 
35
15
  ## 快速开始
36
16
 
37
- ### 基本使用
38
-
39
17
  ```typescript
40
- import { startApp } from '@vlian/framework';
41
- import App from './App';
18
+ import { getKernel, startup, registerThemeManager } from '@vlian/framework';
42
19
 
43
- // 启动应用
44
- await startApp({
45
- app: <App />,
46
- });
47
- ```
20
+ const kernel = await startup({}, 'app');
48
21
 
49
- ### 完整配置示例
50
-
51
- ```typescript
52
- import { startApp, LogLevel } from '@vlian/framework';
53
- import App from './App';
54
-
55
- await startApp({
56
- app: <App />,
57
- loggerLevel: LogLevel.DEBUG,
58
- theme: {
59
- mode: 'dark',
60
- primaryColor: '#1890ff',
61
- },
62
- locale: {
63
- 'zh-CN': {
64
- common: {
65
- confirm: '确认',
66
- cancel: '取消',
67
- },
68
- },
69
- 'en-US': {
70
- common: {
71
- confirm: 'Confirm',
72
- cancel: 'Cancel',
73
- },
74
- },
75
- },
76
- router: {
77
- enabled: true,
78
- mode: 'browser',
79
- routes: [
80
- {
81
- path: '/',
82
- component: './pages/Home',
83
- meta: { title: '首页' },
84
- },
85
- ],
22
+ await registerThemeManager(kernel, {
23
+ initial: {
24
+ mode: 'light',
86
25
  },
87
26
  });
88
27
  ```
89
28
 
90
- ## 按需导入
91
-
92
- 框架支持按需导入(Tree Shaking),可以显著减少打包体积。主入口 `@vlian/framework` 主要用于兼容和快速接入,生产环境优先使用子路径导入来减少最终应用体积:
93
-
94
- ```typescript
95
- // 只导入核心启动功能
96
- import { startApp } from '@vlian/framework/core';
97
-
98
- // 只导入工具函数
99
- import { logger, LogLevel } from '@vlian/framework/utils';
100
-
101
- // 只导入状态管理
102
- import { StateManager } from '@vlian/framework/state';
103
-
104
- // 只导入请求库
105
- import { createRequestClient } from '@vlian/framework/request';
106
-
107
- // 只导入国际化
108
- import { setupI18n, $t } from '@vlian/framework/library';
109
- ```
110
-
111
- ### 可用的子路径
112
-
113
- - `@vlian/framework/core` - 核心模块(启动、上下文、路由等)
114
- - `@vlian/framework/utils` - 工具模块(日志、验证、安全等)
115
- - `@vlian/framework/state` - 状态管理模块
116
- - `@vlian/framework/library` - 基础库模块(国际化、存储等)
117
- - `@vlian/framework/request` - 请求库模块
118
- - `@vlian/framework/components` - 组件模块(当前为空)
119
-
120
- ### 打包体积优化
121
-
122
- 使用按需导入可以减少 30-50% 的打包体积,具体取决于你使用的功能。详细说明请查看 [按需导入使用指南](./docs/general/按需导入使用指南.md)。
123
-
124
- ## 外部依赖说明
125
-
126
- 为了减小包体积,框架会将宿主应用应自行提供的核心依赖保持为外部依赖。安装本包时,请同时根据使用场景安装对应依赖:
127
-
128
- - `react`
129
- - `react-dom`
130
- - `react-router-dom`
131
- - `i18next`
132
- - `react-i18next`
133
- - `react-error-boundary`
134
- - `zod`
135
-
136
- ## 核心模块
137
-
138
- ### Core 模块
139
-
140
- 框架的核心模块,提供启动、上下文管理、初始化、错误边界等功能。
141
-
142
- ### Utils 模块
143
-
144
- 工具模块,提供日志、错误处理、验证、安全、监控等功能。
145
-
146
- ### Library 模块
147
-
148
- 基础库模块,提供国际化、存储等功能。
149
-
150
- ### State 模块
151
-
152
- 状态管理模块,提供统一的状态管理抽象,支持多种适配器。
29
+ ## 导出范围
153
30
 
154
- ### Request 模块
31
+ - `@vlian/framework`
32
+ - `@vlian/framework/kernel`
155
33
 
156
- 请求库模块,提供企业级请求能力,支持多种 HTTP 适配器和插件系统。
34
+ 两者导出相同的 kernel API,包括 `Kernel`、`startup`、`getKernel`、`kernelStartApp` 以及相关类型。
35
+ `theme`、`i18n` 现在作为可选自定义管理器导出,按需注册到 kernel。
157
36
 
158
- ## 文档
37
+ ## 迁移说明
159
38
 
160
- 详细文档请查看 [docs/README.md](./docs/README.md)
39
+ - 删除所有 `@vlian/framework/utils`、`@vlian/framework/state`、`@vlian/framework/library`、`@vlian/framework/components`、`@vlian/framework/analytics` 的导入。
40
+ - 旧模块如果仍有业务价值,需要迁移到应用侧或拆分为独立包维护。
41
+ - `theme`、`i18n` 不再默认随 kernel 启动;需要时请显式注册自定义管理器。
42
+ - 推荐围绕 kernel manager 收口日志、缓存,以及按需挂载的主题和国际化能力。
161
43
 
162
44
  ## 依赖要求
163
45
 
164
- - React: ^18.0.0 || ^19.0.0
165
- - React DOM: ^18.0.0 || ^19.0.0
166
- - React Router DOM: ^7.0.0
167
- - react-error-boundary: ^6.0.0
46
+ - `i18next`: `^23.0.0 || ^24.0.0 || ^25.0.0`
47
+ - `@vlian/logger`: `^0.1.0`
48
+ - `@vlian/utils`: `^2.0.1`
168
49
 
169
50
  ## 许可证
170
51
 
@@ -172,5 +53,4 @@ Apache-2.0
172
53
 
173
54
  ## 相关链接
174
55
 
175
- - [文档](./docs/README.md)
176
56
  - [变更日志](./CHANGELOG.md)
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get $t(){return _library.$t},get Kernel(){return _kernel.Kernel},get getKernel(){return _kernel.getKernel},get kernelStartApp(){return _kernel.kernelStartApp},get setLang(){return _library.setLang},get setupI18n(){return _library.setupI18n},get startup(){return _kernel.startup}});const _library=require("./library");_export_star(require("./utils"),exports);_export_star(require("./state"),exports);_export_star(require("./components"),exports);const _kernel=require("./kernel");function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get Kernel(){return _kernel.Kernel},get getKernel(){return _kernel.getKernel},get kernelStartApp(){return _kernel.kernelStartApp},get startup(){return _kernel.startup}});const _kernel=require("./kernel");
package/dist/index.d.ts CHANGED
@@ -1,10 +1,2 @@
1
- import { setupI18n, setLang, $t } from './library';
2
- export * from './utils';
3
- export * from './state';
4
- export * from './components';
5
- /**
6
- * 国际化
7
- **/
8
- export { setupI18n, setLang, $t };
9
1
  export { Kernel, startup, getKernel, kernelStartApp } from './kernel';
10
- export type { KernelStartOptions as KernelStartupOptions, KernelConfig as KernelRuntimeConfig, KernelTimingMetric as KernelRuntimeTimingMetric, KernelManager as RuntimeKernelManager, KernelRenderContext } from './kernel';
2
+ export type { KernelStartOptions as KernelStartupOptions, KernelConfig as KernelRuntimeConfig, KernelTimingMetric as KernelRuntimeTimingMetric, KernelManager as RuntimeKernelManager, StorageOptions as KernelStorageOptions, KernelRenderContext } from './kernel';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{setupI18n,setLang,$t}from"./library";export*from"./utils";export*from"./state";export*from"./components";export{setupI18n,setLang,$t};export{Kernel,startup,getKernel,kernelStartApp}from"./kernel";
1
+ export{Kernel,startup,getKernel,kernelStartApp}from"./kernel";
package/dist/index.umd.js CHANGED
@@ -1,240 +1,30 @@
1
1
  /*!
2
- * @vlian/framework v1.2.62
2
+ * @vlian/framework v2.0.0
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('i18next'), require('react-i18next'), require('@vlian/utils'), require('@vlian/logger'), require('@vlian/csrf'), require('@vlian/monitoring')) :
9
- typeof define === 'function' && define.amd ? define(['exports', 'i18next', 'react-i18next', '@vlian/utils', '@vlian/logger', '@vlian/csrf', '@vlian/monitoring'], factory) :
10
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.i18next, global.ReactI18next, global.VlianUtils, global.VlianLogger, global.VlianCsrf, global.VlianMonitoring));
11
- })(this, (function (exports, i18n, reactI18next, vlianUtils, logger, csrf, monitoring) { 'use strict';
8
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/logger'), require('@vlian/utils')) :
9
+ typeof define === 'function' && define.amd ? define(['exports', '@vlian/logger', '@vlian/utils'], factory) :
10
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.VlianLogger, global.VlianUtils));
11
+ })(this, (function (exports, logger, utils) { 'use strict';
12
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);
31
-
32
- const reactI18nextInstance=i18n.use(reactI18next.initReactI18next);async function setupI18n(options,callback){await reactI18nextInstance.init(options,callback);}const $t=i18n.t;async function setLang(locale,callback){await i18n.changeLanguage(locale,callback);}
33
-
34
- const utils=vlianUtils__namespace;const ErrorCode=utils.ErrorCode;const ErrorMessages=utils.ErrorMessages;const getErrorMessage=utils.getErrorMessage;const getUserFriendlyMessage=utils.getUserFriendlyMessage;const ErrorType=utils.ErrorType;const ErrorSeverity=utils.ErrorSeverity;const FrameworkError=utils.FrameworkError;const InitializationError=utils.InitializationError;const ConfigError=utils.ConfigError;const StorageError=utils.StorageError;const NetworkError=utils.NetworkError;const ValidationError=utils.ValidationError;const SecurityError=utils.SecurityError;const errorUtils=utils.errorUtils;
35
-
36
- class ConfigSecurity{static async verifySignature(config,signature,options){if(!options.enabled){return true}if(!options.publicKey){throw new SecurityError("签名验证需要提供公钥")}if(!signature||signature.length===0){throw new SecurityError("签名不能为空")}try{if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new SecurityError("签名验证需要浏览器支持 Web Crypto API")}const configString=JSON.stringify(config,Object.keys(config).sort());const encoder=new TextEncoder;const data=encoder.encode(configString);const signatureBuffer=Uint8Array.from(atob(signature),c=>c.charCodeAt(0));const algorithm=options.algorithm||"RSASSA-PKCS1-v1_5";let publicKey;try{const pemHeader="-----BEGIN PUBLIC KEY-----";const pemFooter="-----END PUBLIC KEY-----";let pemKey=options.publicKey;if(!pemKey.includes(pemHeader)){pemKey=`${pemHeader}
37
- ${pemKey}
38
- ${pemFooter}`;}const pemContents=pemKey.replace(pemHeader,"").replace(pemFooter,"").replace(/\s/g,"");const binaryDer=Uint8Array.from(atob(pemContents),c=>c.charCodeAt(0));publicKey=await window.crypto.subtle.importKey("spki",binaryDer.buffer,{name:algorithm,hash:"SHA-256"},false,["verify"]);}catch(importError){throw new SecurityError("公钥导入失败",importError instanceof Error?importError:undefined)}const isValid=await window.crypto.subtle.verify({name:algorithm},publicKey,signatureBuffer,data);return isValid}catch(error){if(error instanceof SecurityError){throw error}throw new SecurityError("签名验证失败",error instanceof Error?error:undefined)}}static verifyOrigin(options){if(!options.allowedOrigins||options.allowedOrigins.length===0){return true}if(typeof window==="undefined"){return true}const currentOrigin=window.location.origin;const referer=document.referrer;if(options.allowedOrigins.includes(currentOrigin)){return true}if(options.verifyReferer&&referer){try{const refererOrigin=new URL(referer).origin;if(options.allowedOrigins.includes(refererOrigin)){return true}}catch{}}return false}static verifyWhitelist(config,options){const errors=[];if(options.allowedKeys&&options.allowedKeys.length>0){const configKeys=Object.keys(config);const invalidKeys=configKeys.filter(key=>!options.allowedKeys.includes(key));if(invalidKeys.length>0){errors.push(`配置包含不允许的键: ${invalidKeys.join(", ")}`);}}if(options.forbiddenKeys&&options.forbiddenKeys.length>0){const configKeys=Object.keys(config);const forbiddenFound=configKeys.filter(key=>options.forbiddenKeys.includes(key));if(forbiddenFound.length>0){errors.push(`配置包含禁止的键: ${forbiddenFound.join(", ")}`);}}if(options.valueSchema){const result=vlianUtils.Validator.validateObject(options.valueSchema,config);if(!result.valid){errors.push(...result.errors);}}return {valid:errors.length===0,errors}}static sanitizeConfig(config){const sanitized={};for(const[key,value]of Object.entries(config)){if(typeof value==="string"){const validation=vlianUtils.SecurityUtils.validateInput(value);if(validation.safe&&validation.sanitized){sanitized[key]=validation.sanitized;}else {console.warn(`配置项 ${key} 包含潜在危险内容,已跳过`);}}else if(value&&typeof value==="object"&&!Array.isArray(value)){sanitized[key]=this.sanitizeConfig(value);}else {sanitized[key]=value;}}return sanitized}static async validateConfigSecurity(config,options){const errors=[];if(options.origin){const originValid=this.verifyOrigin(options.origin);if(!originValid){errors.push("配置来源验证失败");}}if(options.whitelist){const whitelistResult=this.verifyWhitelist(config,options.whitelist);if(!whitelistResult.valid){errors.push(...whitelistResult.errors);}}return {valid:errors.length===0,errors}}}
39
-
40
- function _define_property$e(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class AnalyticsService{startBatchTimer(){if(this.batchTimer){return}this.batchTimer=setInterval(()=>{this.flush();},this.config.batchInterval);}stopBatchTimer(){if(this.batchTimer){clearInterval(this.batchTimer);this.batchTimer=null;}}track(event){if(!this.config.enabled){return}if(Math.random()>this.config.sampleRate){return}const anonymizedEvent={...event,timestamp:Date.now(),properties:this.anonymizeProperties(event.properties)};this.eventQueue.push(anonymizedEvent);if(this.config.onEvent){this.config.onEvent(anonymizedEvent);}if(this.eventQueue.length>=this.config.batchSize){this.flush();}}trackPageView(page,properties){this.track({type:"pageview",name:"page_view",properties:{page,...properties}});}trackClick(element,properties){this.track({type:"click",name:"click",properties:{element,...properties}});}trackCustom(name,properties){this.track({type:"custom",name,properties});}trackError(error,properties){this.track({type:"error",name:"error",properties:{errorName:error.name,errorMessage:error.message,errorStack:error.stack,...properties}});}trackPerformance(metrics,properties){this.track({type:"performance",name:"performance",properties:{...metrics,...properties}});}anonymizeProperties(properties){if(!this.config.anonymize||!properties){return properties}return vlianUtils.SecurityUtils.deepSanitize(properties)}flush(){if(this.eventQueue.length===0){return}const events=[...this.eventQueue];this.eventQueue=[];if(this.config.onBatch){this.config.onBatch(events);}logger.logger.debug(`分析服务批量上报 ${events.length} 个事件`);}enable(){this.config.enabled=true;this.startBatchTimer();}disable(){this.config.enabled=false;this.stopBatchTimer();this.flush();}destroy(){this.stopBatchTimer();this.flush();}constructor(config={}){_define_property$e(this,"config",void 0);_define_property$e(this,"eventQueue",[]);_define_property$e(this,"batchTimer",null);this.config={enabled:config.enabled??true,sampleRate:config.sampleRate??1,anonymize:config.anonymize??true,onEvent:config.onEvent??(()=>{}),onBatch:config.onBatch??(()=>{}),batchSize:config.batchSize??10,batchInterval:config.batchInterval??5e3};if(this.config.enabled){this.startBatchTimer();}}}let defaultAnalyticsService=null;function initAnalytics(config){if(!defaultAnalyticsService){defaultAnalyticsService=new AnalyticsService(config);}return defaultAnalyticsService}function getAnalytics(){if(!defaultAnalyticsService){return initAnalytics()}return defaultAnalyticsService}
41
-
42
- const waitTime=(time=100)=>{return new Promise(resolve=>{setTimeout(()=>{resolve(true);},time);})};
43
-
44
- function _define_property$d(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class StateInstance{get(){if(this.destroyed){throw new Error(`StateInstance ${String(this.id)} has been destroyed`)}return this.value}set(valueOrUpdater){if(this.destroyed){throw new Error(`StateInstance ${String(this.id)} has been destroyed`)}const previousValue=this.value;let newValue;if(typeof valueOrUpdater==="function"){newValue=valueOrUpdater(this.value);}else {newValue=valueOrUpdater;}let processedValue=newValue;for(const middleware of this.middleware){processedValue=middleware(processedValue,previousValue);}if(processedValue===this.value){return}this.value=processedValue;if(this.devMode){console.debug(`[StateInstance] Updated: ${String(this.id)}`,{previous:previousValue,current:this.value});}this.notifySubscribers(this.value,previousValue);}subscribe(subscriber){if(this.destroyed){throw new Error(`StateInstance ${String(this.id)} has been destroyed`)}this.subscribers.add(subscriber);if(this.devMode){console.debug(`[StateInstance] Subscribed: ${String(this.id)}`,{subscriberCount:this.subscribers.size});}return ()=>{this.subscribers.delete(subscriber);if(this.devMode){console.debug(`[StateInstance] Unsubscribed: ${String(this.id)}`,{subscriberCount:this.subscribers.size});}}}getId(){return this.id}getScope(){return this.scope}destroy(){if(this.destroyed){return}this.destroyed=true;this.subscribers.clear();this.value=undefined;if(this.devMode){console.debug(`[StateInstance] Destroyed: ${String(this.id)}`);}}isDestroyed(){return this.destroyed}notifySubscribers(value,previous){const subscribers=Array.from(this.subscribers);for(const subscriber of subscribers){try{subscriber(value,previous);}catch(error){console.error(`[StateInstance] Error in subscriber for ${String(this.id)}:`,error);}}}constructor(initialValue,options={}){_define_property$d(this,"id",void 0);_define_property$d(this,"scope",void 0);_define_property$d(this,"value",void 0);_define_property$d(this,"subscribers",new Set);_define_property$d(this,"destroyed",false);_define_property$d(this,"devMode",void 0);_define_property$d(this,"middleware",void 0);this.value=initialValue;this.id=options.id??Symbol("StateInstance");this.scope=options.scope;this.devMode=options.devMode??false;this.middleware=options.middleware??[];if(this.devMode){console.debug(`[StateInstance] Created: ${String(this.id)}`,{scope:this.scope,initialValue:this.value});}}}
45
-
46
- function _define_property$c(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class StateScopeManager{register(instance,scope){const existingScope=this.instanceToScopeMap.get(instance);if(existingScope){this.unregister(instance);}if(!this.scopeMap.has(scope)){this.scopeMap.set(scope,new Set);}const instances=this.scopeMap.get(scope);instances.add(instance);this.instanceToScopeMap.set(instance,scope);}unregister(instance){const scope=this.instanceToScopeMap.get(instance);if(!scope){return}const instances=this.scopeMap.get(scope);if(instances){instances.delete(instance);if(instances.size===0){this.scopeMap.delete(scope);}}this.instanceToScopeMap.delete(instance);}getInstances(scope){const instances=this.scopeMap.get(scope);return instances?Array.from(instances):[]}getScope(instance){return this.instanceToScopeMap.get(instance)}destroyScope(scope){const instances=this.scopeMap.get(scope);if(!instances){return}for(const instance of instances){instance.destroy();this.instanceToScopeMap.delete(instance);}this.scopeMap.delete(scope);}destroyAll(){for(const instances of this.scopeMap.values()){for(const instance of instances){instance.destroy();}}this.scopeMap.clear();this.instanceToScopeMap.clear();}getAllScopes(){return Array.from(this.scopeMap.keys())}getScopeCount(){return this.scopeMap.size}getInstanceCount(){return this.instanceToScopeMap.size}constructor(){_define_property$c(this,"scopeMap",new Map);_define_property$c(this,"instanceToScopeMap",new Map);}}
47
-
48
- function _define_property$b(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class StateRegistry{register(instance){const id=instance.getId();if(this.instances.has(id)){console.warn(`[StateRegistry] Instance with id ${String(id)} already exists, replacing...`);}this.instances.set(id,instance);const scope=instance.getScope();if(scope){this.scopeManager.register(instance,scope);}}unregister(id){const instance=this.instances.get(id);if(!instance){return}this.scopeManager.unregister(instance);instance.destroy();this.instances.delete(id);}getInstance(id){return this.instances.get(id)}getInstancesByScope(scope){return this.scopeManager.getInstances(scope)}getAllInstances(){return Array.from(this.instances.values())}destroyScope(scope){const instances=this.scopeManager.getInstances(scope);for(const instance of instances){instance.destroy();this.instances.delete(instance.getId());}this.scopeManager.destroyScope(scope);}destroyAll(){for(const instance of this.instances.values()){instance.destroy();}this.instances.clear();this.scopeManager.destroyAll();}size(){return this.instances.size}constructor(){_define_property$b(this,"instances",new Map);_define_property$b(this,"scopeManager",void 0);this.scopeManager=new StateScopeManager;}}
49
-
50
- function _define_property$a(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class DerivedStateInstance{get(){if(this.destroyed){throw new Error(`DerivedStateInstance ${String(this.id)} has been destroyed`)}return this.value}set(_valueOrUpdater){throw new Error("Derived state cannot be set directly. Modify the dependency states instead.")}subscribe(subscriber){if(this.destroyed){throw new Error(`DerivedStateInstance ${String(this.id)} has been destroyed`)}this.subscribers.add(subscriber);return ()=>{this.subscribers.delete(subscriber);}}getId(){return this.id}getScope(){return this.scope}getDependencies(){return this.config.dependencies}recompute(){if(this.destroyed||this.recomputing){return}this.recomputing=true;try{const dependencyValues=this.config.dependencies.map(dep=>dep.get());const newValue=this.config.derive(dependencyValues);const hasChanged=this.config.equalityCheck?!this.config.equalityCheck(this.value,newValue):this.value!==newValue;if(hasChanged){const previousValue=this.value;this.value=newValue;this.notifySubscribers(this.value,previousValue);}}catch(error){console.error(`[DerivedStateInstance] Error recomputing ${String(this.id)}:`,error);}finally{this.recomputing=false;}}destroy(){if(this.destroyed){return}this.destroyed=true;for(const unsubscribe of this.dependencyUnsubscribes){unsubscribe();}this.dependencyUnsubscribes.length=0;this.subscribers.clear();}isDestroyed(){return this.destroyed}setupDependencies(){for(const dependency of this.config.dependencies){const unsubscribe=dependency.subscribe(()=>{this.recompute();});this.dependencyUnsubscribes.push(unsubscribe);}}notifySubscribers(value,previous){const subscribers=Array.from(this.subscribers);for(const subscriber of subscribers){try{subscriber(value,previous);}catch(error){console.error(`[DerivedStateInstance] Error in subscriber for ${String(this.id)}:`,error);}}}constructor(config,options={}){_define_property$a(this,"id",void 0);_define_property$a(this,"scope",void 0);_define_property$a(this,"config",void 0);_define_property$a(this,"value",void 0);_define_property$a(this,"subscribers",new Set);_define_property$a(this,"dependencyUnsubscribes",[]);_define_property$a(this,"destroyed",false);_define_property$a(this,"recomputing",false);this.config=config;this.id=options.id??Symbol("DerivedStateInstance");this.scope=options.scope;this.setupDependencies();this.recompute();}}
51
-
52
- function _define_property$9(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class DefaultAdapter{createInstance(initialValue,options){if(this.destroyed){throw new Error("Adapter has been destroyed")}const instance=new StateInstance(initialValue,{id:options?.id,scope:options?.scope,devMode:options?.devMode,middleware:options?.middleware});this.instances.add(instance);return instance}destroy(){if(this.destroyed){return}for(const instance of this.instances){instance.destroy();}this.instances.clear();this.destroyed=true;}getName(){return this.name}constructor(){_define_property$9(this,"name","DefaultAdapter");_define_property$9(this,"destroyed",false);_define_property$9(this,"instances",new Set);}}
53
-
54
- function _define_property$8(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class AdapterFactory{static getDefaultAdapter(){if(!this.defaultAdapter){this.defaultAdapter=new DefaultAdapter;}return this.defaultAdapter}static createAdapter(adapterName){if(!adapterName){return this.getDefaultAdapter()}const factory=this.customAdapters.get(adapterName);if(!factory){throw new Error(`Adapter "${adapterName}" not found. Available adapters: ${Array.from(this.customAdapters.keys()).join(", ")}`)}return factory()}static registerAdapter(name,factory){if(this.customAdapters.has(name)){console.warn(`[AdapterFactory] Adapter "${name}" already registered, replacing...`);}this.customAdapters.set(name,factory);}static unregisterAdapter(name){this.customAdapters.delete(name);}static getRegisteredAdapters(){return Array.from(this.customAdapters.keys())}static reset(){if(this.defaultAdapter){this.defaultAdapter.destroy();this.defaultAdapter=null;}this.customAdapters.clear();}}_define_property$8(AdapterFactory,"defaultAdapter",null);_define_property$8(AdapterFactory,"customAdapters",new Map);
55
-
56
- function _define_property$7(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}let ReduxStateInstance=class ReduxStateInstance{get(){if(this.destroyed){throw new Error(`ReduxStateInstance ${String(this.id)} has been destroyed`)}const state=this.store.getState();return state[this.sliceName]??this.previousValue}set(valueOrUpdater){if(this.destroyed){throw new Error(`ReduxStateInstance ${String(this.id)} has been destroyed`)}const currentValue=this.get();let newValue;if(typeof valueOrUpdater==="function"){newValue=valueOrUpdater(currentValue);}else {newValue=valueOrUpdater;}let processedValue=newValue;for(const middleware of this.middleware){processedValue=middleware(processedValue,currentValue);}if(processedValue===currentValue){return}this.previousValue=currentValue;const action=this.actions.setValue(processedValue);this.store.dispatch(action);if(this.devMode){console.debug(`[ReduxStateInstance] Updated: ${String(this.id)}`,{previous:currentValue,current:processedValue,action});}}subscribe(subscriber){if(this.destroyed){throw new Error(`ReduxStateInstance ${String(this.id)} has been destroyed`)}this.subscribers.add(subscriber);if(this.devMode){console.debug(`[ReduxStateInstance] Subscribed: ${String(this.id)}`,{subscriberCount:this.subscribers.size});}return ()=>{this.subscribers.delete(subscriber);if(this.devMode){console.debug(`[ReduxStateInstance] Unsubscribed: ${String(this.id)}`,{subscriberCount:this.subscribers.size});}}}getId(){return this.id}getScope(){return this.scope}destroy(){if(this.destroyed){return}this.destroyed=true;if(this.unsubscribeStore){this.unsubscribeStore();this.unsubscribeStore=undefined;}this.subscribers.clear();if(this.devMode){console.debug(`[ReduxStateInstance] Destroyed: ${String(this.id)}`);}}isDestroyed(){return this.destroyed}notifySubscribers(){if(this.destroyed){return}try{const currentValue=this.get();if(currentValue===this.previousValue){return}const previousValue=this.previousValue;this.previousValue=currentValue;const subscribers=Array.from(this.subscribers);for(const subscriber of subscribers){try{subscriber(currentValue,previousValue);}catch(error){console.error(`[ReduxStateInstance] Error in subscriber for ${String(this.id)}:`,error);}}}catch(error){console.error(`[ReduxStateInstance] Error getting state for ${String(this.id)}:`,error);}}constructor(store,sliceName,actions,initialValue,options={}){_define_property$7(this,"id",void 0);_define_property$7(this,"scope",void 0);_define_property$7(this,"store",void 0);_define_property$7(this,"sliceName",void 0);_define_property$7(this,"actions",void 0);_define_property$7(this,"subscribers",new Set);_define_property$7(this,"unsubscribeStore",void 0);_define_property$7(this,"destroyed",false);_define_property$7(this,"devMode",void 0);_define_property$7(this,"middleware",void 0);_define_property$7(this,"previousValue",void 0);this.store=store;this.sliceName=sliceName;this.actions=actions;this.id=options.id??Symbol("ReduxStateInstance");this.scope=options.scope;this.devMode=options.devMode??false;this.middleware=options.middleware??[];this.previousValue=initialValue;this.unsubscribeStore=this.store.subscribe(()=>{this.notifySubscribers();});if(this.devMode){console.debug(`[ReduxStateInstance] Created: ${String(this.id)}`,{scope:this.scope,sliceName:this.sliceName,initialValue});}}};let DynamicReducerManager=class DynamicReducerManager{addReducer(key,reducer){this.reducers.set(key,reducer);}removeReducer(key){this.reducers.delete(key);}getRootReducer(){return this.rootReducer}hasReducer(key){return this.reducers.has(key)}constructor(){_define_property$7(this,"reducers",new Map);_define_property$7(this,"rootReducer",void 0);this.rootReducer=(state,action)=>{const stateRecord=state??{};const newState={...stateRecord};for(const[key,reducer]of this.reducers.entries()){newState[key]=reducer(stateRecord[key],action);}return newState};}};class ReduxAdapter{checkReduxAvailable(){}getOrCreateStore(){if(this.store){return this.store}try{const{configureStore}=require("@reduxjs/toolkit");this.store=configureStore({reducer:this.reducerManager.getRootReducer(),devTools:this.devMode,middleware:undefined});if(this.devMode){console.debug("[ReduxAdapter] Redux store created");}return this.store}catch(error){throw new Error("ReduxAdapter requires @reduxjs/toolkit to be installed. "+"Please install it: npm install @reduxjs/toolkit\n"+`Original error: ${error instanceof Error?error.message:String(error)}`)}}createSlice(sliceName,initialValue){try{const{createSlice}=require("@reduxjs/toolkit");const slice=createSlice({name:sliceName,initialState:initialValue,reducers:{setValue:(_state,action)=>{return action.payload??initialValue}}});return slice}catch(error){throw new Error("ReduxAdapter requires @reduxjs/toolkit to be installed. "+"Please install it: npm install @reduxjs/toolkit\n"+`Original error: ${error instanceof Error?error.message:String(error)}`)}}createInstance(initialValue,options){if(this.destroyed){throw new Error("ReduxAdapter has been destroyed")}const store=this.getOrCreateStore();const sliceName=options?.id?`secra_${String(options.id)}`:`secra_slice_${++this.sliceCounter}`;const slice=this.createSlice(sliceName,initialValue);if(!this.reducerManager.hasReducer(sliceName)){this.reducerManager.addReducer(sliceName,slice.reducer);store.replaceReducer(this.reducerManager.getRootReducer());}const instance=new ReduxStateInstance(store,sliceName,slice.actions,initialValue,{id:options?.id,scope:options?.scope,devMode:options?.devMode??this.devMode,middleware:options?.middleware});this.instances.add(instance);this.sliceToInstance.set(sliceName,instance);if(this.devMode){console.debug(`[ReduxAdapter] Created instance: ${String(instance.getId())}`,{sliceName,scope:options?.scope});}return instance}destroy(){if(this.destroyed){return}for(const instance of this.instances){instance.destroy();}for(const sliceName of this.sliceToInstance.keys()){this.reducerManager.removeReducer(sliceName);}if(this.store){this.store.replaceReducer(this.reducerManager.getRootReducer());}this.instances.clear();this.sliceToInstance.clear();this.store=null;this.destroyed=true;if(this.devMode){console.debug("[ReduxAdapter] Destroyed");}}getName(){return this.name}constructor(options){_define_property$7(this,"name","ReduxAdapter");_define_property$7(this,"destroyed",false);_define_property$7(this,"instances",new Set);_define_property$7(this,"store",null);_define_property$7(this,"sliceCounter",0);_define_property$7(this,"sliceToInstance",new Map);_define_property$7(this,"reducerManager",void 0);_define_property$7(this,"devMode",void 0);this.devMode=options?.devMode??false;this.reducerManager=new DynamicReducerManager;this.store=options?.store??null;this.checkReduxAvailable();}}
57
-
58
- function _define_property$6(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class ZustandAdapter{createInstance(_initialValue,_options){if(this.destroyed){throw new Error("Adapter has been destroyed")}throw new Error("ZustandAdapter is a placeholder implementation. "+"To use Zustand, you need to:\n"+"1. Install zustand\n"+"2. Implement a complete Zustand store integration\n"+"3. Map Zustand store methods to IStateInstance interface\n"+"See docs/state-manager.md for implementation guide.")}destroy(){if(this.destroyed){return}for(const instance of this.instances){instance.destroy();}this.instances.clear();this.destroyed=true;}getName(){return this.name}constructor(){_define_property$6(this,"name","ZustandAdapter");_define_property$6(this,"destroyed",false);_define_property$6(this,"instances",new Set);}}
59
-
60
- function _define_property$5(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class StateManager{createState(initialValue,options){if(this.destroyed){throw new Error("StateManager has been destroyed")}const mergedOptions={...options,scope:options?.scope??this.defaultScope,devMode:options?.devMode??this.devMode};const instance=this.adapter.createInstance(initialValue,mergedOptions);if(this.registry){this.registry.register(instance);}return instance}createDerivedState(config,options){if(this.destroyed){throw new Error("StateManager has been destroyed")}const mergedOptions={...options,scope:options?.scope??this.defaultScope};const instance=new DerivedStateInstance(config,mergedOptions);if(this.registry){this.registry.register(instance);}return instance}getState(id){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getInstance(id)}getStatesByScope(scope){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getInstancesByScope(scope)}getAllStates(){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getAllInstances()}destroyScope(scope){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}this.registry.destroyScope(scope);}destroy(){if(this.destroyed){return}this.destroyed=true;if(this.registry){this.registry.destroyAll();}this.adapter.destroy();if(this.devMode){console.debug("[StateManager] Destroyed");}}isDestroyed(){return this.destroyed}getAdapter(){return this.adapter}getRegistry(){return this.registry}constructor(options={}){_define_property$5(this,"adapter",void 0);_define_property$5(this,"registry",void 0);_define_property$5(this,"defaultScope",void 0);_define_property$5(this,"devMode",void 0);_define_property$5(this,"destroyed",false);this.adapter=options.defaultAdapter??AdapterFactory.getDefaultAdapter();this.defaultScope=options.defaultScope;this.devMode=options.devMode??false;this.registry=options.enableRegistry!==false?new StateRegistry:null;if(this.devMode){console.debug("[StateManager] Initialized",{adapter:this.adapter.getName(),registryEnabled:!!this.registry,defaultScope:this.defaultScope});}}}
61
-
62
- const DEFAULT_INSTANCE_ID="default";const DEFAULT_THEME={mode:"light"};const DEFAULT_I18N={locale:"zh-CN"};const DEFAULT_CONFIG={logger:{level:logger.LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},theme:{initial:DEFAULT_THEME,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:theme"}},i18n:{initial:DEFAULT_I18N,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:i18n"}}};
13
+ const DEFAULT_INSTANCE_ID="default";const DEFAULT_CONFIG={logger:{level:logger.LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},managerConfigs:{}};
63
14
 
64
15
  function normalizeLogLevel(value,fallback){if(typeof value==="number"&&Number.isInteger(value)){switch(value){case logger.LogLevel.DEBUG:case logger.LogLevel.INFO:case logger.LogLevel.WARN:case logger.LogLevel.ERROR:case logger.LogLevel.NONE:return value;default:return fallback}}if(typeof value!=="string"){return fallback}const normalized=value.trim();if(!normalized){return fallback}if(/^\d+$/.test(normalized)){return normalizeLogLevel(Number(normalized),fallback)}switch(normalized.toUpperCase()){case "DEBUG":return logger.LogLevel.DEBUG;case "INFO":return logger.LogLevel.INFO;case "WARN":return logger.LogLevel.WARN;case "ERROR":return logger.LogLevel.ERROR;case "NONE":return logger.LogLevel.NONE;default:return fallback}}function normalizeLoggerSnapshot(value,fallback){if(typeof value==="number"||typeof value==="string"){return {level:normalizeLogLevel(value,fallback.level)}}const source=value&&typeof value==="object"?value:{};return {level:normalizeLogLevel(source.level,fallback.level)}}function isLoggerEqual(left,right){return left.level===right.level}
65
16
 
66
- const DEFAULT_LOGGER_CACHE_KEY="vlian:kernel:logger-level";function resolvePersistenceContext$2(persistence){if(persistence?.enabled!==true){return null}return {key:persistence.key||DEFAULT_LOGGER_CACHE_KEY}}async function loadLoggerFromCache(cacheManager,persistence,fallback){const persistenceContext=resolvePersistenceContext$2(persistence);if(!persistenceContext){return {...fallback}}try{const cached=await cacheManager.get(persistenceContext.key,{defaultValue:fallback});return normalizeLoggerSnapshot(cached,fallback)}catch{return {...fallback}}}async function saveLoggerToCache(cacheManager,persistence,snapshot){const persistenceContext=resolvePersistenceContext$2(persistence);if(!persistenceContext){return}try{await cacheManager.set(persistenceContext.key,{...snapshot});}catch{}}
67
-
68
- function _define_property$4(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class LoggerManager{async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:logger.LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.logger.setLevel(this.snapshot.level);this.initialized=true;}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}debug(...args){logger.logger.debug(...args);}info(...args){logger.logger.info(...args);}warn(...args){logger.logger.warn(...args);}error(...args){logger.logger.error(...args);}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot);}this.emit(this.snapshot,prevSnapshot);}getSnapshot(){return {...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev});}catch{}}}constructor(){_define_property$4(this,"snapshot",{level:logger.LogLevel.INFO});_define_property$4(this,"config",DEFAULT_CONFIG.logger);_define_property$4(this,"listeners",new Set);_define_property$4(this,"cacheManager",null);_define_property$4(this,"initialized",false);}}
69
-
70
- function _define_property$3(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class CacheManager{initialize(context){this.snapshot=context.config.cache;this.cacheIn=vlianUtils.createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName});}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}constructor(){_define_property$3(this,"snapshot",DEFAULT_CONFIG.cache);_define_property$3(this,"cacheIn",void 0);}}
71
-
72
- function canUseDom(){return typeof document!=="undefined"}function resolveThemeMode(theme){if(theme.mode!=="system"){return theme.mode}if(typeof window!=="undefined"&&window.matchMedia("(prefers-color-scheme: dark)").matches){return "dark"}return "light"}function applyThemeToDocument(nextTheme,prevTheme){if(!canUseDom()){return}const root=document.documentElement;const nextMode=resolveThemeMode(nextTheme);const prevMode=prevTheme?resolveThemeMode(prevTheme):undefined;if(!prevMode||prevMode!==nextMode){root.classList.remove("light","dark");root.classList.add(nextMode);}if(!prevTheme||prevTheme.primaryColor!==nextTheme.primaryColor){if(nextTheme.primaryColor){root.style.setProperty("--app-primary-color",nextTheme.primaryColor);}else {root.style.removeProperty("--app-primary-color");}}const prevTokens=prevTheme?.tokens||{};const nextTokens=nextTheme.tokens||{};for(const token of Object.keys(prevTokens)){if(!(token in nextTokens)){root.style.removeProperty(`--${token}`);}}for(const[token,value]of Object.entries(nextTokens)){if(!prevTheme||prevTokens[token]!==value){root.style.setProperty(`--${token}`,String(value));}}}
73
-
74
- const VALID_THEME_MODES=new Set(["light","dark","system"]);const TOKEN_NAME_PATTERN=/^[A-Za-z_][A-Za-z0-9_-]*$/;function isPlainObject$1(value){return Object.prototype.toString.call(value)==="[object Object]"}function hasOwnProperty(value,key){return Object.prototype.hasOwnProperty.call(value,key)}function cloneTheme(theme){return {...theme,...theme.tokens?{tokens:{...theme.tokens}}:{}}}function sanitizeTokens(tokens){if(!isPlainObject$1(tokens)){return undefined}const sanitizedTokens={};for(const[token,tokenValue]of Object.entries(tokens)){if(!TOKEN_NAME_PATTERN.test(token)){continue}if(typeof tokenValue==="string"||typeof tokenValue==="number"){sanitizedTokens[token]=tokenValue;}}return Object.keys(sanitizedTokens).length>0?sanitizedTokens:undefined}function normalizeTheme(value,fallback){const source=isPlainObject$1(value)?value:{};const mode=VALID_THEME_MODES.has(source.mode)?source.mode:fallback.mode;const primaryColor=typeof source.primaryColor==="string"&&source.primaryColor.trim()?source.primaryColor:fallback.primaryColor;const fallbackTokens=sanitizeTokens(fallback.tokens);const incomingTokens=sanitizeTokens(source.tokens);return {mode,...primaryColor?{primaryColor}:{},...incomingTokens||fallbackTokens?{tokens:{...fallbackTokens||{},...incomingTokens||{}}}:{}}}function mergeTheme(current,next){const mergedTheme={mode:hasOwnProperty(next,"mode")&&VALID_THEME_MODES.has(next.mode)?next.mode:current.mode,...hasOwnProperty(next,"primaryColor")?typeof next.primaryColor==="string"&&next.primaryColor.trim()?{primaryColor:next.primaryColor}:{}:current.primaryColor?{primaryColor:current.primaryColor}:{},...hasOwnProperty(next,"tokens")?sanitizeTokens(next.tokens)?{tokens:sanitizeTokens(next.tokens)}:{}:current.tokens?{tokens:{...current.tokens}}:{}};return normalizeTheme(mergedTheme,DEFAULT_EMPTY_THEME)}const DEFAULT_EMPTY_THEME={mode:"light"};function isThemeEqual(left,right){if(left.mode!==right.mode||left.primaryColor!==right.primaryColor){return false}const leftTokens=left.tokens||{};const rightTokens=right.tokens||{};const leftKeys=Object.keys(leftTokens);const rightKeys=Object.keys(rightTokens);if(leftKeys.length!==rightKeys.length){return false}for(const key of leftKeys){if(leftTokens[key]!==rightTokens[key]){return false}}return true}
75
-
76
- const DEFAULT_THEME_CACHE_KEY="vlian:kernel:theme";function resolvePersistenceContext$1(persistence){if(persistence?.enabled!==true){return null}return {key:persistence.key||DEFAULT_THEME_CACHE_KEY}}async function loadThemeFromCache(cacheManager,persistence,fallback){const persistenceContext=resolvePersistenceContext$1(persistence);const safeFallback=cloneTheme(fallback);if(!persistenceContext){return safeFallback}try{const cached=await cacheManager.get(persistenceContext.key,{defaultValue:safeFallback});return normalizeTheme(cached,safeFallback)}catch{return safeFallback}}async function saveThemeToCache(cacheManager,persistence,theme){const persistenceContext=resolvePersistenceContext$1(persistence);if(!persistenceContext){return}try{await cacheManager.set(persistenceContext.key,cloneTheme(theme));}catch{}}
77
-
78
- function _define_property$2(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class ThemeManager{async initialize(context){this.config=context.config.theme;this.cacheManager=context.cacheManager;const initialTheme=normalizeTheme(this.config.initial||{},DEFAULT_THEME);this.theme=await loadThemeFromCache(this.cacheManager,this.config.persistence,initialTheme);applyThemeToDocument(this.theme);this.initialized=true;}getTheme(){return cloneTheme(this.theme)}getSnapshot(){return this.getTheme()}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}async setTheme(nextTheme){this.ensureInitialized();const prevTheme=this.theme;const mergedTheme=mergeTheme(prevTheme,nextTheme);if(isThemeEqual(prevTheme,mergedTheme)){return}this.theme=mergedTheme;applyThemeToDocument(this.theme,prevTheme);if(this.cacheManager){await saveThemeToCache(this.cacheManager,this.config.persistence,this.theme);}this.emit(this.theme,prevTheme);}ensureInitialized(){if(!this.initialized){throw new Error("ThemeManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener(cloneTheme(next),cloneTheme(prev));}catch{}}}constructor(){_define_property$2(this,"theme",cloneTheme(DEFAULT_THEME));_define_property$2(this,"config",DEFAULT_CONFIG.theme);_define_property$2(this,"listeners",new Set);_define_property$2(this,"cacheManager",null);_define_property$2(this,"initialized",false);}}
79
-
80
- function isPlainObject(value){return Object.prototype.toString.call(value)==="[object Object]"}function cloneI18nSnapshot(snapshot){const resources=snapshot.resources?Object.fromEntries(Object.entries(snapshot.resources).map(([locale,value])=>[locale,{...value}])):undefined;return {locale:snapshot.locale,...resources?{resources}:{}}}function normalizeI18nSnapshot(value,fallback){const source=isPlainObject(value)?value:{};const locale=typeof source.locale==="string"&&source.locale.trim()?source.locale:fallback.locale;const fallbackResources=fallback.resources;const incomingResources=isPlainObject(source.resources)?Object.fromEntries(Object.entries(source.resources).filter(([,resourceValue])=>isPlainObject(resourceValue)).map(([locale,resourceValue])=>[locale,{...resourceValue}])):undefined;const resources=incomingResources||fallbackResources?{...fallbackResources||{},...incomingResources||{}}:undefined;return {locale,...resources?{resources}:{}}}function mergeI18nSnapshot(current,next){return normalizeI18nSnapshot({locale:next.locale??current.locale,resources:next.resources??current.resources},current)}function isI18nEqual(left,right){if(left.locale!==right.locale){return false}const leftResources=left.resources||{};const rightResources=right.resources||{};const leftLocales=Object.keys(leftResources);const rightLocales=Object.keys(rightResources);if(leftLocales.length!==rightLocales.length){return false}for(const locale of leftLocales){if(leftResources[locale]!==rightResources[locale]){return false}}return true}
17
+ const DEFAULT_LOGGER_CACHE_KEY="vlian:kernel:logger-level";function resolvePersistenceContext(persistence){if(persistence?.enabled!==true){return null}return {key:persistence.key||DEFAULT_LOGGER_CACHE_KEY}}async function loadLoggerFromCache(cacheManager,persistence,fallback){const persistenceContext=resolvePersistenceContext(persistence);if(!persistenceContext){return {...fallback}}try{const cached=await cacheManager.get(persistenceContext.key,{defaultValue:fallback});return normalizeLoggerSnapshot(cached,fallback)}catch{return {...fallback}}}async function saveLoggerToCache(cacheManager,persistence,snapshot){const persistenceContext=resolvePersistenceContext(persistence);if(!persistenceContext){return}try{await cacheManager.set(persistenceContext.key,{...snapshot});}catch{}}
81
18
 
82
- const DEFAULT_I18N_CACHE_KEY="vlian:kernel:i18n";function resolvePersistenceContext(persistence){if(persistence?.enabled!==true){return null}return {key:persistence.key||DEFAULT_I18N_CACHE_KEY}}async function loadI18nFromCache(cacheManager,persistence,fallback){const persistenceContext=resolvePersistenceContext(persistence);const safeFallback=cloneI18nSnapshot(fallback);if(!persistenceContext){return safeFallback}try{const cached=await cacheManager.get(persistenceContext.key,{defaultValue:safeFallback});return normalizeI18nSnapshot(cached,safeFallback)}catch{return safeFallback}}async function saveI18nToCache(cacheManager,persistence,snapshot){const persistenceContext=resolvePersistenceContext(persistence);if(!persistenceContext){return}try{const persistedSnapshot={locale:cloneI18nSnapshot(snapshot).locale};await cacheManager.set(persistenceContext.key,persistedSnapshot);}catch{}}
19
+ function _define_property$2(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class LoggerManager{async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:logger.LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.logger.setLevel(this.snapshot.level);this.initialized=true;}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}debug(...args){logger.logger.debug(...args);}info(...args){logger.logger.info(...args);}warn(...args){logger.logger.warn(...args);}error(...args){logger.logger.error(...args);}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot);}this.emit(this.snapshot,prevSnapshot);}getSnapshot(){return {...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev});}catch{}}}constructor(){_define_property$2(this,"snapshot",{level:logger.LogLevel.INFO});_define_property$2(this,"config",DEFAULT_CONFIG.logger);_define_property$2(this,"listeners",new Set);_define_property$2(this,"cacheManager",null);_define_property$2(this,"initialized",false);}}
83
20
 
84
- function _define_property$1(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class I18nManager{async initialize(context){this.config=context.config.i18n;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeI18nSnapshot(this.config.initial||{},DEFAULT_I18N);this.snapshot=await loadI18nFromCache(this.cacheManager,this.config.persistence,initialSnapshot);await setupI18n({interpolation:{escapeValue:false},lng:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});await setLang(this.snapshot.locale);this.initialized=true;}getSnapshot(){return cloneI18nSnapshot(this.snapshot)}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}async setLocale(locale){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=mergeI18nSnapshot(prevSnapshot,{locale});if(isI18nEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await setLang(this.snapshot.locale);if(this.cacheManager){await saveI18nToCache(this.cacheManager,this.config.persistence,this.snapshot);}this.emit(this.snapshot,prevSnapshot);}ensureInitialized(){if(!this.initialized){throw new Error("I18nManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener(cloneI18nSnapshot(next),cloneI18nSnapshot(prev));}catch{}}}constructor(){_define_property$1(this,"snapshot",cloneI18nSnapshot(DEFAULT_I18N));_define_property$1(this,"config",DEFAULT_CONFIG.i18n);_define_property$1(this,"listeners",new Set);_define_property$1(this,"cacheManager",null);_define_property$1(this,"initialized",false);}}
21
+ function _define_property$1(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class CacheManager{initialize(context){this.snapshot=context.config.cache;this.cacheIn=utils.createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName});}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}constructor(){_define_property$1(this,"snapshot",DEFAULT_CONFIG.cache);_define_property$1(this,"cacheIn",void 0);}}
85
22
 
86
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}function now(){return typeof performance!=="undefined"?performance.now():Date.now()}function isRecord(value){return typeof value==="object"&&value!==null}class Kernel{static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return [...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getThemeManager(){return this.themeManager}getI18nManager(){return this.i18nManager}getManager(name){return this.managers.get(name)}registerManager(name,manager){if(this.managers.has(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager);}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null;});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId});});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options);});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,manager])=>{if(!this.managers.has(name)){this.managers.set(name,manager);}});}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await Promise.all([this.initializeManager("logger"),this.initializeManager("theme"),this.initializeManager("i18n")]);});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.managers.keys()].filter(name=>name!=="logger"&&name!=="cache"&&name!=="theme"&&name!=="i18n");for(const name of customManagerNames){await this.initializeManager(name);}});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.();});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config});}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{};}const loadedThemeInitial=loaded.theme?.initial||{};const loadedI18nInitial=loaded.i18n?.initial||{};const optionTheme=options.theme||{};const optionLocale=options.locale;return {logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},theme:{...DEFAULT_CONFIG.theme,...loaded.theme,...options.config?.theme||{},initial:{...DEFAULT_THEME,...loadedThemeInitial,...options.config?.theme?.initial||{},...isRecord(optionTheme)?optionTheme:{}}},i18n:{...DEFAULT_CONFIG.i18n,...loaded.i18n,...options.config?.i18n||{},initial:{...DEFAULT_I18N,...loadedI18nInitial,...options.config?.i18n?.initial||{},resources:isRecord(optionLocale)?optionLocale:loadedI18nInitial.resources??options.config?.i18n?.initial?.resources}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}const manager=this.managers.get(name);if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId});})();this.managerInitPromises.set(name,initPromise);try{await initPromise;}finally{this.managerInitPromises.delete(name);}}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric);}logDebug(message,payload){this.loggerManager.debug(message,payload);}constructor(instanceId){_define_property(this,"instanceId",void 0);_define_property(this,"metrics",[]);_define_property(this,"managers",new Map);_define_property(this,"managerInitPromises",new Map);_define_property(this,"initializedManagers",new Set);_define_property(this,"loggerManager",new LoggerManager);_define_property(this,"cacheManager",new CacheManager);_define_property(this,"themeManager",new ThemeManager);_define_property(this,"i18nManager",new I18nManager);_define_property(this,"config",DEFAULT_CONFIG);_define_property(this,"startupPromise",null);_define_property(this,"started",false);this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager);this.managers.set("theme",this.themeManager);this.managers.set("i18n",this.i18nManager);}}_define_property(Kernel,"instances",new Map);async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
23
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}function now(){return typeof performance!=="undefined"?performance.now():Date.now()}class Kernel{static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return [...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}registerManager(name,manager){if(this.managers.has(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager);}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}};}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null;});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId});});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options);});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,manager])=>{if(!this.managers.has(name)){this.managers.set(name,manager);}});}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger");});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.managers.keys()].filter(name=>name!=="logger"&&name!=="cache");for(const name of customManagerNames){await this.initializeManager(name);}});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.();});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config});}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{};}return {logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{...DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}const manager=this.managers.get(name);if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache");}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId});})();this.managerInitPromises.set(name,initPromise);try{await initPromise;}finally{this.managerInitPromises.delete(name);}}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric);}logDebug(message,payload){this.loggerManager.debug(message,payload);}constructor(instanceId){_define_property(this,"instanceId",void 0);_define_property(this,"metrics",[]);_define_property(this,"managers",new Map);_define_property(this,"managerInitPromises",new Map);_define_property(this,"initializedManagers",new Set);_define_property(this,"loggerManager",new LoggerManager);_define_property(this,"cacheManager",new CacheManager);_define_property(this,"config",DEFAULT_CONFIG);_define_property(this,"startupPromise",null);_define_property(this,"started",false);this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager);}}_define_property(Kernel,"instances",new Map);async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
87
24
 
88
- Object.defineProperty(exports, "PERFORMANCE_METRIC_UNITS", {
89
- enumerable: true,
90
- get: function () { return vlianUtils.PERFORMANCE_METRIC_UNITS; }
91
- });
92
- Object.defineProperty(exports, "PerformanceMonitor", {
93
- enumerable: true,
94
- get: function () { return vlianUtils.PerformanceMonitor; }
95
- });
96
- Object.defineProperty(exports, "ResourceLoader", {
97
- enumerable: true,
98
- get: function () { return vlianUtils.ResourceLoader; }
99
- });
100
- Object.defineProperty(exports, "RuntimeSecurity", {
101
- enumerable: true,
102
- get: function () { return vlianUtils.RuntimeSecurity; }
103
- });
104
- Object.defineProperty(exports, "SENSITIVE_FIELDS", {
105
- enumerable: true,
106
- get: function () { return vlianUtils.SENSITIVE_FIELDS; }
107
- });
108
- Object.defineProperty(exports, "SecurityUtils", {
109
- enumerable: true,
110
- get: function () { return vlianUtils.SecurityUtils; }
111
- });
112
- Object.defineProperty(exports, "Validator", {
113
- enumerable: true,
114
- get: function () { return vlianUtils.Validator; }
115
- });
116
- Object.defineProperty(exports, "commonSchemas", {
117
- enumerable: true,
118
- get: function () { return vlianUtils.commonSchemas; }
119
- });
120
- Object.defineProperty(exports, "convertMetricsToWithUnits", {
121
- enumerable: true,
122
- get: function () { return vlianUtils.convertMetricsToWithUnits; }
123
- });
124
- Object.defineProperty(exports, "resourceLoader", {
125
- enumerable: true,
126
- get: function () { return vlianUtils.resourceLoader; }
127
- });
128
- Object.defineProperty(exports, "LogFormat", {
129
- enumerable: true,
130
- get: function () { return logger.LogFormat; }
131
- });
132
- Object.defineProperty(exports, "LogLevel", {
133
- enumerable: true,
134
- get: function () { return logger.LogLevel; }
135
- });
136
- Object.defineProperty(exports, "Logger", {
137
- enumerable: true,
138
- get: function () { return logger.Logger; }
139
- });
140
- Object.defineProperty(exports, "TraceIdGenerator", {
141
- enumerable: true,
142
- get: function () { return logger.TraceIdGenerator; }
143
- });
144
- Object.defineProperty(exports, "clearCurrentTraceId", {
145
- enumerable: true,
146
- get: function () { return logger.clearCurrentTraceId; }
147
- });
148
- Object.defineProperty(exports, "createLogger", {
149
- enumerable: true,
150
- get: function () { return logger.createLogger; }
151
- });
152
- Object.defineProperty(exports, "generateTraceId", {
153
- enumerable: true,
154
- get: function () { return logger.generateTraceId; }
155
- });
156
- Object.defineProperty(exports, "getCurrentTraceId", {
157
- enumerable: true,
158
- get: function () { return logger.getCurrentTraceId; }
159
- });
160
- Object.defineProperty(exports, "getTraceIdGenerator", {
161
- enumerable: true,
162
- get: function () { return logger.getTraceIdGenerator; }
163
- });
164
- Object.defineProperty(exports, "initTraceIdGenerator", {
165
- enumerable: true,
166
- get: function () { return logger.initTraceIdGenerator; }
167
- });
168
- Object.defineProperty(exports, "logger", {
169
- enumerable: true,
170
- get: function () { return logger.logger; }
171
- });
172
- Object.defineProperty(exports, "parseTraceId", {
173
- enumerable: true,
174
- get: function () { return logger.parseTraceId; }
175
- });
176
- Object.defineProperty(exports, "setCurrentTraceId", {
177
- enumerable: true,
178
- get: function () { return logger.setCurrentTraceId; }
179
- });
180
- Object.defineProperty(exports, "CSRFTokenManager", {
181
- enumerable: true,
182
- get: function () { return csrf.CSRFTokenManager; }
183
- });
184
- Object.defineProperty(exports, "getCSRFManager", {
185
- enumerable: true,
186
- get: function () { return csrf.getCSRFManager; }
187
- });
188
- Object.defineProperty(exports, "initCSRFManager", {
189
- enumerable: true,
190
- get: function () { return csrf.initCSRFManager; }
191
- });
192
- Object.defineProperty(exports, "MonitoringService", {
193
- enumerable: true,
194
- get: function () { return monitoring.MonitoringService; }
195
- });
196
- Object.defineProperty(exports, "getMonitoring", {
197
- enumerable: true,
198
- get: function () { return monitoring.getMonitoring; }
199
- });
200
- Object.defineProperty(exports, "initMonitoring", {
201
- enumerable: true,
202
- get: function () { return monitoring.initMonitoring; }
203
- });
204
- exports.$t = $t;
205
- exports.AdapterFactory = AdapterFactory;
206
- exports.AnalyticsService = AnalyticsService;
207
- exports.ConfigError = ConfigError;
208
- exports.ConfigSecurity = ConfigSecurity;
209
- exports.DefaultAdapter = DefaultAdapter;
210
- exports.DerivedStateInstance = DerivedStateInstance;
211
- exports.ErrorCode = ErrorCode;
212
- exports.ErrorMessages = ErrorMessages;
213
- exports.ErrorSeverity = ErrorSeverity;
214
- exports.ErrorType = ErrorType;
215
- exports.FrameworkError = FrameworkError;
216
- exports.InitializationError = InitializationError;
217
25
  exports.Kernel = Kernel;
218
- exports.NetworkError = NetworkError;
219
- exports.ReduxAdapter = ReduxAdapter;
220
- exports.SecurityError = SecurityError;
221
- exports.StateInstance = StateInstance;
222
- exports.StateManager = StateManager;
223
- exports.StateRegistry = StateRegistry;
224
- exports.StateScopeManager = StateScopeManager;
225
- exports.StorageError = StorageError;
226
- exports.ValidationError = ValidationError;
227
- exports.ZustandAdapter = ZustandAdapter;
228
- exports.errorUtils = errorUtils;
229
- exports.getAnalytics = getAnalytics;
230
- exports.getErrorMessage = getErrorMessage;
231
26
  exports.getKernel = getKernel;
232
- exports.getUserFriendlyMessage = getUserFriendlyMessage;
233
- exports.initAnalytics = initAnalytics;
234
27
  exports.kernelStartApp = kernelStartApp;
235
- exports.setLang = setLang;
236
- exports.setupI18n = setupI18n;
237
28
  exports.startup = startup;
238
- exports.waitTime = waitTime;
239
29
 
240
30
  }));
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_CONFIG(){return DEFAULT_CONFIG},get DEFAULT_I18N(){return DEFAULT_I18N},get DEFAULT_INSTANCE_ID(){return DEFAULT_INSTANCE_ID},get DEFAULT_THEME(){return DEFAULT_THEME}});const _logger=require("@vlian/logger");const DEFAULT_INSTANCE_ID="default";const DEFAULT_THEME={mode:"light"};const DEFAULT_I18N={locale:"zh-CN"};const DEFAULT_CONFIG={logger:{level:_logger.LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},theme:{initial:DEFAULT_THEME,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:theme"}},i18n:{initial:DEFAULT_I18N,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:i18n"}}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_CONFIG(){return DEFAULT_CONFIG},get DEFAULT_INSTANCE_ID(){return DEFAULT_INSTANCE_ID}});const _logger=require("@vlian/logger");const DEFAULT_INSTANCE_ID="default";const DEFAULT_CONFIG={logger:{level:_logger.LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},managerConfigs:{}};
@@ -1,5 +1,3 @@
1
- import type { I18nSnapshot, KernelConfig, ThemeSnapshot } from './types';
1
+ import type { KernelConfig } from './types';
2
2
  export declare const DEFAULT_INSTANCE_ID = "default";
3
- export declare const DEFAULT_THEME: ThemeSnapshot;
4
- export declare const DEFAULT_I18N: I18nSnapshot;
5
3
  export declare const DEFAULT_CONFIG: KernelConfig;
@@ -1 +1 @@
1
- import{LogLevel}from"@vlian/logger";export const DEFAULT_INSTANCE_ID="default";export const DEFAULT_THEME={mode:"light"};export const DEFAULT_I18N={locale:"zh-CN"};export const DEFAULT_CONFIG={logger:{level:LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},theme:{initial:DEFAULT_THEME,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:theme"}},i18n:{initial:DEFAULT_I18N,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:i18n"}}};
1
+ import{LogLevel}from"@vlian/logger";export const DEFAULT_INSTANCE_ID="default";export const DEFAULT_CONFIG={logger:{level:LogLevel.INFO,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:logger-level"}},cache:{enabled:true,storageOptions:{prefix:"vlian",defaultExpire:24*60*60*1e3}},managerConfigs:{}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return I18N_MANAGER_NAME}});const I18N_MANAGER_NAME="i18n";const DEFAULT_I18N={locale:"zh-CN"};const DEFAULT_I18N_MANAGER_CONFIG={initial:DEFAULT_I18N,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:i18n"}};
@@ -0,0 +1,4 @@
1
+ import type { I18nManagerConfig, I18nSnapshot } from './types';
2
+ export declare const I18N_MANAGER_NAME = "i18n";
3
+ export declare const DEFAULT_I18N: I18nSnapshot;
4
+ export declare const DEFAULT_I18N_MANAGER_CONFIG: I18nManagerConfig;
@@ -0,0 +1 @@
1
+ export const I18N_MANAGER_NAME="i18n";export const DEFAULT_I18N={locale:"zh-CN"};export const DEFAULT_I18N_MANAGER_CONFIG={initial:DEFAULT_I18N,persistence:{enabled:true,storage:"localStorage",key:"vlian:kernel:i18n"}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _constants.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _constants.DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _constants.I18N_MANAGER_NAME},get I18nManager(){return _I18nManager.I18nManager},get registerI18nManager(){return registerI18nManager}});const _I18nManager=require("../../manager/i18n/I18nManager");const _constants=require("./constants");async function registerI18nManager(kernel,config=_constants.DEFAULT_I18N_MANAGER_CONFIG){const existing=kernel.getManager(_constants.I18N_MANAGER_NAME);if(existing instanceof _I18nManager.I18nManager){kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return existing}const manager=new _I18nManager.I18nManager;kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);kernel.registerManager(_constants.I18N_MANAGER_NAME,manager);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return manager}