@zhin.js/core 1.0.24 → 1.0.26
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/CHANGELOG.md +22 -0
- package/README.md +84 -342
- package/lib/adapter.d.ts +45 -1
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +182 -1
- package/lib/adapter.js.map +1 -1
- package/lib/ai/agent.d.ts +126 -0
- package/lib/ai/agent.d.ts.map +1 -0
- package/lib/ai/agent.js +645 -0
- package/lib/ai/agent.js.map +1 -0
- package/lib/ai/context-manager.d.ts +213 -0
- package/lib/ai/context-manager.d.ts.map +1 -0
- package/lib/ai/context-manager.js +313 -0
- package/lib/ai/context-manager.js.map +1 -0
- package/lib/ai/conversation-memory.d.ts +181 -0
- package/lib/ai/conversation-memory.d.ts.map +1 -0
- package/lib/ai/conversation-memory.js +581 -0
- package/lib/ai/conversation-memory.js.map +1 -0
- package/lib/ai/follow-up.d.ts +131 -0
- package/lib/ai/follow-up.d.ts.map +1 -0
- package/lib/ai/follow-up.js +265 -0
- package/lib/ai/follow-up.js.map +1 -0
- package/lib/ai/index.d.ts +29 -0
- package/lib/ai/index.d.ts.map +1 -0
- package/lib/ai/index.js +34 -0
- package/lib/ai/index.js.map +1 -0
- package/lib/ai/init.d.ts +30 -0
- package/lib/ai/init.d.ts.map +1 -0
- package/lib/ai/init.js +424 -0
- package/lib/ai/init.js.map +1 -0
- package/lib/ai/output.d.ts +93 -0
- package/lib/ai/output.d.ts.map +1 -0
- package/lib/ai/output.js +176 -0
- package/lib/ai/output.js.map +1 -0
- package/lib/ai/providers/anthropic.d.ts +23 -0
- package/lib/ai/providers/anthropic.d.ts.map +1 -0
- package/lib/ai/providers/anthropic.js +322 -0
- package/lib/ai/providers/anthropic.js.map +1 -0
- package/lib/ai/providers/base.d.ts +43 -0
- package/lib/ai/providers/base.d.ts.map +1 -0
- package/lib/ai/providers/base.js +135 -0
- package/lib/ai/providers/base.js.map +1 -0
- package/lib/ai/providers/index.d.ts +12 -0
- package/lib/ai/providers/index.d.ts.map +1 -0
- package/lib/ai/providers/index.js +9 -0
- package/lib/ai/providers/index.js.map +1 -0
- package/lib/ai/providers/ollama.d.ts +25 -0
- package/lib/ai/providers/ollama.d.ts.map +1 -0
- package/lib/ai/providers/ollama.js +243 -0
- package/lib/ai/providers/ollama.js.map +1 -0
- package/lib/ai/providers/openai.d.ts +46 -0
- package/lib/ai/providers/openai.d.ts.map +1 -0
- package/lib/ai/providers/openai.js +132 -0
- package/lib/ai/providers/openai.js.map +1 -0
- package/lib/ai/rate-limiter.d.ts +38 -0
- package/lib/ai/rate-limiter.d.ts.map +1 -0
- package/lib/ai/rate-limiter.js +86 -0
- package/lib/ai/rate-limiter.js.map +1 -0
- package/lib/ai/service.d.ts +81 -0
- package/lib/ai/service.d.ts.map +1 -0
- package/lib/ai/service.js +274 -0
- package/lib/ai/service.js.map +1 -0
- package/lib/ai/session.d.ts +186 -0
- package/lib/ai/session.d.ts.map +1 -0
- package/lib/ai/session.js +443 -0
- package/lib/ai/session.js.map +1 -0
- package/lib/ai/tone-detector.d.ts +19 -0
- package/lib/ai/tone-detector.d.ts.map +1 -0
- package/lib/ai/tone-detector.js +72 -0
- package/lib/ai/tone-detector.js.map +1 -0
- package/lib/ai/tools.d.ts +45 -0
- package/lib/ai/tools.d.ts.map +1 -0
- package/lib/ai/tools.js +206 -0
- package/lib/ai/tools.js.map +1 -0
- package/lib/ai/types.d.ts +264 -0
- package/lib/ai/types.d.ts.map +1 -0
- package/lib/ai/types.js +6 -0
- package/lib/ai/types.js.map +1 -0
- package/lib/ai/user-profile.d.ts +56 -0
- package/lib/ai/user-profile.d.ts.map +1 -0
- package/lib/ai/user-profile.js +130 -0
- package/lib/ai/user-profile.js.map +1 -0
- package/lib/ai/zhin-agent.d.ts +165 -0
- package/lib/ai/zhin-agent.d.ts.map +1 -0
- package/lib/ai/zhin-agent.js +707 -0
- package/lib/ai/zhin-agent.js.map +1 -0
- package/lib/built/adapter-process.d.ts +4 -0
- package/lib/built/adapter-process.d.ts.map +1 -1
- package/lib/built/adapter-process.js +94 -0
- package/lib/built/adapter-process.js.map +1 -1
- package/lib/built/ai-trigger.d.ts +89 -0
- package/lib/built/ai-trigger.d.ts.map +1 -0
- package/lib/built/ai-trigger.js +166 -0
- package/lib/built/ai-trigger.js.map +1 -0
- package/lib/built/command.d.ts +33 -17
- package/lib/built/command.d.ts.map +1 -1
- package/lib/built/command.js +71 -44
- package/lib/built/command.js.map +1 -1
- package/lib/built/component.d.ts +42 -15
- package/lib/built/component.d.ts.map +1 -1
- package/lib/built/component.js +84 -52
- package/lib/built/component.js.map +1 -1
- package/lib/built/config.d.ts +54 -5
- package/lib/built/config.d.ts.map +1 -1
- package/lib/built/config.js +76 -10
- package/lib/built/config.js.map +1 -1
- package/lib/built/cron.d.ts +41 -18
- package/lib/built/cron.d.ts.map +1 -1
- package/lib/built/cron.js +106 -63
- package/lib/built/cron.js.map +1 -1
- package/lib/built/database.d.ts +55 -6
- package/lib/built/database.d.ts.map +1 -1
- package/lib/built/database.js +93 -22
- package/lib/built/database.js.map +1 -1
- package/lib/built/dispatcher.d.ts +118 -0
- package/lib/built/dispatcher.d.ts.map +1 -0
- package/lib/built/dispatcher.js +196 -0
- package/lib/built/dispatcher.js.map +1 -0
- package/lib/built/permission.d.ts +45 -5
- package/lib/built/permission.d.ts.map +1 -1
- package/lib/built/permission.js +56 -11
- package/lib/built/permission.js.map +1 -1
- package/lib/built/skill.d.ts +117 -0
- package/lib/built/skill.d.ts.map +1 -0
- package/lib/built/skill.js +191 -0
- package/lib/built/skill.js.map +1 -0
- package/lib/built/tool.d.ts +188 -0
- package/lib/built/tool.d.ts.map +1 -0
- package/lib/built/tool.js +749 -0
- package/lib/built/tool.js.map +1 -0
- package/lib/feature.d.ts +75 -0
- package/lib/feature.d.ts.map +1 -0
- package/lib/feature.js +69 -0
- package/lib/feature.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -1
- package/lib/plugin.d.ts +53 -18
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +301 -31
- package/lib/plugin.js.map +1 -1
- package/lib/types.d.ts +248 -9
- package/lib/types.d.ts.map +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +38 -12
- package/lib/utils.js.map +1 -1
- package/package.json +4 -4
- package/src/adapter.ts +206 -2
- package/src/ai/agent.ts +772 -0
- package/src/ai/context-manager.ts +440 -0
- package/src/ai/conversation-memory.ts +774 -0
- package/src/ai/follow-up.ts +357 -0
- package/src/ai/index.ts +128 -0
- package/src/ai/init.ts +502 -0
- package/src/ai/output.ts +261 -0
- package/src/ai/providers/anthropic.ts +375 -0
- package/src/ai/providers/base.ts +173 -0
- package/src/ai/providers/index.ts +13 -0
- package/src/ai/providers/ollama.ts +292 -0
- package/src/ai/providers/openai.ts +167 -0
- package/src/ai/rate-limiter.ts +129 -0
- package/src/ai/service.ts +319 -0
- package/src/ai/session.ts +544 -0
- package/src/ai/tone-detector.ts +89 -0
- package/src/ai/tools.ts +218 -0
- package/src/ai/types.ts +296 -0
- package/src/ai/user-profile.ts +181 -0
- package/src/ai/zhin-agent.ts +845 -0
- package/src/built/adapter-process.ts +99 -0
- package/src/built/ai-trigger.ts +259 -0
- package/src/built/command.ts +75 -69
- package/src/built/component.ts +94 -76
- package/src/built/config.ts +238 -128
- package/src/built/cron.ts +117 -101
- package/src/built/database.ts +128 -33
- package/src/built/dispatcher.ts +332 -0
- package/src/built/permission.ts +146 -54
- package/src/built/skill.ts +280 -0
- package/src/built/tool.ts +928 -0
- package/src/feature.ts +113 -0
- package/src/index.ts +11 -0
- package/src/plugin.ts +359 -69
- package/src/types.ts +306 -11
- package/src/utils.ts +37 -13
- package/tests/adapter.test.ts +153 -1
- package/tests/ai/agent.test.ts +614 -0
- package/tests/ai/ai-trigger.test.ts +368 -0
- package/tests/ai/context-manager.test.ts +413 -0
- package/tests/ai/conversation-memory.test.ts +128 -0
- package/tests/ai/follow-up.test.ts +175 -0
- package/tests/ai/integration.test.ts +584 -0
- package/tests/ai/output.test.ts +128 -0
- package/tests/ai/providers.integration.test.ts +227 -0
- package/tests/ai/rate-limiter.test.ts +108 -0
- package/tests/ai/session.test.ts +375 -0
- package/tests/ai/setup.ts +308 -0
- package/tests/ai/tone-detector.test.ts +80 -0
- package/tests/ai/tool.test.ts +800 -0
- package/tests/ai/tools-builtin.test.ts +346 -0
- package/tests/ai/user-profile.test.ts +73 -0
- package/tests/ai/zhin-agent.test.ts +177 -0
- package/tests/component-new.test.ts +17 -6
- package/tests/config.test.ts +46 -0
- package/tests/cron.test.ts +94 -5
- package/tests/dispatcher.test.ts +146 -0
- package/tests/feature.test.ts +145 -0
- package/tests/features-builtin.test.ts +191 -0
- package/tests/plugin.test.ts +88 -14
- package/tests/skill-feature.test.ts +179 -0
- package/tests/tool-feature.test.ts +254 -0
package/lib/built/command.js
CHANGED
|
@@ -1,54 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandFeature
|
|
3
|
+
* 管理所有插件注册的命令,继承自 Feature 抽象类
|
|
4
|
+
*/
|
|
5
|
+
import { Feature } from "../feature.js";
|
|
1
6
|
import { getPlugin } from "../plugin.js";
|
|
2
7
|
/**
|
|
3
|
-
*
|
|
8
|
+
* 命令服务 Feature
|
|
4
9
|
*/
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
10
|
+
export class CommandFeature extends Feature {
|
|
11
|
+
name = 'command';
|
|
12
|
+
icon = 'Terminal';
|
|
13
|
+
desc = '命令';
|
|
14
|
+
/** 按 pattern 索引 */
|
|
15
|
+
byName = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* 添加命令
|
|
18
|
+
*/
|
|
19
|
+
add(command, pluginName) {
|
|
20
|
+
this.byName.set(command.pattern, command);
|
|
21
|
+
return super.add(command, pluginName);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 移除命令
|
|
25
|
+
*/
|
|
26
|
+
remove(command) {
|
|
27
|
+
this.byName.delete(command.pattern);
|
|
28
|
+
return super.remove(command);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 按 pattern 获取命令
|
|
32
|
+
*/
|
|
33
|
+
get(pattern) {
|
|
34
|
+
return this.byName.get(pattern);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 处理消息,依次尝试匹配命令
|
|
38
|
+
*/
|
|
39
|
+
async handle(message, plugin) {
|
|
40
|
+
for (const command of this.items) {
|
|
41
|
+
const result = await command.handle(message, plugin);
|
|
42
|
+
if (result)
|
|
43
|
+
return result;
|
|
38
44
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 序列化为 JSON
|
|
49
|
+
*/
|
|
50
|
+
toJSON(pluginName) {
|
|
51
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
52
|
+
return {
|
|
53
|
+
name: this.name,
|
|
54
|
+
icon: this.icon,
|
|
55
|
+
desc: this.desc,
|
|
56
|
+
count: list.length,
|
|
57
|
+
items: list.map(c => ({
|
|
58
|
+
name: c.pattern,
|
|
59
|
+
desc: c.helpInfo?.desc,
|
|
60
|
+
usage: c.helpInfo?.usage,
|
|
61
|
+
examples: c.helpInfo?.examples,
|
|
62
|
+
})),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
67
|
+
*/
|
|
68
|
+
get extensions() {
|
|
69
|
+
const feature = this;
|
|
70
|
+
return {
|
|
45
71
|
addCommand(command) {
|
|
46
72
|
const plugin = getPlugin();
|
|
47
|
-
const dispose =
|
|
73
|
+
const dispose = feature.add(command, plugin.name);
|
|
74
|
+
plugin.recordFeatureContribution(feature.name, command.pattern);
|
|
48
75
|
plugin.onDispose(dispose);
|
|
49
76
|
return dispose;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
53
80
|
}
|
|
54
81
|
//# sourceMappingURL=command.js.map
|
package/lib/built/command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/built/command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/built/command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAU,SAAS,EAAE,MAAM,cAAc,CAAC;AAqBjD;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAA0C;IACnE,IAAI,GAAG,SAAkB,CAAC;IAC1B,IAAI,GAAG,UAAU,CAAC;IAClB,IAAI,GAAG,IAAI,CAAC;IAErB,mBAAmB;IACV,MAAM,GAAG,IAAI,GAAG,EAA6C,CAAC;IAEvE;;OAEG;IACH,GAAG,CAAC,OAA0C,EAAE,UAAkB;QAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAA0C;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAmD,EAAE,MAAc;QAC9E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAmB;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,IAAI,EAAE,CAAC,CAAC,OAAO;gBACf,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI;gBACtB,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK;gBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ;aAC/B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO;YACL,UAAU,CAA8B,OAA0B;gBAChE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvF,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBAChE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
package/lib/built/component.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* ComponentFeature
|
|
3
|
+
* 管理所有插件注册的组件,继承自 Feature 抽象类
|
|
4
4
|
*/
|
|
5
|
+
import { Feature, FeatureJSON } from "../feature.js";
|
|
5
6
|
import { Component } from "../component.js";
|
|
6
|
-
import {
|
|
7
|
+
import { Plugin } from "../plugin.js";
|
|
7
8
|
/**
|
|
8
9
|
* ComponentContext 扩展方法类型
|
|
9
10
|
*/
|
|
@@ -16,27 +17,53 @@ declare module "../plugin.js" {
|
|
|
16
17
|
interface Extensions extends ComponentContextExtensions {
|
|
17
18
|
}
|
|
18
19
|
interface Contexts {
|
|
19
|
-
component:
|
|
20
|
+
component: ComponentFeature;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
|
-
*
|
|
25
|
+
* 组件服务 Feature
|
|
25
26
|
*/
|
|
26
|
-
export
|
|
27
|
+
export declare class ComponentFeature extends Feature<Component<any>> {
|
|
28
|
+
#private;
|
|
29
|
+
readonly name: "component";
|
|
30
|
+
readonly icon = "Box";
|
|
31
|
+
readonly desc = "\u7EC4\u4EF6";
|
|
27
32
|
/** 按名称索引 */
|
|
28
33
|
readonly byName: Map<string, Component<any>>;
|
|
29
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* 添加组件
|
|
36
|
+
*/
|
|
30
37
|
add(component: Component<any>, pluginName: string): () => void;
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
/**
|
|
39
|
+
* 移除组件
|
|
40
|
+
*/
|
|
34
41
|
remove(component: Component<any>): boolean;
|
|
35
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* 获取所有组件名称
|
|
44
|
+
*/
|
|
45
|
+
getAllNames(): string[];
|
|
46
|
+
/**
|
|
47
|
+
* 按名称获取组件
|
|
48
|
+
*/
|
|
36
49
|
get(name: string): Component<any> | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* 生命周期: 挂载时注册消息渲染监听器
|
|
52
|
+
*/
|
|
53
|
+
mounted(plugin: Plugin): void;
|
|
54
|
+
/**
|
|
55
|
+
* 生命周期: 销毁时移除监听器
|
|
56
|
+
*/
|
|
57
|
+
dispose(): void;
|
|
58
|
+
/**
|
|
59
|
+
* 序列化为 JSON
|
|
60
|
+
*/
|
|
61
|
+
toJSON(pluginName?: string): FeatureJSON;
|
|
62
|
+
/**
|
|
63
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
64
|
+
*/
|
|
65
|
+
get extensions(): {
|
|
66
|
+
addComponent<T extends Component<any>>(component: T): () => void;
|
|
67
|
+
};
|
|
37
68
|
}
|
|
38
|
-
/**
|
|
39
|
-
* 创建组件 Context
|
|
40
|
-
*/
|
|
41
|
-
export declare function createComponentService(): Context<'component', ComponentContextExtensions>;
|
|
42
69
|
//# sourceMappingURL=component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAa,MAAM,cAAc,CAAC;AAIjD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW;IACX,YAAY,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;CAClE;AAGD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,0BAA0B;SAAG;QAC1D,UAAU,QAAQ;YAChB,SAAS,EAAE,gBAAgB,CAAC;SAC7B;KACF;CACF;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;;IAC3D,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,IAAI,kBAAQ;IAErB,YAAY;IACZ,QAAQ,CAAC,MAAM,8BAAqC;IAMpD;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI;IAK9D;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO;IAK1C;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAI7C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAcxC;;OAEG;IACH,IAAI,UAAU;qBAGG,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,SAvEG,IAAI;MA+E7D;CACF"}
|
package/lib/built/component.js
CHANGED
|
@@ -1,65 +1,97 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* ComponentFeature
|
|
3
|
+
* 管理所有插件注册的组件,继承自 Feature 抽象类
|
|
4
4
|
*/
|
|
5
|
+
import { Feature } from "../feature.js";
|
|
5
6
|
import { renderComponents } from "../component.js";
|
|
6
7
|
import { getPlugin } from "../plugin.js";
|
|
7
8
|
/**
|
|
8
|
-
*
|
|
9
|
+
* 组件服务 Feature
|
|
9
10
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
11
|
+
export class ComponentFeature extends Feature {
|
|
12
|
+
name = 'component';
|
|
13
|
+
icon = 'Box';
|
|
14
|
+
desc = '组件';
|
|
15
|
+
/** 按名称索引 */
|
|
16
|
+
byName = new Map();
|
|
17
|
+
/** 内部状态:消息渲染监听器 & 宿主插件 */
|
|
18
|
+
#listener;
|
|
19
|
+
#rootPlugin;
|
|
20
|
+
/**
|
|
21
|
+
* 添加组件
|
|
22
|
+
*/
|
|
23
|
+
add(component, pluginName) {
|
|
24
|
+
this.byName.set(component.name, component);
|
|
25
|
+
return super.add(component, pluginName);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 移除组件
|
|
29
|
+
*/
|
|
30
|
+
remove(component) {
|
|
31
|
+
this.byName.delete(component.name);
|
|
32
|
+
return super.remove(component);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 获取所有组件名称
|
|
36
|
+
*/
|
|
37
|
+
getAllNames() {
|
|
38
|
+
return Array.from(this.byName.keys());
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 按名称获取组件
|
|
42
|
+
*/
|
|
43
|
+
get(name) {
|
|
44
|
+
return this.byName.get(name);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 生命周期: 挂载时注册消息渲染监听器
|
|
48
|
+
*/
|
|
49
|
+
mounted(plugin) {
|
|
50
|
+
this.#rootPlugin = plugin;
|
|
51
|
+
this.#listener = (options) => {
|
|
52
|
+
return renderComponents(this.byName, options);
|
|
53
|
+
};
|
|
54
|
+
plugin.root.on('before.sendMessage', this.#listener);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 生命周期: 销毁时移除监听器
|
|
58
|
+
*/
|
|
59
|
+
dispose() {
|
|
60
|
+
if (this.#listener && this.#rootPlugin) {
|
|
61
|
+
this.#rootPlugin.root.off('before.sendMessage', this.#listener);
|
|
62
|
+
this.#listener = undefined;
|
|
35
63
|
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 序列化为 JSON
|
|
67
|
+
*/
|
|
68
|
+
toJSON(pluginName) {
|
|
69
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
70
|
+
return {
|
|
71
|
+
name: this.name,
|
|
72
|
+
icon: this.icon,
|
|
73
|
+
desc: this.desc,
|
|
74
|
+
count: list.length,
|
|
75
|
+
items: list.map(c => ({
|
|
76
|
+
name: c.name,
|
|
77
|
+
type: 'component',
|
|
78
|
+
})),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
83
|
+
*/
|
|
84
|
+
get extensions() {
|
|
85
|
+
const feature = this;
|
|
86
|
+
return {
|
|
56
87
|
addComponent(component) {
|
|
57
88
|
const plugin = getPlugin();
|
|
58
|
-
const dispose =
|
|
89
|
+
const dispose = feature.add(component, plugin.name);
|
|
90
|
+
plugin.recordFeatureContribution(feature.name, component.name);
|
|
59
91
|
plugin.onDispose(dispose);
|
|
60
92
|
return dispose;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
64
96
|
}
|
|
65
97
|
//# sourceMappingURL=component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAa,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,eAAe,CAAC;AACrD,OAAO,EAAa,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAU,SAAS,EAAE,MAAM,cAAc,CAAC;AAsBjD;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,OAAuB;IAClD,IAAI,GAAG,WAAoB,CAAC;IAC5B,IAAI,GAAG,KAAK,CAAC;IACb,IAAI,GAAG,IAAI,CAAC;IAErB,YAAY;IACH,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEpD,0BAA0B;IAC1B,SAAS,CAAY;IACrB,WAAW,CAAU;IAErB;;OAEG;IACH,GAAG,CAAC,SAAyB,EAAE,UAAkB;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAyB;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAc;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,CAAC,OAAoB,EAAE,EAAE;YACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAmB;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO;YACL,YAAY,CAA2B,SAAY;gBACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC/D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
package/lib/built/config.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Schema } from "@zhin.js/schema";
|
|
2
|
+
import { Feature, FeatureJSON } from "../feature.js";
|
|
2
3
|
export declare class ConfigLoader<T extends object> {
|
|
3
4
|
#private;
|
|
4
5
|
filename: string;
|
|
@@ -15,17 +16,65 @@ export declare namespace ConfigLoader {
|
|
|
15
16
|
const supportedExtensions: string[];
|
|
16
17
|
function load<T extends object>(filename: string, initial?: T, schema?: Schema<T>): ConfigLoader<T>;
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
/**
|
|
20
|
+
* 配置项声明记录
|
|
21
|
+
*/
|
|
22
|
+
export interface ConfigRecord {
|
|
23
|
+
key: string;
|
|
24
|
+
defaultValue: any;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ConfigFeature 扩展方法类型
|
|
28
|
+
*/
|
|
29
|
+
export interface ConfigContextExtensions {
|
|
30
|
+
/** 声明插件配置项(key + 默认值),如果配置文件中不存在则写入默认值 */
|
|
31
|
+
addConfig(key: string, defaultValue: any): () => void;
|
|
32
|
+
}
|
|
33
|
+
declare module "../plugin.js" {
|
|
34
|
+
namespace Plugin {
|
|
35
|
+
interface Extensions extends ConfigContextExtensions {
|
|
36
|
+
}
|
|
37
|
+
interface Contexts {
|
|
38
|
+
config: ConfigFeature;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export declare class ConfigFeature extends Feature<ConfigRecord> {
|
|
43
|
+
#private;
|
|
44
|
+
readonly name: "config";
|
|
45
|
+
readonly icon = "Settings";
|
|
46
|
+
readonly desc = "\u914D\u7F6E";
|
|
47
|
+
/** 内部配置文件管理 */
|
|
48
|
+
readonly configs: Map<string, ConfigLoader<any>>;
|
|
49
|
+
/**
|
|
50
|
+
* 加载配置文件
|
|
51
|
+
*/
|
|
21
52
|
load<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): ConfigLoader<T>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取配置数据(代理模式,自动保存)
|
|
55
|
+
*/
|
|
22
56
|
get<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
|
|
57
|
+
/**
|
|
58
|
+
* 获取原始配置数据
|
|
59
|
+
*/
|
|
23
60
|
getRaw<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
|
|
24
61
|
/**
|
|
25
62
|
* 更新配置文件内容
|
|
26
|
-
* @param filename 配置文件名
|
|
27
|
-
* @param data 新的配置数据
|
|
28
63
|
*/
|
|
29
64
|
set<T extends object>(filename: string, data: T): void;
|
|
65
|
+
/**
|
|
66
|
+
* 序列化为 JSON
|
|
67
|
+
*/
|
|
68
|
+
toJSON(pluginName?: string): FeatureJSON;
|
|
69
|
+
/**
|
|
70
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
71
|
+
*/
|
|
72
|
+
get extensions(): {
|
|
73
|
+
addConfig(key: string, defaultValue: any): () => void;
|
|
74
|
+
};
|
|
30
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* @deprecated Use ConfigFeature instead
|
|
78
|
+
*/
|
|
79
|
+
export declare const ConfigService: typeof ConfigFeature;
|
|
31
80
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOrD,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM;;IAWrB,QAAQ,EAAE,MAAM;IAAS,OAAO,EAAE,CAAC;IAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IATjF,IAAI,IAAI,IAAI,CAAC,CAEZ;IACD,IAAI,GAAG,IAAI,CAAC,CAEX;IACD,IAAI,SAAS,WAEZ;gBACkB,QAAQ,EAAE,MAAM,EAAS,OAAO,EAAE,CAAC,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,YAAA;IA2CjF,IAAI;IAsBJ,IAAI,CAAC,QAAQ,EAAE,MAAM;CAWtB;AAED,yBAAiB,YAAY,CAAC;IACrB,MAAM,mBAAmB,UAA6B,CAAC;IAC9D,SAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,mBAIvF;CACF;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,GAAG,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC;CACvD;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,uBAAuB;SAAG;QACvD,UAAU,QAAQ;YAChB,MAAM,EAAE,aAAa,CAAC;SACvB;KACF;CACF;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;;IACtD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,kBAAQ;IAErB,eAAe;IACf,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAa;IAK7D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAanG;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAOpF;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAOvF;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAOtD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAcxC;;OAEG;IACH,IAAI,UAAU;uBAGK,MAAM,gBAAgB,GAAG;MAsB3C;CACF;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,sBAAgB,CAAC"}
|
package/lib/built/config.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfigFeature
|
|
3
|
+
* 配置管理服务,继承自 Feature 抽象类
|
|
4
|
+
* 保留原有 ConfigLoader / ConfigService 逻辑,增加 addConfig 扩展
|
|
5
|
+
*/
|
|
1
6
|
import path from "node:path";
|
|
2
7
|
import fs from "node:fs";
|
|
3
8
|
import { stringify as stringifyYaml, parse as parseYaml } from "yaml";
|
|
9
|
+
import { Feature } from "../feature.js";
|
|
10
|
+
import { getPlugin } from "../plugin.js";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// ConfigLoader(保持不变)
|
|
13
|
+
// ============================================================================
|
|
4
14
|
export class ConfigLoader {
|
|
5
15
|
filename;
|
|
6
16
|
initial;
|
|
@@ -24,20 +34,16 @@ export class ConfigLoader {
|
|
|
24
34
|
#proxy(data, loader) {
|
|
25
35
|
return new Proxy(data, {
|
|
26
36
|
get(target, prop, receiver) {
|
|
27
|
-
// 对于特殊属性(如 Symbol、prototype 等),直接返回原始值
|
|
28
37
|
if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'prototype') {
|
|
29
38
|
return Reflect.get(target, prop, receiver);
|
|
30
39
|
}
|
|
31
40
|
const result = Reflect.get(target, prop, receiver);
|
|
32
|
-
// 对于函数属性(如数组的 map、filter 等),直接返回,不进行代理
|
|
33
41
|
if (typeof result === 'function') {
|
|
34
42
|
return result;
|
|
35
43
|
}
|
|
36
|
-
// 对于对象和数组,递归代理(但排除函数)
|
|
37
44
|
if (result instanceof Object && result !== null && typeof result !== 'function') {
|
|
38
45
|
return loader.#proxy(result, loader);
|
|
39
46
|
}
|
|
40
|
-
// 处理环境变量占位符
|
|
41
47
|
if (typeof result === 'string') {
|
|
42
48
|
if (result.startsWith('\\${') && result.endsWith('}'))
|
|
43
49
|
return result.slice(1);
|
|
@@ -106,10 +112,17 @@ export class ConfigLoader {
|
|
|
106
112
|
}
|
|
107
113
|
ConfigLoader.load = load;
|
|
108
114
|
})(ConfigLoader || (ConfigLoader = {}));
|
|
109
|
-
export class
|
|
115
|
+
export class ConfigFeature extends Feature {
|
|
116
|
+
name = 'config';
|
|
117
|
+
icon = 'Settings';
|
|
118
|
+
desc = '配置';
|
|
119
|
+
/** 内部配置文件管理 */
|
|
110
120
|
configs = new Map();
|
|
111
|
-
|
|
112
|
-
|
|
121
|
+
/** 主配置文件名(第一个加载的配置文件) */
|
|
122
|
+
#primaryConfigFile = '';
|
|
123
|
+
/**
|
|
124
|
+
* 加载配置文件
|
|
125
|
+
*/
|
|
113
126
|
load(filename, initial, schema) {
|
|
114
127
|
const ext = path.extname(filename).toLowerCase();
|
|
115
128
|
if (!ConfigLoader.supportedExtensions.includes(ext)) {
|
|
@@ -117,8 +130,14 @@ export class ConfigService {
|
|
|
117
130
|
}
|
|
118
131
|
const config = ConfigLoader.load(filename, initial, schema);
|
|
119
132
|
this.configs.set(filename, config);
|
|
133
|
+
if (!this.#primaryConfigFile) {
|
|
134
|
+
this.#primaryConfigFile = filename;
|
|
135
|
+
}
|
|
120
136
|
return config;
|
|
121
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* 获取配置数据(代理模式,自动保存)
|
|
140
|
+
*/
|
|
122
141
|
get(filename, initial, schema) {
|
|
123
142
|
if (!this.configs.has(filename))
|
|
124
143
|
this.load(filename, initial, schema);
|
|
@@ -127,6 +146,9 @@ export class ConfigService {
|
|
|
127
146
|
throw new Error(`配置文件 ${filename} 未加载`);
|
|
128
147
|
return config.data;
|
|
129
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* 获取原始配置数据
|
|
151
|
+
*/
|
|
130
152
|
getRaw(filename, initial, schema) {
|
|
131
153
|
if (!this.configs.has(filename))
|
|
132
154
|
this.load(filename, initial, schema);
|
|
@@ -137,16 +159,60 @@ export class ConfigService {
|
|
|
137
159
|
}
|
|
138
160
|
/**
|
|
139
161
|
* 更新配置文件内容
|
|
140
|
-
* @param filename 配置文件名
|
|
141
|
-
* @param data 新的配置数据
|
|
142
162
|
*/
|
|
143
163
|
set(filename, data) {
|
|
144
164
|
const config = this.configs.get(filename);
|
|
145
165
|
if (!config)
|
|
146
166
|
throw new Error(`配置文件 ${filename} 未加载`);
|
|
147
|
-
// 直接更新内部数据(会触发 Proxy 的 set 拦截器并自动保存)
|
|
148
167
|
Object.assign(config.raw, data);
|
|
149
168
|
config.save(path.resolve(process.cwd(), filename));
|
|
150
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* 序列化为 JSON
|
|
172
|
+
*/
|
|
173
|
+
toJSON(pluginName) {
|
|
174
|
+
const list = pluginName ? this.getByPlugin(pluginName) : this.items;
|
|
175
|
+
return {
|
|
176
|
+
name: this.name,
|
|
177
|
+
icon: this.icon,
|
|
178
|
+
desc: this.desc,
|
|
179
|
+
count: list.length,
|
|
180
|
+
items: list.map(r => ({
|
|
181
|
+
name: r.key,
|
|
182
|
+
// 不暴露 defaultValue 以防止泄露密钥/令牌
|
|
183
|
+
})),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 提供给 Plugin.prototype 的扩展方法
|
|
188
|
+
*/
|
|
189
|
+
get extensions() {
|
|
190
|
+
const feature = this;
|
|
191
|
+
return {
|
|
192
|
+
addConfig(key, defaultValue) {
|
|
193
|
+
const plugin = getPlugin();
|
|
194
|
+
// 尝试写入主配置文件(如果 key 不存在)
|
|
195
|
+
if (feature.#primaryConfigFile) {
|
|
196
|
+
const config = feature.configs.get(feature.#primaryConfigFile);
|
|
197
|
+
if (config) {
|
|
198
|
+
const raw = config.raw;
|
|
199
|
+
if (!(key in raw)) {
|
|
200
|
+
raw[key] = defaultValue;
|
|
201
|
+
config.save(path.resolve(process.cwd(), feature.#primaryConfigFile));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const record = { key, defaultValue };
|
|
206
|
+
const dispose = feature.add(record, plugin.name);
|
|
207
|
+
plugin.recordFeatureContribution(feature.name, key);
|
|
208
|
+
plugin.onDispose(dispose);
|
|
209
|
+
return dispose;
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
151
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* @deprecated Use ConfigFeature instead
|
|
216
|
+
*/
|
|
217
|
+
export const ConfigService = ConfigFeature;
|
|
152
218
|
//# sourceMappingURL=config.js.map
|