@chatbi-v/core 3.0.0 → 3.1.4

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 CHANGED
@@ -32,7 +32,7 @@ pluginManager.register({
32
32
  metadata: { name: 'My Plugin', type: 'business' },
33
33
  onLoad: async (context) => {
34
34
  console.log('Plugin loaded', context.pluginId);
35
- }
35
+ },
36
36
  });
37
37
  ```
38
38
 
@@ -17,16 +17,16 @@ var __copyProps = (to, from, except, desc) => {
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
- // src/adapter/index.ts
21
- var adapter_exports = {};
22
- __export(adapter_exports, {
20
+ // src/adapters/index.ts
21
+ var adapters_exports = {};
22
+ __export(adapters_exports, {
23
23
  AdapterRegistry: () => AdapterRegistry,
24
24
  BaseAdapter: () => BaseAdapter,
25
25
  adapterRegistry: () => adapterRegistry
26
26
  });
27
- module.exports = __toCommonJS(adapter_exports);
27
+ module.exports = __toCommonJS(adapters_exports);
28
28
 
29
- // src/adapter/AdapterInterface.ts
29
+ // src/adapters/AdapterInterface.ts
30
30
  var BaseAdapter = class {
31
31
  /**
32
32
  * 模板方法 - 三层变换默认实现
@@ -48,7 +48,7 @@ var BaseAdapter = class {
48
48
  }
49
49
  };
50
50
 
51
- // src/adapter/AdapterRegistry.ts
51
+ // src/adapters/AdapterRegistry.ts
52
52
  var AdapterRegistry = class {
53
53
  adapters = /* @__PURE__ */ new Map();
54
54
  states = /* @__PURE__ */ new Map();
@@ -60,7 +60,9 @@ var AdapterRegistry = class {
60
60
  */
61
61
  register(adapter) {
62
62
  if (this.adapters.has(adapter.id)) {
63
- console.warn(`[AdapterRegistry] Adapter ${adapter.id} already registered, overwriting`);
63
+ console.warn(
64
+ `[AdapterRegistry] Adapter ${adapter.id} already registered, overwriting`
65
+ );
64
66
  }
65
67
  this.adapters.set(adapter.id, adapter);
66
68
  this.states.set(adapter.id, {
@@ -76,7 +78,9 @@ var AdapterRegistry = class {
76
78
  */
77
79
  unregister(adapterId) {
78
80
  if (this.activeAdapterId === adapterId) {
79
- console.warn(`[AdapterRegistry] Cannot unregister active adapter ${adapterId}`);
81
+ console.warn(
82
+ `[AdapterRegistry] Cannot unregister active adapter ${adapterId}`
83
+ );
80
84
  return false;
81
85
  }
82
86
  const adapter = this.adapters.get(adapterId);
@@ -2,7 +2,7 @@ import {
2
2
  AdapterRegistry,
3
3
  BaseAdapter,
4
4
  adapterRegistry
5
- } from "../chunk-BOR237QK.mjs";
5
+ } from "../chunk-K6BVKKI6.mjs";
6
6
  export {
7
7
  AdapterRegistry,
8
8
  BaseAdapter,
@@ -0,0 +1,60 @@
1
+ // src/semver/SemverResolver.ts
2
+ import semver from "semver";
3
+ function parseVersion(version) {
4
+ const parsed = semver.valid(version);
5
+ if (!parsed) return null;
6
+ const v = new semver.SemVer(version);
7
+ return {
8
+ major: v.major,
9
+ minor: v.minor,
10
+ patch: v.patch,
11
+ prerelease: v.prerelease.map(String),
12
+ build: v.build.map(String),
13
+ version: v.version,
14
+ raw: version
15
+ };
16
+ }
17
+ function parseRange(range) {
18
+ const parsed = semver.validRange(range);
19
+ if (!parsed) return null;
20
+ return new semver.Range(range);
21
+ }
22
+ function isValidVersion(version) {
23
+ return semver.valid(version) !== null;
24
+ }
25
+ function isValidRange(range) {
26
+ return semver.validRange(range) !== null;
27
+ }
28
+ function coerce(version) {
29
+ const coerced = semver.coerce(version);
30
+ if (!coerced) return null;
31
+ return parseVersion(coerced.version);
32
+ }
33
+ function clean(version) {
34
+ return semver.clean(version);
35
+ }
36
+ function compareVersions(v1, v2) {
37
+ return semver.compare(v1, v2);
38
+ }
39
+ function satisfyVersions(range, versions) {
40
+ return versions.filter((v) => semver.satisfies(v, range));
41
+ }
42
+ function maxSatisfying(range, versions) {
43
+ return semver.maxSatisfying(versions, range);
44
+ }
45
+ function minSatisfying(range, versions) {
46
+ return semver.minSatisfying(versions, range);
47
+ }
48
+
49
+ export {
50
+ parseVersion,
51
+ parseRange,
52
+ isValidVersion,
53
+ isValidRange,
54
+ coerce,
55
+ clean,
56
+ compareVersions,
57
+ satisfyVersions,
58
+ maxSatisfying,
59
+ minSatisfying
60
+ };
@@ -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
+ };
@@ -1,4 +1,4 @@
1
- // src/adapter/AdapterInterface.ts
1
+ // src/adapters/AdapterInterface.ts
2
2
  var BaseAdapter = class {
3
3
  /**
4
4
  * 模板方法 - 三层变换默认实现
@@ -20,7 +20,7 @@ var BaseAdapter = class {
20
20
  }
21
21
  };
22
22
 
23
- // src/adapter/AdapterRegistry.ts
23
+ // src/adapters/AdapterRegistry.ts
24
24
  var AdapterRegistry = class {
25
25
  adapters = /* @__PURE__ */ new Map();
26
26
  states = /* @__PURE__ */ new Map();
@@ -32,7 +32,9 @@ var AdapterRegistry = class {
32
32
  */
33
33
  register(adapter) {
34
34
  if (this.adapters.has(adapter.id)) {
35
- console.warn(`[AdapterRegistry] Adapter ${adapter.id} already registered, overwriting`);
35
+ console.warn(
36
+ `[AdapterRegistry] Adapter ${adapter.id} already registered, overwriting`
37
+ );
36
38
  }
37
39
  this.adapters.set(adapter.id, adapter);
38
40
  this.states.set(adapter.id, {
@@ -48,7 +50,9 @@ var AdapterRegistry = class {
48
50
  */
49
51
  unregister(adapterId) {
50
52
  if (this.activeAdapterId === adapterId) {
51
- console.warn(`[AdapterRegistry] Cannot unregister active adapter ${adapterId}`);
53
+ console.warn(
54
+ `[AdapterRegistry] Cannot unregister active adapter ${adapterId}`
55
+ );
52
56
  return false;
53
57
  }
54
58
  const adapter = this.adapters.get(adapterId);