@chatbi-v/core 2.1.10 → 3.1.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 +1 -1
- package/dist/adapters/index.cjs +212 -0
- package/dist/adapters/index.d.cts +201 -0
- package/dist/adapters/index.d.ts +201 -0
- package/dist/adapters/index.mjs +10 -0
- package/dist/chunk-6ZN23KJA.mjs +60 -0
- package/dist/chunk-AAKBSVX6.mjs +220 -0
- package/dist/chunk-K6BVKKI6.mjs +184 -0
- package/dist/index.cjs +5035 -1994
- package/dist/index.d.cts +2032 -1144
- package/dist/index.d.ts +2032 -1144
- package/dist/index.mjs +4594 -1923
- package/dist/manifest/index.cjs +253 -0
- package/dist/manifest/index.d.cts +56 -0
- package/dist/manifest/index.d.ts +56 -0
- package/dist/manifest/index.mjs +20 -0
- package/dist/plugin-port-CHRPxDOi.d.cts +1092 -0
- package/dist/plugin-port-CHRPxDOi.d.ts +1092 -0
- package/dist/semver/index.cjs +449 -0
- package/dist/semver/index.d.cts +192 -0
- package/dist/semver/index.d.ts +192 -0
- package/dist/semver/index.mjs +355 -0
- package/package.json +32 -12
- package/dist/chunk-4AJ6VW5G.mjs +0 -50
- package/dist/config-manager-F3GYW4BE.mjs +0 -8
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// src/manifest/PluginManifest.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var EXTENSION_TYPES = ["slot", "hook", "command", "service"];
|
|
4
|
+
var RENDER_MODES = ["replace", "append", "prepend"];
|
|
5
|
+
var ExtensionSchema = z.object({
|
|
6
|
+
/** 扩展点名称/标识符 */
|
|
7
|
+
name: z.string().min(1, "\u6269\u5C55\u70B9\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"),
|
|
8
|
+
/** 扩展点类型 */
|
|
9
|
+
type: z.enum(EXTENSION_TYPES),
|
|
10
|
+
/** 扩展点描述 */
|
|
11
|
+
description: z.string().optional(),
|
|
12
|
+
/** 对于 slot 类型,指定插槽位置 */
|
|
13
|
+
slot: z.string().optional(),
|
|
14
|
+
/** 扩展点的配置选项 */
|
|
15
|
+
config: z.record(z.any()).optional(),
|
|
16
|
+
/**
|
|
17
|
+
* 渲染模式
|
|
18
|
+
* @description 定义插槽内容的渲染方式:replace(替换)、append(追加)、prepend(前置)
|
|
19
|
+
*/
|
|
20
|
+
renderMode: z.enum(RENDER_MODES).optional(),
|
|
21
|
+
/**
|
|
22
|
+
* 条件渲染配置
|
|
23
|
+
* @description 用于条件渲染,如 requiresAuth: true 表示需要认证
|
|
24
|
+
*/
|
|
25
|
+
condition: z.record(z.any()).optional()
|
|
26
|
+
});
|
|
27
|
+
var DependencySchema = z.object({
|
|
28
|
+
/** 依赖插件 ID */
|
|
29
|
+
id: z.string().min(1, "\u4F9D\u8D56\u63D2\u4EF6 ID \u4E0D\u80FD\u4E3A\u7A7A"),
|
|
30
|
+
/** 依赖版本范围 (SemVer) */
|
|
31
|
+
version: z.string().min(1, "\u4F9D\u8D56\u7248\u672C\u4E0D\u80FD\u4E3A\u7A7A"),
|
|
32
|
+
/** 是否为可选依赖 */
|
|
33
|
+
optional: z.boolean().optional().default(false)
|
|
34
|
+
});
|
|
35
|
+
var PLUGIN_TYPES = [
|
|
36
|
+
"business",
|
|
37
|
+
"functional",
|
|
38
|
+
"view",
|
|
39
|
+
"theme",
|
|
40
|
+
"renderer",
|
|
41
|
+
"system"
|
|
42
|
+
];
|
|
43
|
+
var EntrySchema = z.union([
|
|
44
|
+
z.string().min(1, "\u5165\u53E3\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A"),
|
|
45
|
+
z.object({
|
|
46
|
+
/** 入口文件 URL */
|
|
47
|
+
url: z.string().min(1, "\u5165\u53E3 URL \u4E0D\u80FD\u4E3A\u7A7A"),
|
|
48
|
+
/** 共享作用域 (用于模块联邦) */
|
|
49
|
+
shareScope: z.string().optional()
|
|
50
|
+
})
|
|
51
|
+
]);
|
|
52
|
+
var CompatibilitySchema = z.object({
|
|
53
|
+
/** 最低宿主版本 */
|
|
54
|
+
minVersion: z.string().optional(),
|
|
55
|
+
/** 最高宿主版本 */
|
|
56
|
+
maxVersion: z.string().optional(),
|
|
57
|
+
/** 兼容的宿主版本列表 */
|
|
58
|
+
supportedVersions: z.array(z.string()).optional()
|
|
59
|
+
});
|
|
60
|
+
var CapabilitiesSchema = z.record(z.boolean());
|
|
61
|
+
var ConfigurationSchema = z.array(
|
|
62
|
+
z.object({
|
|
63
|
+
key: z.string().min(1),
|
|
64
|
+
type: z.enum(["string", "number", "boolean", "select"]),
|
|
65
|
+
label: z.string().min(1),
|
|
66
|
+
description: z.string().optional(),
|
|
67
|
+
default: z.any().optional(),
|
|
68
|
+
options: z.array(z.object({ label: z.string(), value: z.any() })).optional()
|
|
69
|
+
})
|
|
70
|
+
);
|
|
71
|
+
var PERMISSION_ACTIONS = [
|
|
72
|
+
"read",
|
|
73
|
+
"write",
|
|
74
|
+
"execute",
|
|
75
|
+
"admin"
|
|
76
|
+
];
|
|
77
|
+
var PERMISSION_SCOPES = ["plugin", "global", "user"];
|
|
78
|
+
var PluginManifestSchema = z.object({
|
|
79
|
+
/** 插件唯一 ID (推荐反向域名格式) */
|
|
80
|
+
id: z.string().min(1, "\u63D2\u4EF6 ID \u4E0D\u80FD\u4E3A\u7A7A"),
|
|
81
|
+
/** 插件版本号 (SemVer) */
|
|
82
|
+
version: z.string().min(1, "\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A").refine((v) => /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(v), {
|
|
83
|
+
message: "\u7248\u672C\u53F7\u5FC5\u987B\u7B26\u5408 SemVer \u683C\u5F0F"
|
|
84
|
+
}),
|
|
85
|
+
/** 插件显示名称 */
|
|
86
|
+
name: z.string().min(1, "\u63D2\u4EF6\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"),
|
|
87
|
+
/** 插件入口 */
|
|
88
|
+
entry: EntrySchema,
|
|
89
|
+
/** 插件类型 */
|
|
90
|
+
type: z.enum(PLUGIN_TYPES).optional().default("business"),
|
|
91
|
+
/** 插件功能描述 */
|
|
92
|
+
description: z.string().optional(),
|
|
93
|
+
/** 插件作者 */
|
|
94
|
+
author: z.string().optional(),
|
|
95
|
+
/** 插件图标 */
|
|
96
|
+
icon: z.string().optional(),
|
|
97
|
+
/** 兼容性要求 */
|
|
98
|
+
compatibility: CompatibilitySchema.optional(),
|
|
99
|
+
/** 插件依赖 */
|
|
100
|
+
dependencies: z.array(DependencySchema).optional().default([]),
|
|
101
|
+
/** 扩展点声明 */
|
|
102
|
+
extensions: z.array(ExtensionSchema).optional().default([]),
|
|
103
|
+
/** 能力声明 */
|
|
104
|
+
capabilities: CapabilitiesSchema.optional(),
|
|
105
|
+
/** 配置项定义 */
|
|
106
|
+
configuration: ConfigurationSchema.optional(),
|
|
107
|
+
/** 存储定义 */
|
|
108
|
+
storage: z.array(z.any()).optional(),
|
|
109
|
+
/** 路由定义 (仅供展示,实际路由在运行时注册) */
|
|
110
|
+
routes: z.array(z.object({ path: z.string() })).optional(),
|
|
111
|
+
/** 权限声明 */
|
|
112
|
+
permissions: z.array(
|
|
113
|
+
z.object({
|
|
114
|
+
action: z.enum(PERMISSION_ACTIONS),
|
|
115
|
+
scope: z.enum(PERMISSION_SCOPES),
|
|
116
|
+
resource: z.string()
|
|
117
|
+
})
|
|
118
|
+
).optional(),
|
|
119
|
+
/** 插件优先级 */
|
|
120
|
+
priority: z.number().optional().default(100)
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// src/manifest/ManifestValidator.ts
|
|
124
|
+
function formatZodErrors(error) {
|
|
125
|
+
return error.errors.map((err) => ({
|
|
126
|
+
message: err.message,
|
|
127
|
+
path: err.path.map(String),
|
|
128
|
+
type: err.code
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
function validateManifest(raw) {
|
|
132
|
+
const result = PluginManifestSchema.safeParse(raw);
|
|
133
|
+
if (result.success) {
|
|
134
|
+
return {
|
|
135
|
+
valid: true,
|
|
136
|
+
data: result.data
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
valid: false,
|
|
141
|
+
errors: formatZodErrors(result.error)
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function assertManifest(raw) {
|
|
145
|
+
return PluginManifestSchema.parse(raw);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/manifest/ManifestWrapper.ts
|
|
149
|
+
function extractManifestFromPlugin(plugin) {
|
|
150
|
+
const input = plugin;
|
|
151
|
+
const metadata = input.metadata;
|
|
152
|
+
const manifest = {
|
|
153
|
+
id: input.id || metadata?.id,
|
|
154
|
+
version: metadata?.version || "1.0.0",
|
|
155
|
+
name: metadata?.name || input.name,
|
|
156
|
+
type: metadata?.type || input.type,
|
|
157
|
+
description: metadata?.description || input.description,
|
|
158
|
+
author: metadata?.author || input.author,
|
|
159
|
+
icon: metadata?.icon || input.icon,
|
|
160
|
+
entry: input.entry || "index.js"
|
|
161
|
+
};
|
|
162
|
+
const deps = metadata?.dependencies || input.dependencies;
|
|
163
|
+
if (Array.isArray(deps)) {
|
|
164
|
+
manifest.dependencies = deps.map((dep) => {
|
|
165
|
+
if (typeof dep === "string") {
|
|
166
|
+
return { id: dep, version: "*", optional: false };
|
|
167
|
+
}
|
|
168
|
+
return dep;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const extensions = metadata?.extensions || input.extensions;
|
|
172
|
+
if (Array.isArray(extensions)) {
|
|
173
|
+
manifest.extensions = extensions.map(
|
|
174
|
+
(ext) => ({
|
|
175
|
+
name: ext.slot || ext.name,
|
|
176
|
+
type: "slot",
|
|
177
|
+
description: ext.meta?.description,
|
|
178
|
+
slot: ext.slot
|
|
179
|
+
})
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
const caps = metadata?.capabilities || input.capabilities;
|
|
183
|
+
if (caps && typeof caps === "object") {
|
|
184
|
+
manifest.capabilities = caps;
|
|
185
|
+
}
|
|
186
|
+
const config = metadata?.configuration || input.configuration;
|
|
187
|
+
if (Array.isArray(config)) {
|
|
188
|
+
manifest.configuration = config;
|
|
189
|
+
}
|
|
190
|
+
return manifest;
|
|
191
|
+
}
|
|
192
|
+
function normalizePluginManifest(input) {
|
|
193
|
+
let manifest;
|
|
194
|
+
if (!input || typeof input !== "object") {
|
|
195
|
+
return {
|
|
196
|
+
valid: false,
|
|
197
|
+
errors: [{ message: "\u8F93\u5165\u5FC5\u987B\u662F\u5BF9\u8C61", path: [], type: "invalid_type" }]
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const record = input;
|
|
201
|
+
if (record.id && record.version && record.name && record.entry) {
|
|
202
|
+
manifest = record;
|
|
203
|
+
} else if (record.metadata) {
|
|
204
|
+
manifest = extractManifestFromPlugin(record);
|
|
205
|
+
} else {
|
|
206
|
+
manifest = extractManifestFromPlugin(record);
|
|
207
|
+
}
|
|
208
|
+
return validateManifest(manifest);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export {
|
|
212
|
+
EXTENSION_TYPES,
|
|
213
|
+
RENDER_MODES,
|
|
214
|
+
PLUGIN_TYPES,
|
|
215
|
+
PluginManifestSchema,
|
|
216
|
+
validateManifest,
|
|
217
|
+
assertManifest,
|
|
218
|
+
extractManifestFromPlugin,
|
|
219
|
+
normalizePluginManifest
|
|
220
|
+
};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// src/adapters/AdapterInterface.ts
|
|
2
|
+
var BaseAdapter = class {
|
|
3
|
+
/**
|
|
4
|
+
* 模板方法 - 三层变换默认实现
|
|
5
|
+
* primitives -> semantics -> component tokens
|
|
6
|
+
*/
|
|
7
|
+
transformTokens(tokens, options) {
|
|
8
|
+
const semantics = options?.colorScheme === "dark" && tokens.semanticsDark ? tokens.semanticsDark : tokens.semantics;
|
|
9
|
+
return this.semanticsToComponents(semantics, options);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 将语义 Token 转换为组件级别配置
|
|
13
|
+
* 由子类实现具体转换逻辑
|
|
14
|
+
*/
|
|
15
|
+
semanticsToComponents(semantics, options) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
transform(tokens, options) {
|
|
19
|
+
return this.transformTokens(tokens, options);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/adapters/AdapterRegistry.ts
|
|
24
|
+
var AdapterRegistry = class {
|
|
25
|
+
adapters = /* @__PURE__ */ new Map();
|
|
26
|
+
states = /* @__PURE__ */ new Map();
|
|
27
|
+
activeAdapterId = null;
|
|
28
|
+
currentTokens = {};
|
|
29
|
+
/**
|
|
30
|
+
* 注册适配器
|
|
31
|
+
* @param adapter 要注册的 UIAdapter 实例
|
|
32
|
+
*/
|
|
33
|
+
register(adapter) {
|
|
34
|
+
if (this.adapters.has(adapter.id)) {
|
|
35
|
+
console.warn(
|
|
36
|
+
`[AdapterRegistry] Adapter ${adapter.id} already registered, overwriting`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
this.adapters.set(adapter.id, adapter);
|
|
40
|
+
this.states.set(adapter.id, {
|
|
41
|
+
adapter,
|
|
42
|
+
status: "registered",
|
|
43
|
+
registeredAt: /* @__PURE__ */ new Date()
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 注销适配器
|
|
48
|
+
* @param adapterId 要注销的适配器 ID
|
|
49
|
+
* @returns 是否成功注销
|
|
50
|
+
*/
|
|
51
|
+
unregister(adapterId) {
|
|
52
|
+
if (this.activeAdapterId === adapterId) {
|
|
53
|
+
console.warn(
|
|
54
|
+
`[AdapterRegistry] Cannot unregister active adapter ${adapterId}`
|
|
55
|
+
);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const adapter = this.adapters.get(adapterId);
|
|
59
|
+
if (adapter) {
|
|
60
|
+
adapter.remove();
|
|
61
|
+
}
|
|
62
|
+
this.adapters.delete(adapterId);
|
|
63
|
+
this.states.delete(adapterId);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 获取指定适配器
|
|
68
|
+
* @param adapterId 适配器 ID
|
|
69
|
+
* @returns 适配器实例或 undefined
|
|
70
|
+
*/
|
|
71
|
+
get(adapterId) {
|
|
72
|
+
return this.adapters.get(adapterId);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取所有已注册的适配器
|
|
76
|
+
* @returns 所有适配器实例数组
|
|
77
|
+
*/
|
|
78
|
+
getAll() {
|
|
79
|
+
return Array.from(this.adapters.values());
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取所有适配器状态
|
|
83
|
+
* @returns 所有适配器状态数组
|
|
84
|
+
*/
|
|
85
|
+
getAllStates() {
|
|
86
|
+
return Array.from(this.states.values());
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 设置活跃适配器
|
|
90
|
+
* @param adapterId 要激活的适配器 ID
|
|
91
|
+
* @returns 是否成功激活
|
|
92
|
+
*/
|
|
93
|
+
setActive(adapterId) {
|
|
94
|
+
const adapter = this.adapters.get(adapterId);
|
|
95
|
+
if (!adapter) {
|
|
96
|
+
console.error(`[AdapterRegistry] Adapter ${adapterId} not found`);
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (this.activeAdapterId) {
|
|
100
|
+
const current = this.adapters.get(this.activeAdapterId);
|
|
101
|
+
current?.remove();
|
|
102
|
+
this.updateState(this.activeAdapterId, "inactive");
|
|
103
|
+
}
|
|
104
|
+
const transformedTheme = adapter.transform(this.currentTokens);
|
|
105
|
+
adapter.apply(transformedTheme);
|
|
106
|
+
this.activeAdapterId = adapterId;
|
|
107
|
+
this.updateState(adapterId, "active");
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 获取当前活跃适配器
|
|
112
|
+
* @returns 活跃适配器实例或 undefined
|
|
113
|
+
*/
|
|
114
|
+
getActive() {
|
|
115
|
+
return this.activeAdapterId ? this.adapters.get(this.activeAdapterId) : void 0;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 使用当前活跃适配器转换 Token
|
|
119
|
+
* @param tokens DesignSystem Token
|
|
120
|
+
* @param options 转换选项
|
|
121
|
+
* @returns 转换后的主题配置
|
|
122
|
+
*/
|
|
123
|
+
transform(tokens, options) {
|
|
124
|
+
const adapter = this.getActive();
|
|
125
|
+
if (!adapter) {
|
|
126
|
+
console.warn("[AdapterRegistry] No active adapter, returning raw tokens");
|
|
127
|
+
return tokens;
|
|
128
|
+
}
|
|
129
|
+
return adapter.transform(tokens, options);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 检查是否支持指定目标库
|
|
133
|
+
* @param targetLibrary 目标库标识
|
|
134
|
+
* @returns 是否支持
|
|
135
|
+
*/
|
|
136
|
+
supports(targetLibrary) {
|
|
137
|
+
return Array.from(this.adapters.values()).some(
|
|
138
|
+
(adapter) => adapter.targetLibrary === targetLibrary
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 获取支持指定目标库的所有适配器
|
|
143
|
+
* @param targetLibrary 目标库标识
|
|
144
|
+
* @returns 适配器数组
|
|
145
|
+
*/
|
|
146
|
+
getAdaptersForTarget(targetLibrary) {
|
|
147
|
+
return this.getAll().filter(
|
|
148
|
+
(adapter) => adapter.targetLibrary === targetLibrary
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 设置当前 DesignSystem Token
|
|
153
|
+
* @param tokens DesignSystem 实例
|
|
154
|
+
*/
|
|
155
|
+
setTokens(tokens) {
|
|
156
|
+
this.currentTokens = tokens;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 获取当前 DesignSystem Token
|
|
160
|
+
* @returns 当前 Token
|
|
161
|
+
*/
|
|
162
|
+
getTokens() {
|
|
163
|
+
return this.currentTokens;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 内部方法 - 更新适配器状态
|
|
167
|
+
*/
|
|
168
|
+
updateState(adapterId, status) {
|
|
169
|
+
const state = this.states.get(adapterId);
|
|
170
|
+
if (state) {
|
|
171
|
+
state.status = status;
|
|
172
|
+
if (status === "active") {
|
|
173
|
+
state.activatedAt = /* @__PURE__ */ new Date();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var adapterRegistry = new AdapterRegistry();
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
BaseAdapter,
|
|
182
|
+
AdapterRegistry,
|
|
183
|
+
adapterRegistry
|
|
184
|
+
};
|