@anov/cic-standard-sdk 0.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.
- package/README.md +229 -0
- package/dist/cic-sdk.cjs.js +8 -0
- package/dist/cic-sdk.es.js +4912 -0
- package/dist/cic-sdk.umd.js +8 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# CIC 标准库 (Component Interaction Configuration)
|
|
2
|
+
|
|
3
|
+
CIC(Common Intermediate Configuration,大屏可视化交换格式) 是一套面向可视化大屏项目的 结构化序列化标准 ,聚焦于定义中间层的通用配置规则。其核心目标是解决大屏项目在跨平台迁移、批量导入/导出及版本化管理中的关键痛点——通过 标准化数据格式、组件交互逻辑与资源引用方式 ,赋予大屏内容“一次创建,多端复用”的序列化能力,系统性解决多组件协作、跨环境一致性及可扩展性难题。本仓库提供了该协议的 TypeScript 类型定义、JSON Schema 校验文件以及核心 SDK 工具库。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
CIC-Standard-1.0/
|
|
9
|
+
├── types/ # TypeScript 类型定义(核心协议)
|
|
10
|
+
│ ├── index.ts # 入口,定义 CICConfig, CICPage
|
|
11
|
+
│ ├── componets.ts # 组件实例与结构定义
|
|
12
|
+
│ ├── events.ts # 事件与 DSL 定义
|
|
13
|
+
│ ├── variables.ts # 变量与作用域定义
|
|
14
|
+
│ ├── dataSources.ts # 数据源定义
|
|
15
|
+
│ ├── deps.ts # 资源依赖定义
|
|
16
|
+
│ ├── meta.ts # 元数据定义
|
|
17
|
+
│ └── registry.ts # 组件注册表定义
|
|
18
|
+
├── sdk/ # 核心工具库
|
|
19
|
+
│ └── CICSDK.ts # SDK 类定义与实现
|
|
20
|
+
├── schema/ # JSON Schema 定义
|
|
21
|
+
│ └── cic.schema.json # Draft-07 标准 Schema
|
|
22
|
+
├── examples/ # 示例文件
|
|
23
|
+
│ └── full-demo.json # 完整功能演示配置
|
|
24
|
+
├── tests/ # 单元测试
|
|
25
|
+
│ └── sdk.test.ts # SDK 测试用例
|
|
26
|
+
├── dist/ # 构建产物
|
|
27
|
+
│ ├── cic-sdk.es.js # ESM 格式
|
|
28
|
+
│ ├── cic-sdk.cjs.js # CJS 格式
|
|
29
|
+
│ └── cic-sdk.umd.js # UMD 格式
|
|
30
|
+
└── vite.config.ts # Vite 构建配置
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 1. 协议核心概念
|
|
34
|
+
|
|
35
|
+
CIC 协议通过 JSON 描述一个完整的应用页面结构与行为:
|
|
36
|
+
|
|
37
|
+
- **Config**: 全局配置根节点,包含页面列表、全局变量、资源依赖等。
|
|
38
|
+
- **Page**: 页面定义,包含布局配置、组件树、页面级数据源。
|
|
39
|
+
- **Component**: 组件实例,分为 View (视图)、Container (容器)、Logic (逻辑) 三类。
|
|
40
|
+
- **Event**: 强大的事件 DSL,支持变量操作、页面跳转、组件控制、自定义脚本等,支持条件执行与调度(Order/Delay)。
|
|
41
|
+
- **Variable**: 多级作用域(Global > Page > Component)的变量管理,支持 string/number/object/array/function。
|
|
42
|
+
- **DataSource**: 统一的数据源定义(REST, WebSocket, Static),支持轮询与依赖。
|
|
43
|
+
|
|
44
|
+
## 2. SDK 使用指南
|
|
45
|
+
|
|
46
|
+
SDK 提供了操作 CIC 标准的常用工具方法,现已重构为面向对象的 `CICSDK` 类,内置 **Ajv** 引擎进行全量 JSON Schema 校验,并支持 Vite 构建与 Tree-shaking。
|
|
47
|
+
|
|
48
|
+
### 安装与引入
|
|
49
|
+
|
|
50
|
+
推荐使用 `pnpm` 安装依赖:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pnpm install cic-standard-sdk
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { CICSDK } from 'cic-standard-sdk';
|
|
58
|
+
import { CICConfig } from 'cic-standard-sdk/types';
|
|
59
|
+
|
|
60
|
+
const config: CICConfig = { ... };
|
|
61
|
+
const sdk = new CICSDK(config); // 实例化时自动执行 Schema 校验
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 常用 API
|
|
65
|
+
|
|
66
|
+
**1. 验证配置**(`sdk/CICSDK.ts:174`)
|
|
67
|
+
|
|
68
|
+
SDK 集成了完整的 JSON Schema (Draft-07),可验证字段类型、必填项、枚举值等。
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// 静态方法校验
|
|
72
|
+
const result = CICSDK.validateConfig(myConfig)
|
|
73
|
+
if (!result.valid) {
|
|
74
|
+
console.error('配置校验失败:', result.error)
|
|
75
|
+
// 输出示例: "/meta/layout/type must be string; /version must have required property 'version'"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 实例化时自动校验,失败抛出异常
|
|
79
|
+
try {
|
|
80
|
+
const sdk = new CICSDK(myConfig)
|
|
81
|
+
} catch (e) {
|
|
82
|
+
console.error(e.message)
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**2. 查找组件**(`sdk/CICSDK.ts:47`、`sdk/CICSDK.ts:62`)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// 按 ID 查找(支持跨页面)
|
|
90
|
+
const comp = sdk.findComponent('comp_btn_01')
|
|
91
|
+
if (comp) {
|
|
92
|
+
console.log('找到组件:', comp.role)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 查找组件所属页面
|
|
96
|
+
const page = sdk.findPageByComponent('comp_btn_01')
|
|
97
|
+
console.log('所在页面:', page?.id)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**3. 获取变量值(自动处理作用域)**(`sdk/CICSDK.ts:80`、`sdk/CICSDK.ts:109`)
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// 优先查找组件级 -> 页面级 -> 全局
|
|
104
|
+
const val = sdk.getVariable({ pageId: 'p1', componentId: 'c1' }, 'theme')
|
|
105
|
+
|
|
106
|
+
// 通过引用字符串获取
|
|
107
|
+
const val2 = sdk.getVariableByRef('global.theme')
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**4. 遍历组件树**(`sdk/CICSDK.ts:125`、`sdk/CICSDK.ts:220`)
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// 遍历整个配置的所有组件
|
|
114
|
+
sdk.walkComponents((comp, page, parent) => {
|
|
115
|
+
console.log(`遍历到: ${comp.id} (页面: ${page.id})`)
|
|
116
|
+
// 返回 false 可停止遍历
|
|
117
|
+
return true
|
|
118
|
+
})
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**5. 静态工具**(`sdk/CICSDK.ts:199`、`sdk/CICSDK.ts:220`)
|
|
122
|
+
|
|
123
|
+
### 生成器 API(严格校验 + 规范化)
|
|
124
|
+
|
|
125
|
+
- `createDataSource/validateDataSource/normalizeDataSource`(`sdk/generators/dataSource.ts`)
|
|
126
|
+
- `createComponent/validateComponent/normalizeComponent`(`sdk/generators/component.ts`)
|
|
127
|
+
- `createPage/validatePage/normalizePage`(`sdk/generators/page.ts`)
|
|
128
|
+
- `createMeta/validateMeta/normalizeMeta`(`sdk/generators/meta.ts`)
|
|
129
|
+
- `createLayout/validateLayout/normalizeLayout`(`sdk/generators/meta.ts`)
|
|
130
|
+
- `createVariables/validateVariables/normalizeVariables`(`sdk/generators/variables.ts`)
|
|
131
|
+
- `createDependency/validateDependency/normalizeDependency`(`sdk/generators/dependency.ts`)
|
|
132
|
+
- `createRegistryComponent/validateRegistryComponent/normalizeRegistryComponent`(`sdk/generators/registry.ts`)
|
|
133
|
+
|
|
134
|
+
所有生成器返回统一 `Result<T>`:`{ ok: boolean; value?: T; errors?: any[] }`。`normalizeX` 在校验失败时抛出错误,方便在构建或运行时快速失败。
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// 解析路径取值
|
|
138
|
+
const val = CICSDK.getValueByPath(someObj, 'a.b[0].c', 'default')
|
|
139
|
+
|
|
140
|
+
// 深度遍历组件树片段
|
|
141
|
+
CICSDK.traverseTree(someComponent, c => {
|
|
142
|
+
console.log(c.id)
|
|
143
|
+
})
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 3. 开发与测试
|
|
147
|
+
|
|
148
|
+
本项目使用 Vite 进行构建,Vitest 进行单元测试,推荐使用 `pnpm` 管理依赖。
|
|
149
|
+
|
|
150
|
+
### 命令脚本
|
|
151
|
+
|
|
152
|
+
- `pnpm install`: 安装依赖
|
|
153
|
+
- `pnpm run dev`: 启动开发模式
|
|
154
|
+
- `pnpm run build`: 构建 SDK(输出 `dist/`)
|
|
155
|
+
- `pnpm test`: 运行单元测试
|
|
156
|
+
|
|
157
|
+
### 构建产物
|
|
158
|
+
|
|
159
|
+
- `dist/cic-sdk.es.js`: ESM 格式,适用于现代前端项目(Vite/Webpack)。
|
|
160
|
+
- `dist/cic-sdk.cjs.js`: CJS 格式,适用于 Node.js `require`。
|
|
161
|
+
- `dist/cic-sdk.umd.js`: UMD 格式,适用于 `<script>` 引入。
|
|
162
|
+
|
|
163
|
+
在 `package.json` 中已配置 `exports` 字段与 `sideEffects: false`,支持 Tree‑shaking 与正确的导入解析。
|
|
164
|
+
|
|
165
|
+
## 4. JSON Schema 校验
|
|
166
|
+
|
|
167
|
+
`schema/cic.schema.json` 提供了完整的协议约束。
|
|
168
|
+
|
|
169
|
+
### 在 VS Code 中启用智能提示
|
|
170
|
+
|
|
171
|
+
在你的 JSON 配置文件头部添加 `$schema` 字段:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"$schema": "./schema/cic.schema.json",
|
|
176
|
+
"version": "1.0.0",
|
|
177
|
+
"meta": { ... }
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
这将启用:
|
|
182
|
+
|
|
183
|
+
- 字段自动补全
|
|
184
|
+
- 枚举值提示(如 `type`: `view` | `container`)
|
|
185
|
+
- 结构校验(必填字段检查)
|
|
186
|
+
|
|
187
|
+
### 常见报错与排查
|
|
188
|
+
|
|
189
|
+
- Ajv 错误输出包含 `instancePath`:根据路径定位到具体字段(如 `/pages/0/components/1/role must be equal to constant`)。
|
|
190
|
+
- 组件判别联合:`view` 必须提供 `component`;`container` 必须提供 `children`;`logic` 必须提供 `component`(`LogicRef`)。
|
|
191
|
+
- 数值字段:如 `pollInterval/timeout` 必须为数字;生成器在 `defaults` 指定时会注入确定性默认。
|
|
192
|
+
|
|
193
|
+
### 最佳实践
|
|
194
|
+
|
|
195
|
+
- 严格模式:默认不做隐式容错,缺失必填即报错;通过 `options.defaults` 明确提供默认值。
|
|
196
|
+
- 按需引入:仅从 `CICSDK` 静态导出使用所需生成器函数,减少打包体积。
|
|
197
|
+
- ID 规范:通过生成器的 `generateId` 自动生成 `uuid`,避免冲突。
|
|
198
|
+
|
|
199
|
+
## 5. Schema 与 Mock 脚本
|
|
200
|
+
|
|
201
|
+
### Schema 生成脚本(`scripts/generate-schema.ts`)
|
|
202
|
+
|
|
203
|
+
- 通过配置项裁剪复杂度、保留必要字段,输出更简洁可用的 JSON Schema。
|
|
204
|
+
|
|
205
|
+
### Mock 生成与清洗(`scripts/generate-mock.ts`)
|
|
206
|
+
|
|
207
|
+
- 基于 Schema 随机生成后,使用 `deepClean` 进行规范化:
|
|
208
|
+
- 修正非法数组项、补齐 `id`(uuid)、规范 `url`/`ws` 链接。
|
|
209
|
+
- 为 `code` 字段提供可执行的默认实现。
|
|
210
|
+
|
|
211
|
+
示例输出能直接通过 Ajv 校验并用于演示与测试。
|
|
212
|
+
|
|
213
|
+
## 5. 示例说明
|
|
214
|
+
|
|
215
|
+
请查看 `examples/full-demo.json`,它展示了:
|
|
216
|
+
|
|
217
|
+
- 如何定义全局主题变量。
|
|
218
|
+
- 如何引入外部 ECharts 库与字体资源。
|
|
219
|
+
- 如何配置 REST 数据源。
|
|
220
|
+
- 如何构建包含图表与按钮的组件树。
|
|
221
|
+
- 如何通过点击事件触发变量更新与自定义逻辑。
|
|
222
|
+
|
|
223
|
+
## 安全声明
|
|
224
|
+
|
|
225
|
+
CIC 允许执行动态代码(Custom Events, Logic Components)。在生产环境中渲染不可信的 CIC 配置时,请务必:
|
|
226
|
+
|
|
227
|
+
1. 使用 iframe 或 Web Worker 隔离渲染环境。
|
|
228
|
+
2. 限制代码执行的上下文访问权限。
|
|
229
|
+
3. 对 `CustomRemoteEvent` 加载的外部脚本进行域名白名单控制。
|