@vlian/framework 1.2.63 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -141
- package/dist/i18n.cjs +1 -0
- package/dist/i18n.d.ts +2 -0
- package/dist/i18n.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -9
- package/dist/index.js +1 -1
- package/dist/index.umd.js +10 -220
- package/dist/kernel/constants.cjs +1 -1
- package/dist/kernel/constants.d.ts +1 -3
- package/dist/kernel/constants.js +1 -1
- package/dist/kernel/custom-manager/i18n/I18nManager.cjs +1 -0
- package/dist/kernel/{manager → custom-manager}/i18n/I18nManager.d.ts +2 -1
- package/dist/kernel/custom-manager/i18n/I18nManager.js +1 -0
- package/dist/kernel/custom-manager/i18n/constants.cjs +1 -0
- package/dist/kernel/custom-manager/i18n/constants.d.ts +4 -0
- package/dist/kernel/custom-manager/i18n/constants.js +1 -0
- package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.d.ts +2 -1
- package/dist/kernel/custom-manager/i18n/i18n.runtime.cjs +1 -0
- package/dist/kernel/custom-manager/i18n/i18n.runtime.d.ts +8 -0
- package/dist/kernel/custom-manager/i18n/i18n.runtime.js +1 -0
- package/dist/kernel/{manager → custom-manager}/i18n/i18n.schema.cjs +1 -1
- package/dist/kernel/{manager → custom-manager}/i18n/i18n.schema.d.ts +1 -1
- package/dist/kernel/custom-manager/i18n/i18n.schema.js +1 -0
- package/dist/kernel/custom-manager/i18n/index.cjs +1 -0
- package/dist/kernel/custom-manager/i18n/index.d.ts +7 -0
- package/dist/kernel/custom-manager/i18n/index.js +1 -0
- package/dist/kernel/custom-manager/i18n/types.d.ts +10 -0
- package/dist/kernel/custom-manager/index.cjs +1 -0
- package/dist/kernel/custom-manager/index.d.ts +4 -0
- package/dist/kernel/custom-manager/index.js +1 -0
- package/dist/kernel/custom-manager/theme/ThemeManager.cjs +1 -0
- package/dist/kernel/{manager → custom-manager}/theme/ThemeManager.d.ts +8 -1
- package/dist/kernel/custom-manager/theme/ThemeManager.js +1 -0
- package/dist/kernel/custom-manager/theme/constants.cjs +1 -0
- package/dist/kernel/custom-manager/theme/constants.d.ts +4 -0
- package/dist/kernel/custom-manager/theme/constants.js +1 -0
- package/dist/kernel/custom-manager/theme/index.cjs +1 -0
- package/dist/kernel/custom-manager/theme/index.d.ts +7 -0
- package/dist/kernel/custom-manager/theme/index.js +1 -0
- package/dist/kernel/custom-manager/theme/theme.dom.cjs +1 -0
- package/dist/kernel/custom-manager/theme/theme.dom.d.ts +10 -0
- package/dist/kernel/custom-manager/theme/theme.dom.js +1 -0
- package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.d.ts +2 -1
- package/dist/kernel/custom-manager/theme/theme.schema.cjs +1 -0
- package/dist/kernel/{manager → custom-manager}/theme/theme.schema.d.ts +3 -1
- package/dist/kernel/custom-manager/theme/theme.schema.js +1 -0
- package/dist/kernel/custom-manager/theme/types.d.ts +14 -0
- package/dist/kernel/index.cjs +1 -1
- package/dist/kernel/index.d.ts +2 -2
- package/dist/kernel/index.js +1 -1
- package/dist/kernel/kernel.cjs +1 -1
- package/dist/kernel/kernel.d.ts +3 -7
- package/dist/kernel/kernel.js +1 -1
- package/dist/kernel/manager/index.cjs +1 -1
- package/dist/kernel/manager/index.d.ts +0 -2
- package/dist/kernel/manager/index.js +1 -1
- package/dist/kernel/types.d.ts +10 -39
- package/dist/theme.cjs +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +1 -0
- package/package.json +28 -129
- package/dist/analytics/index.cjs +0 -1
- package/dist/analytics/index.d.ts +0 -2
- package/dist/analytics/index.js +0 -1
- package/dist/analytics.umd.js +0 -19
- package/dist/components/index.cjs +0 -1
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.js +0 -1
- package/dist/components/persistence.cjs +0 -1
- package/dist/components/persistence.d.ts +0 -12
- package/dist/components/persistence.js +0 -1
- package/dist/kernel/manager/i18n/I18nManager.cjs +0 -1
- package/dist/kernel/manager/i18n/I18nManager.js +0 -1
- package/dist/kernel/manager/i18n/i18n.schema.js +0 -1
- package/dist/kernel/manager/i18n/index.cjs +0 -1
- package/dist/kernel/manager/i18n/index.d.ts +0 -1
- package/dist/kernel/manager/i18n/index.js +0 -1
- package/dist/kernel/manager/i18nManager.cjs +0 -1
- package/dist/kernel/manager/i18nManager.d.ts +0 -1
- package/dist/kernel/manager/i18nManager.js +0 -1
- package/dist/kernel/manager/theme/ThemeManager.cjs +0 -1
- package/dist/kernel/manager/theme/ThemeManager.js +0 -1
- package/dist/kernel/manager/theme/index.cjs +0 -1
- package/dist/kernel/manager/theme/index.d.ts +0 -1
- package/dist/kernel/manager/theme/index.js +0 -1
- package/dist/kernel/manager/theme/theme.dom.cjs +0 -1
- package/dist/kernel/manager/theme/theme.dom.d.ts +0 -3
- package/dist/kernel/manager/theme/theme.dom.js +0 -1
- package/dist/kernel/manager/theme/theme.schema.cjs +0 -1
- package/dist/kernel/manager/theme/theme.schema.js +0 -1
- package/dist/kernel/manager/themeManager.cjs +0 -1
- package/dist/kernel/manager/themeManager.d.ts +0 -1
- package/dist/kernel/manager/themeManager.js +0 -1
- package/dist/library/index.cjs +0 -1
- package/dist/library/index.d.ts +0 -2
- package/dist/library/index.js +0 -1
- package/dist/library/locale/index.cjs +0 -1
- package/dist/library/locale/index.d.ts +0 -6
- package/dist/library/locale/index.js +0 -1
- package/dist/library/locale/langs/en-us/index.cjs +0 -1
- package/dist/library/locale/langs/en-us/index.d.ts +0 -3
- package/dist/library/locale/langs/en-us/index.js +0 -1
- package/dist/library/locale/langs/zh-cn/index.cjs +0 -1
- package/dist/library/locale/langs/zh-cn/index.d.ts +0 -3
- package/dist/library/locale/langs/zh-cn/index.js +0 -1
- package/dist/library/locale/types.d.ts +0 -38
- package/dist/library/storage/cache.cjs +0 -1
- package/dist/library/storage/cache.d.ts +0 -57
- package/dist/library/storage/cache.js +0 -1
- package/dist/library/storage/encryption.cjs +0 -1
- package/dist/library/storage/encryption.d.ts +0 -45
- package/dist/library/storage/encryption.js +0 -1
- package/dist/library/storage/index.cjs +0 -1
- package/dist/library/storage/index.d.ts +0 -62
- package/dist/library/storage/index.js +0 -1
- package/dist/state/StateManager.cjs +0 -1
- package/dist/state/StateManager.d.ts +0 -120
- package/dist/state/StateManager.js +0 -1
- package/dist/state/adapters/AdapterFactory.cjs +0 -1
- package/dist/state/adapters/AdapterFactory.d.ts +0 -51
- package/dist/state/adapters/AdapterFactory.js +0 -1
- package/dist/state/adapters/DefaultAdapter.cjs +0 -1
- package/dist/state/adapters/DefaultAdapter.d.ts +0 -38
- package/dist/state/adapters/DefaultAdapter.js +0 -1
- package/dist/state/adapters/ReduxAdapter.cjs +0 -1
- package/dist/state/adapters/ReduxAdapter.d.ts +0 -129
- package/dist/state/adapters/ReduxAdapter.js +0 -1
- package/dist/state/adapters/ZustandAdapter.cjs +0 -1
- package/dist/state/adapters/ZustandAdapter.d.ts +0 -46
- package/dist/state/adapters/ZustandAdapter.js +0 -1
- package/dist/state/adapters/index.cjs +0 -1
- package/dist/state/adapters/index.d.ts +0 -8
- package/dist/state/adapters/index.js +0 -1
- package/dist/state/adapters/types.cjs +0 -1
- package/dist/state/adapters/types.d.ts +0 -4
- package/dist/state/adapters/types.js +0 -1
- package/dist/state/core/DerivedStateInstance.cjs +0 -1
- package/dist/state/core/DerivedStateInstance.d.ts +0 -100
- package/dist/state/core/DerivedStateInstance.js +0 -1
- package/dist/state/core/StateInstance.cjs +0 -1
- package/dist/state/core/StateInstance.d.ts +0 -85
- package/dist/state/core/StateInstance.js +0 -1
- package/dist/state/core/StateRegistry.cjs +0 -1
- package/dist/state/core/StateRegistry.d.ts +0 -55
- package/dist/state/core/StateRegistry.js +0 -1
- package/dist/state/core/StateScope.cjs +0 -1
- package/dist/state/core/StateScope.d.ts +0 -71
- package/dist/state/core/StateScope.js +0 -1
- package/dist/state/core/index.cjs +0 -1
- package/dist/state/core/index.d.ts +0 -7
- package/dist/state/core/index.js +0 -1
- package/dist/state/index.cjs +0 -1
- package/dist/state/index.d.ts +0 -8
- package/dist/state/index.js +0 -1
- package/dist/state/types.d.ts +0 -230
- package/dist/state.umd.js +0 -41
- package/dist/types.cjs +0 -1
- package/dist/types.d.ts +0 -7
- package/dist/types.js +0 -1
- package/dist/utils/analytics.cjs +0 -1
- package/dist/utils/analytics.d.ts +0 -127
- package/dist/utils/analytics.js +0 -1
- package/dist/utils/configSecurity.cjs +0 -3
- package/dist/utils/configSecurity.d.ts +0 -100
- package/dist/utils/configSecurity.js +0 -3
- package/dist/utils/csrf.cjs +0 -1
- package/dist/utils/csrf.d.ts +0 -1
- package/dist/utils/csrf.js +0 -1
- package/dist/utils/errors/ErrorCodes.cjs +0 -1
- package/dist/utils/errors/ErrorCodes.d.ts +0 -1
- package/dist/utils/errors/ErrorCodes.js +0 -1
- package/dist/utils/errors.cjs +0 -1
- package/dist/utils/errors.d.ts +0 -30
- package/dist/utils/errors.js +0 -1
- package/dist/utils/index.cjs +0 -1
- package/dist/utils/index.d.ts +0 -39
- package/dist/utils/index.js +0 -1
- package/dist/utils/logger.cjs +0 -1
- package/dist/utils/logger.d.ts +0 -2
- package/dist/utils/logger.js +0 -1
- package/dist/utils/logger.types.cjs +0 -1
- package/dist/utils/logger.types.d.ts +0 -2
- package/dist/utils/logger.types.js +0 -1
- package/dist/utils/monitoring.cjs +0 -1
- package/dist/utils/monitoring.d.ts +0 -1
- package/dist/utils/monitoring.js +0 -1
- package/dist/utils/performance.cjs +0 -1
- package/dist/utils/performance.d.ts +0 -2
- package/dist/utils/performance.js +0 -1
- package/dist/utils/resourceLoader.cjs +0 -1
- package/dist/utils/resourceLoader.d.ts +0 -2
- package/dist/utils/resourceLoader.js +0 -1
- package/dist/utils/runtimeSecurity.cjs +0 -1
- package/dist/utils/runtimeSecurity.d.ts +0 -2
- package/dist/utils/runtimeSecurity.js +0 -1
- package/dist/utils/security.cjs +0 -1
- package/dist/utils/security.d.ts +0 -2
- package/dist/utils/security.js +0 -1
- package/dist/utils/traceId.cjs +0 -1
- package/dist/utils/traceId.d.ts +0 -1
- package/dist/utils/traceId.js +0 -1
- package/dist/utils/validation.cjs +0 -1
- package/dist/utils/validation.d.ts +0 -2
- package/dist/utils/validation.js +0 -1
- /package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.cjs +0 -0
- /package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.js +0 -0
- /package/dist/{library/locale → kernel/custom-manager/i18n}/types.cjs +0 -0
- /package/dist/{library/locale → kernel/custom-manager/i18n}/types.js +0 -0
- /package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.cjs +0 -0
- /package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.js +0 -0
- /package/dist/{state → kernel/custom-manager/theme}/types.cjs +0 -0
- /package/dist/{state → kernel/custom-manager/theme}/types.js +0 -0
package/README.md
CHANGED
|
@@ -1,170 +1,54 @@
|
|
|
1
1
|
# @vlian/framework
|
|
2
2
|
|
|
3
|
-
Secra Framework -
|
|
3
|
+
Secra Framework - kernel-only runtime package
|
|
4
4
|
|
|
5
5
|
## 简介
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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 {
|
|
41
|
-
import
|
|
18
|
+
import { getKernel, startup } from '@vlian/framework';
|
|
19
|
+
import { registerThemeManager } from '@vlian/framework/theme';
|
|
42
20
|
|
|
43
|
-
|
|
44
|
-
await startApp({
|
|
45
|
-
app: <App />,
|
|
46
|
-
});
|
|
47
|
-
```
|
|
21
|
+
const kernel = await startup({}, 'app');
|
|
48
22
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
],
|
|
23
|
+
await registerThemeManager(kernel, {
|
|
24
|
+
initial: {
|
|
25
|
+
mode: 'light',
|
|
86
26
|
},
|
|
87
27
|
});
|
|
88
28
|
```
|
|
89
29
|
|
|
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
|
-
状态管理模块,提供统一的状态管理抽象,支持多种适配器。
|
|
30
|
+
## 导出范围
|
|
153
31
|
|
|
154
|
-
|
|
32
|
+
- `@vlian/framework`
|
|
33
|
+
- `@vlian/framework/kernel`
|
|
34
|
+
- `@vlian/framework/theme`
|
|
35
|
+
- `@vlian/framework/i18n`
|
|
155
36
|
|
|
156
|
-
|
|
37
|
+
`@vlian/framework` 与 `@vlian/framework/kernel` 导出相同的 kernel API,包括 `Kernel`、`startup`、`getKernel`、`kernelStartApp` 以及相关类型。
|
|
38
|
+
`theme`、`i18n` 改为独立子路径导出,按需从 `@vlian/framework/theme`、`@vlian/framework/i18n` 引入并注册到 kernel,可让消费方在 Vite 打包时获得更稳定的分包边界。
|
|
157
39
|
|
|
158
|
-
##
|
|
40
|
+
## 迁移说明
|
|
159
41
|
|
|
160
|
-
|
|
42
|
+
- 删除所有 `@vlian/framework/utils`、`@vlian/framework/state`、`@vlian/framework/library`、`@vlian/framework/components`、`@vlian/framework/analytics` 的导入。
|
|
43
|
+
- 旧模块如果仍有业务价值,需要迁移到应用侧或拆分为独立包维护。
|
|
44
|
+
- `theme`、`i18n` 不再从根入口或 `kernel` 入口聚合导出;需要时请显式从 `@vlian/framework/theme`、`@vlian/framework/i18n` 引入并注册自定义管理器。
|
|
45
|
+
- 推荐围绕 kernel manager 收口日志、缓存,以及按需挂载的主题和国际化能力。
|
|
161
46
|
|
|
162
47
|
## 依赖要求
|
|
163
48
|
|
|
164
|
-
-
|
|
165
|
-
-
|
|
166
|
-
-
|
|
167
|
-
- react-error-boundary: ^6.0.0
|
|
49
|
+
- `i18next`: `^23.0.0 || ^24.0.0 || ^25.0.0`
|
|
50
|
+
- `@vlian/logger`: `^0.1.0`
|
|
51
|
+
- `@vlian/utils`: `^2.0.1`
|
|
168
52
|
|
|
169
53
|
## 许可证
|
|
170
54
|
|
|
@@ -172,5 +56,4 @@ Apache-2.0
|
|
|
172
56
|
|
|
173
57
|
## 相关链接
|
|
174
58
|
|
|
175
|
-
- [文档](./docs/README.md)
|
|
176
59
|
- [变更日志](./CHANGELOG.md)
|
package/dist/i18n.cjs
ADDED
|
@@ -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 _i18n.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _i18n.DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _i18n.I18N_MANAGER_NAME},get I18nManager(){return _i18n.I18nManager},get registerI18nManager(){return _i18n.registerI18nManager}});const _i18n=require("./kernel/custom-manager/i18n");
|
package/dist/i18n.d.ts
ADDED
package/dist/i18n.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{I18nManager,DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME,registerI18nManager}from"./kernel/custom-manager/i18n";
|
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
|
|
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
|
-
|
|
1
|
+
export{Kernel,startup,getKernel,kernelStartApp}from"./kernel";
|
package/dist/index.umd.js
CHANGED
|
@@ -1,240 +1,30 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @vlian/framework
|
|
2
|
+
* @vlian/framework v2.0.1
|
|
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('
|
|
9
|
-
typeof define === 'function' && define.amd ? define(['exports', '
|
|
10
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.
|
|
11
|
-
})(this, (function (exports,
|
|
8
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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()}
|
|
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
|
|
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 {
|
|
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;
|
package/dist/kernel/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LogLevel}from"@vlian/logger";export const DEFAULT_INSTANCE_ID="default";export const
|
|
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});Object.defineProperty(exports,"I18nManager",{enumerable:true,get:function(){return I18nManager}});const _constants=require("./constants");const _i18npersistence=require("./i18n.persistence");const _i18nruntime=require("./i18n.runtime");const _i18nschema=require("./i18n.schema");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let I18nManager=class I18nManager{async initialize(context){this.config=context.getManagerConfig(_constants.I18N_MANAGER_NAME)||_constants.DEFAULT_I18N_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialSnapshot=(0,_i18nschema.normalizeI18nSnapshot)(this.config.initial||{},_constants.DEFAULT_I18N);this.snapshot=await (0,_i18npersistence.loadI18nFromCache)(this.cacheManager,this.config.persistence,initialSnapshot);await (0,_i18nruntime.initializeI18nRuntime)({locale:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});this.initialized=true}getSnapshot(){return(0,_i18nschema.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=(0,_i18nschema.mergeI18nSnapshot)(prevSnapshot,{locale});if((0,_i18nschema.isI18nEqual)(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await (0,_i18nruntime.switchI18nLocale)(this.snapshot.locale);if(this.cacheManager){await (0,_i18npersistence.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((0,_i18nschema.cloneI18nSnapshot)(next),(0,_i18nschema.cloneI18nSnapshot)(prev))}catch{}}}constructor(){_define_property(this,"snapshot",(0,_i18nschema.cloneI18nSnapshot)(_constants.DEFAULT_I18N));_define_property(this,"config",_constants.DEFAULT_I18N_MANAGER_CONFIG);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"initialized",false)}};
|