@huanban/rulego-editor-core 1.0.0

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.
Files changed (102) hide show
  1. package/README.md +211 -0
  2. package/dist/api/RuleChainAPI.d.ts +163 -0
  3. package/dist/api/RuleChainAPI.d.ts.map +1 -0
  4. package/dist/api/index.d.ts +15 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/types.d.ts +244 -0
  7. package/dist/api/types.d.ts.map +1 -0
  8. package/dist/core/ComponentRegistry.d.ts +141 -0
  9. package/dist/core/ComponentRegistry.d.ts.map +1 -0
  10. package/dist/core/DataAdapter.d.ts +129 -0
  11. package/dist/core/DataAdapter.d.ts.map +1 -0
  12. package/dist/core/EditorCore.d.ts +251 -0
  13. package/dist/core/EditorCore.d.ts.map +1 -0
  14. package/dist/core/EventBus.d.ts +101 -0
  15. package/dist/core/EventBus.d.ts.map +1 -0
  16. package/dist/core/HistoryManager.d.ts +166 -0
  17. package/dist/core/HistoryManager.d.ts.map +1 -0
  18. package/dist/core/I18nManager.d.ts +130 -0
  19. package/dist/core/I18nManager.d.ts.map +1 -0
  20. package/dist/core/StateStore.d.ts +160 -0
  21. package/dist/core/StateStore.d.ts.map +1 -0
  22. package/dist/core/ThemeManager.d.ts +175 -0
  23. package/dist/core/ThemeManager.d.ts.map +1 -0
  24. package/dist/core/ValidationEngine.d.ts +139 -0
  25. package/dist/core/ValidationEngine.d.ts.map +1 -0
  26. package/dist/core/index.d.ts +30 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/defaults/components.d.ts +30 -0
  29. package/dist/defaults/components.d.ts.map +1 -0
  30. package/dist/defaults/index.d.ts +18 -0
  31. package/dist/defaults/index.d.ts.map +1 -0
  32. package/dist/defaults/locale-en-US.d.ts +26 -0
  33. package/dist/defaults/locale-en-US.d.ts.map +1 -0
  34. package/dist/defaults/locale-zh-CN.d.ts +41 -0
  35. package/dist/defaults/locale-zh-CN.d.ts.map +1 -0
  36. package/dist/iconRegistry.d.ts +17 -0
  37. package/dist/iconRegistry.d.ts.map +1 -0
  38. package/dist/index.cjs.js +2490 -0
  39. package/dist/index.cjs.js.map +1 -0
  40. package/dist/index.d.ts +49 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.esm.js +59608 -0
  43. package/dist/index.esm.js.map +1 -0
  44. package/dist/index.umd.js +2490 -0
  45. package/dist/index.umd.js.map +1 -0
  46. package/dist/standalone/HuanbanRulegoEditor.d.ts +392 -0
  47. package/dist/standalone/HuanbanRulegoEditor.d.ts.map +1 -0
  48. package/dist/standalone/code-editor.d.ts +95 -0
  49. package/dist/standalone/code-editor.d.ts.map +1 -0
  50. package/dist/standalone/custom-nodes.d.ts +26 -0
  51. package/dist/standalone/custom-nodes.d.ts.map +1 -0
  52. package/dist/standalone/editor-chain-info.d.ts +46 -0
  53. package/dist/standalone/editor-chain-info.d.ts.map +1 -0
  54. package/dist/standalone/editor-context-menu.d.ts +21 -0
  55. package/dist/standalone/editor-context-menu.d.ts.map +1 -0
  56. package/dist/standalone/editor-debug-ws.d.ts +170 -0
  57. package/dist/standalone/editor-debug-ws.d.ts.map +1 -0
  58. package/dist/standalone/editor-dialogs.d.ts +73 -0
  59. package/dist/standalone/editor-dialogs.d.ts.map +1 -0
  60. package/dist/standalone/editor-events.d.ts +28 -0
  61. package/dist/standalone/editor-events.d.ts.map +1 -0
  62. package/dist/standalone/editor-property-drawers.d.ts +78 -0
  63. package/dist/standalone/editor-property-drawers.d.ts.map +1 -0
  64. package/dist/standalone/editor-route-settings.d.ts +49 -0
  65. package/dist/standalone/editor-route-settings.d.ts.map +1 -0
  66. package/dist/standalone/editor-sidebar.d.ts +19 -0
  67. package/dist/standalone/editor-sidebar.d.ts.map +1 -0
  68. package/dist/standalone/editor-styles.d.ts +12 -0
  69. package/dist/standalone/editor-styles.d.ts.map +1 -0
  70. package/dist/standalone/editor-toolbar.d.ts +89 -0
  71. package/dist/standalone/editor-toolbar.d.ts.map +1 -0
  72. package/dist/standalone/group-node.d.ts +52 -0
  73. package/dist/standalone/group-node.d.ts.map +1 -0
  74. package/dist/standalone/icon-utils.d.ts +19 -0
  75. package/dist/standalone/icon-utils.d.ts.map +1 -0
  76. package/dist/standalone/index.d.ts +9 -0
  77. package/dist/standalone/index.d.ts.map +1 -0
  78. package/dist/standalone/logger.d.ts +35 -0
  79. package/dist/standalone/logger.d.ts.map +1 -0
  80. package/dist/standalone/node-definitions.d.ts +74 -0
  81. package/dist/standalone/node-definitions.d.ts.map +1 -0
  82. package/dist/standalone/node-views-data.d.ts +21 -0
  83. package/dist/standalone/node-views-data.d.ts.map +1 -0
  84. package/dist/standalone/themes.d.ts +54 -0
  85. package/dist/standalone/themes.d.ts.map +1 -0
  86. package/dist/types/component.d.ts +120 -0
  87. package/dist/types/component.d.ts.map +1 -0
  88. package/dist/types/editor.d.ts +246 -0
  89. package/dist/types/editor.d.ts.map +1 -0
  90. package/dist/types/events.d.ts +199 -0
  91. package/dist/types/events.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +12 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/rule-chain.d.ts +141 -0
  95. package/dist/types/rule-chain.d.ts.map +1 -0
  96. package/dist/utils/helpers.d.ts +100 -0
  97. package/dist/utils/helpers.d.ts.map +1 -0
  98. package/dist/utils/index.d.ts +6 -0
  99. package/dist/utils/index.d.ts.map +1 -0
  100. package/dist/utils/pinyin-search.d.ts +60 -0
  101. package/dist/utils/pinyin-search.d.ts.map +1 -0
  102. package/package.json +70 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * logger.ts
3
+ * =========
4
+ * 功能:编辑器统一调试日志工具
5
+ *
6
+ * 提供带模块前缀的日志输出,通过全局开关控制是否输出。
7
+ * 默认关闭,可通过以下方式开启:
8
+ * 1. 编辑器初始化时设置 opts.debug = true
9
+ * 2. 运行时调用 setDebug(true)
10
+ * 3. URL 参数 ?debug=1
11
+ * 4. localStorage 设置 huanban_debug = '1'
12
+ */
13
+ /**
14
+ * 设置调试模式开关
15
+ * @param enabled - true 开启调试日志, false 关闭
16
+ */
17
+ export declare function setDebug(enabled: boolean): void;
18
+ /**
19
+ * 获取当前调试模式状态
20
+ * @returns 是否开启调试日志
21
+ */
22
+ export declare function isDebug(): boolean;
23
+ /**
24
+ * 输出调试日志 — 仅在 debug 模式下输出
25
+ * @param module - 模块名称,会作为前缀 [module]
26
+ * @param args - 日志内容(与 console.log 参数一致)
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * debugLog('custom-nodes', 'simple-node 注册成功')
31
+ * // 输出: [custom-nodes] simple-node 注册成功
32
+ * ```
33
+ */
34
+ export declare function debugLog(module: string, ...args: any[]): void;
35
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/standalone/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkCH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAG7D"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @file standalone/node-definitions.ts
3
+ * @description 节点组件的分类配置 + 国际化适配器
4
+ *
5
+ * 【架构说明】
6
+ * - 分类配置 (CATEGORY_CONFIG) — 定义各分类的背景色,用于侧边栏渲染
7
+ * - 分类排序 (CATEGORY_ORDER) — 定义分类在侧边栏 / 管理列表中的显示顺序
8
+ * - 分类路径映射 (CATEGORY_PATH_MAP) — 将 github.com/... 长路径映射到简短分类键
9
+ * - 分类工具函数 (getCategoryKey / getCategoryConfig) — 提取和获取分类信息
10
+ * - 国际化适配器 (adapterComponentsLocal) — 将 fallback 翻译应用到组件上
11
+ *
12
+ * 组件的本地化数据 (DEFAULT_NODE_VIEWS) 已拆分到 node-views-data.ts:
13
+ * - 这些数据是**备用默认值**(源自原版 local_zh.js)
14
+ * - 生产环境中,组件定义应由后端 API 动态返回
15
+ * - 仅在 API 数据缺少 label/desc 时作为 fallback
16
+ *
17
+ * 使用方式:
18
+ * import { CATEGORY_CONFIG, getCategoryKey, getCategoryConfig, adapterComponentsLocal } from './node-definitions'
19
+ * import { DEFAULT_NODE_VIEWS } from './node-views-data' // 需要数据时直接引入
20
+ */
21
+ export { DEFAULT_NODE_VIEWS } from './node-views-data';
22
+ /** 分类颜色映射(label 通过 i18n 动态获取) */
23
+ export declare const CATEGORY_CONFIG: Record<string, {
24
+ bg: string;
25
+ }>;
26
+ /**
27
+ * 分类在侧边栏 / 管理列表中的显示顺序
28
+ * 不在此列表中的分类会排到末尾(按字母序)
29
+ *
30
+ * 顺序: 输入端 → 公共 → 过滤器 → 转换器 → 动作
31
+ * → 外部集成 → AI → CI/CD → IoT → 子规则链
32
+ * → 流式计算 → 文件 → 自定义
33
+ */
34
+ export declare const CATEGORY_ORDER: ReadonlyArray<string>;
35
+ /**
36
+ * 长路径分类映射 — 将 github.com/... 等长路径映射到简短分类名
37
+ * 用于 getCategoryKey() 函数提取分类键
38
+ */
39
+ export declare const CATEGORY_PATH_MAP: Record<string, string>;
40
+ /**
41
+ * 从原始 category 字符串提取分类键
42
+ * - 普通分类: 'external/file' → 'external'
43
+ * - 长路径: 'github.com/rulego/rulego-components-ai/ai/action' → 'ai'
44
+ * - stats: 'stats/streamsql' → 'stats'
45
+ * - endpoint: 'endpoint/fasthttp' → 'endpoint'
46
+ *
47
+ * @param rawCat - 原始分类字符串
48
+ * @returns 标准化的分类键
49
+ */
50
+ export declare function getCategoryKey(rawCat: string): string;
51
+ /**
52
+ * 获取分类配置 (未知分类用默认色 #86B4E5FF)
53
+ * @param cat - 分类键
54
+ * @returns 分类配置对象 { bg: 颜色 }
55
+ */
56
+ export declare function getCategoryConfig(cat: string): {
57
+ bg: string;
58
+ };
59
+ /**
60
+ * 组件国际化适配器
61
+ * 将 fallback 翻译数据应用到组件对象上。
62
+ *
63
+ * 工作流程:
64
+ * 1. 后端 API 返回组件数据(包含 type、fields 等)
65
+ * 2. 本函数检查 DEFAULT_NODE_VIEWS 中是否有对应类型的翻译
66
+ * 3. 如有,则覆盖组件的 label、desc、icon
67
+ * 4. 同时递归处理字段级别的翻译(fields 和嵌套 struct 子字段)
68
+ *
69
+ * @param component - 从 API 获取的组件数据
70
+ * @param customViews - 可选,外部传入的自定义本地化定义,优先于默认值
71
+ * 调用方可传入自己的翻译字典来覆盖内置默认值
72
+ */
73
+ export declare function adapterComponentsLocal(component: any, customViews?: Record<string, any>): void;
74
+ //# sourceMappingURL=node-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-definitions.d.ts","sourceRoot":"","sources":["../../src/standalone/node-definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAMtD,iCAAiC;AACjC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAgB1D,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,MAAM,CAchD,CAAA;AAMD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMpD,CAAA;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASrD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM;QAxFM,MAAM;EA0FxD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CA6B9F"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file standalone/node-views-data.ts
3
+ * @description 节点组件本地化默认值 — 纯数据字典
4
+ *
5
+ * 【重要说明】
6
+ * 这些数据是**备用默认值**,主要用于:
7
+ * 1. API 未返回组件 label/desc 时的 fallback 显示
8
+ * 2. 离线模式下的基本功能支持
9
+ * 3. 开发调试时的快速预览
10
+ *
11
+ * 生产环境中,组件定义应由后端 API 动态返回,
12
+ * 编辑器会优先使用 API 数据,仅在缺失时回退到本文件中的定义。
13
+ *
14
+ * 按分类拆分为多个子对象,最终合并导出为 DEFAULT_NODE_VIEWS。
15
+ */
16
+ /**
17
+ * 组件本地化默认值 — 合并所有分类的数据
18
+ * 按分类拆分后通过展开运算符合并
19
+ */
20
+ export declare const DEFAULT_NODE_VIEWS: Record<string, any>;
21
+ //# sourceMappingURL=node-views-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-views-data.d.ts","sourceRoot":"","sources":["../../src/standalone/node-views-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8xBH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAYlD,CAAA"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file standalone/themes.ts
3
+ * @description 编辑器主题定义 — 通过 CSS 自定义属性实现多风格切换
4
+ *
5
+ * 每个主题定义一组 CSS 变量值,覆盖编辑器的颜色、圆角、阴影等视觉属性。
6
+ * 通过在根元素上设置 data-theme="xxx" 来切换主题。
7
+ *
8
+ * 支持的主题:
9
+ * - default: 默认亮色(经典蓝白)
10
+ * - dark: 暗夜模式(深色背景,高对比度)
11
+ * - nature: 自然绿(温暖舒适)
12
+ * - elegant: 优雅紫(精致优雅)
13
+ * - tech: 科技蓝(未来感)
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { THEME_PRESETS, getThemeCSS } from './themes'
18
+ *
19
+ * // 获取所有主题的 CSS 变量定义
20
+ * const css = getThemeCSS()
21
+ * ```
22
+ */
23
+ /** 单个主题的变量定义 */
24
+ export interface ThemeVars {
25
+ /** 主题显示名称(中文) */
26
+ label: string;
27
+ /** 主题显示名称(英文) */
28
+ labelEn: string;
29
+ /** CSS 自定义属性键值对 */
30
+ vars: Record<string, string>;
31
+ }
32
+ /**
33
+ * 预设主题集合
34
+ * key 为主题标识,对应 data-theme 属性值
35
+ */
36
+ export declare const THEME_PRESETS: Record<string, ThemeVars>;
37
+ /**
38
+ * 生成所有主题的 CSS 变量定义字符串
39
+ * 使用 [data-theme="xxx"] 选择器区分不同主题
40
+ * 默认主题同时作为 :root 级别的 fallback
41
+ *
42
+ * @returns 完整的 CSS 变量定义文本
43
+ */
44
+ export declare function getThemeCSS(): string;
45
+ /**
46
+ * 获取主题列表(用于 UI 展示)
47
+ * @param locale 当前语言
48
+ * @returns 主题选项数组
49
+ */
50
+ export declare function getThemeList(locale: string): Array<{
51
+ id: string;
52
+ label: string;
53
+ }>;
54
+ //# sourceMappingURL=themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/standalone/themes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gBAAgB;AAChB,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAmRnD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAgBpC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAMjF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @file component.ts
3
+ * @description 组件定义类型 - 描述编辑器中可使用的节点组件
4
+ *
5
+ * 组件定义包含组件的类型、分类、表单字段、关系类型等信息。
6
+ * 这些定义来源于后端 API (/api/v1/components) 或内置的默认配置。
7
+ *
8
+ * 组件通过 ComponentRegistry 注册到编辑器中,
9
+ * 在侧边栏中按分类分组展示,用户可以拖拽到画布上创建节点。
10
+ */
11
+ /**
12
+ * 字段验证规则
13
+ */
14
+ export interface FieldValidation {
15
+ /** 是否必填 */
16
+ required?: boolean;
17
+ /** 字符串最小长度 */
18
+ minLength?: number;
19
+ /** 字符串最大长度 */
20
+ maxLength?: number;
21
+ /** 正则表达式验证 */
22
+ pattern?: string;
23
+ /** 验证失败提示消息 */
24
+ message?: string;
25
+ }
26
+ /**
27
+ * 组件的表单字段定义
28
+ * 用于动态生成节点属性编辑表单
29
+ */
30
+ export interface ComponentField {
31
+ /** 字段名称 (对应 configuration 中的 key) */
32
+ name: string;
33
+ /** 字段类型 (string, int, bool, select, code 等) */
34
+ type: string;
35
+ /** 默认值 */
36
+ defaultValue: unknown;
37
+ /** 显示标签 */
38
+ label: string;
39
+ /** 字段描述/提示文本 */
40
+ desc: string;
41
+ /** 验证规则 (字符串格式, 旧版兼容; 或 FieldValidation 对象) */
42
+ validate: string | FieldValidation;
43
+ /** 嵌套子字段 (用于复合类型) */
44
+ fields: ComponentField[] | null;
45
+ /** 下拉选项列表 (当 type 为 select 时) */
46
+ options?: Array<{
47
+ label: string;
48
+ value: string;
49
+ }>;
50
+ }
51
+ /**
52
+ * 组件分类常量
53
+ */
54
+ export type ComponentCategory = 'filter' | 'transform' | 'action' | 'external' | 'flow' | string;
55
+ /**
56
+ * 单个组件的完整定义
57
+ * 描述一个可在编辑器中使用的节点类型
58
+ *
59
+ * @example
60
+ * ```json
61
+ * {
62
+ * "type": "jsFilter",
63
+ * "category": "filter",
64
+ * "label": "JS过滤器",
65
+ * "desc": "使用 JavaScript 过滤消息",
66
+ * "icon": "filter-icon",
67
+ * "fields": [...],
68
+ * "relationTypes": ["True", "False", "Failure"]
69
+ * }
70
+ * ```
71
+ */
72
+ export interface ComponentDefinition {
73
+ /** 组件类型标识 (唯一, 如 jsFilter, restApiCall) */
74
+ type: string;
75
+ /** 所属分类 */
76
+ category: ComponentCategory;
77
+ /** 显示标签 */
78
+ label: string;
79
+ /** 组件描述 */
80
+ desc: string;
81
+ /** 图标名称或路径 */
82
+ icon: string;
83
+ /** 表单字段列表 */
84
+ fields: ComponentField[] | null;
85
+ /** 允许的关系类型 (如 True/False/Success/Failure) */
86
+ relationTypes: string[];
87
+ /** 组件颜色 (可选, 用于自定义节点颜色) */
88
+ color?: string;
89
+ }
90
+ /**
91
+ * 组件分组
92
+ * 按分类组织的组件集合,用于侧边栏展示
93
+ */
94
+ export interface ComponentGroup {
95
+ /** 分类标识 */
96
+ category: string;
97
+ /** 分类显示名称 */
98
+ label: string;
99
+ /** 分类颜色 */
100
+ color: string;
101
+ /** 分类图标 */
102
+ icon?: string;
103
+ /** 该分类下的组件列表 */
104
+ components: ComponentDefinition[];
105
+ }
106
+ /**
107
+ * 从后端 API 返回的原始组件数据
108
+ * 可能需要经过 adapterComponents 转换后才能使用
109
+ */
110
+ export type RawComponentData = ComponentDefinition[];
111
+ /**
112
+ * 组件注册表选项
113
+ */
114
+ export interface ComponentRegistryOptions {
115
+ /** 初始组件列表 */
116
+ components?: ComponentDefinition[];
117
+ /** 自定义组件适配器 (将后端数据转为标准格式) */
118
+ adapter?: (data: RawComponentData) => ComponentGroup[];
119
+ }
120
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/types/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU;IACV,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAA;IAClC,qBAAqB;IACrB,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IAC/B,iCAAiC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAMD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,GACV,MAAM,GACN,MAAM,CAAA;AAEV;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa;IACb,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IAC/B,6CAA6C;IAC7C,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB;IAChB,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,aAAa;IACb,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAClC,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,cAAc,EAAE,CAAA;CACvD"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @file editor.ts
3
+ * @description 编辑器选项、状态和配置的类型定义
4
+ *
5
+ * 定义了编辑器初始化选项、运行时状态、工具栏配置、
6
+ * API 端点配置等核心类型。这些类型在 EditorCore 和各适配器中通用。
7
+ */
8
+ import type { RuleChainConfig, RuleNodeConfig, RuleConnectionConfig, RuleChainData } from './rule-chain';
9
+ import type { ComponentDefinition, ComponentGroup, RawComponentData } from './component';
10
+ /**
11
+ * 后端 API 端点配置
12
+ * 支持 :id 和 :chainId 等路径参数替换
13
+ */
14
+ export interface ApiEndpoints {
15
+ /** 组件列表接口 (默认: /api/v1/components) */
16
+ componentsApi: string;
17
+ /** 规则链保存/加载接口 (默认: /api/v1/rule/:id) */
18
+ ruleApi: string;
19
+ /** 调试数据接口 (默认: /api/v1/event/debug) */
20
+ debugDataApi: string;
21
+ /** 消息发送接口 (默认: /api/v1/msg/:chainId/:msgType) */
22
+ msgApi: string;
23
+ }
24
+ /**
25
+ * 通用 HTTP 请求配置
26
+ * 统一所有 API 调用的请求行为
27
+ */
28
+ export interface RequestConfig {
29
+ /** 后端 API 基础 URL (默认: http://127.0.0.1:9090) */
30
+ baseUrl: string;
31
+ /** 请求超时时间 (毫秒, 默认: 8000) */
32
+ timeout: number;
33
+ /** 自定义请求头 */
34
+ headers?: Record<string, string>;
35
+ /** 自定义 fetch 实现 (可用于注入认证 token 等) */
36
+ fetchImpl?: typeof fetch;
37
+ }
38
+ /**
39
+ * 工具栏按钮显示配置
40
+ */
41
+ export interface ToolbarConfig {
42
+ /** 显示测试按钮 */
43
+ showTest: boolean;
44
+ /** 显示新建/打开按钮 */
45
+ showNewOrOpen: boolean;
46
+ /** 显示数据查看按钮 */
47
+ showData: boolean;
48
+ /** 显示设置按钮 */
49
+ showSetting: boolean;
50
+ /** 显示文档按钮 */
51
+ showDoc: boolean;
52
+ /** 显示全屏按钮 */
53
+ showFullScreen: boolean;
54
+ /** 显示保存按钮 */
55
+ showSave: boolean;
56
+ /** 显示重置按钮 */
57
+ showReset: boolean;
58
+ /** 显示删除按钮 */
59
+ showDelete: boolean;
60
+ }
61
+ /**
62
+ * 画布网格配置
63
+ */
64
+ export interface GridConfig {
65
+ /** 是否显示网格 */
66
+ visible: boolean;
67
+ /** 网格类型 (mesh 或 dot) */
68
+ type: 'mesh' | 'dot';
69
+ /** 网格大小 */
70
+ size: number;
71
+ /** 网格颜色配置 */
72
+ config: {
73
+ color: string;
74
+ };
75
+ }
76
+ /**
77
+ * 编辑器初始化选项
78
+ * 创建编辑器实例时传入,合并默认值后使用
79
+ */
80
+ export interface EditorOptions {
81
+ /** 编辑器挂载的 DOM 容器 (CSS 选择器或 HTMLElement) */
82
+ container?: string | HTMLElement;
83
+ /** 后端 API 基础 URL */
84
+ url?: string;
85
+ /** API 端点配置 */
86
+ endpoints?: Partial<ApiEndpoints>;
87
+ /** HTTP 请求配置 */
88
+ request?: Partial<RequestConfig>;
89
+ /** 工具栏配置 */
90
+ toolbar?: Partial<ToolbarConfig>;
91
+ /** 画布网格配置 */
92
+ grid?: Partial<GridConfig>;
93
+ /** 起始节点的 X 坐标 (默认: 280) */
94
+ startX?: number;
95
+ /** 起始节点的 Y 坐标 (默认: 280) */
96
+ startY?: number;
97
+ /** 预加载的组件列表 (如果提供则不从 API 加载) */
98
+ components?: ComponentDefinition[];
99
+ /** 组件列表格式转换函数 */
100
+ adapterComponents?: (data: RawComponentData) => ComponentGroup[];
101
+ /** 初始规则链数据 (如果提供则直接渲染) */
102
+ data?: RuleChainData;
103
+ /** 初始规则链配置 */
104
+ ruleChain?: RuleChainConfig;
105
+ /** 是否为 headless 模式 (不渲染内置 UI) */
106
+ headless?: boolean;
107
+ /** 是否允许编辑 (只读模式) */
108
+ readonly?: boolean;
109
+ /** 是否允许拖动画布 */
110
+ stopMoveGraph?: boolean;
111
+ /** 是否显示悬停轮廓 */
112
+ hoverOutline?: boolean;
113
+ /** 是否调整边 */
114
+ adjustEdge?: boolean;
115
+ /** 是否调整边的起终点 */
116
+ adjustEdgeStartAndEnd?: boolean;
117
+ /** 是否允许双击编辑文本 */
118
+ textEdit?: boolean;
119
+ /** 撤销/重做最大步数 (默认: 50) */
120
+ maxHistory?: number;
121
+ /** 语言 (默认: zh-CN) */
122
+ locale?: string;
123
+ /** 自定义 ID 生成器 */
124
+ idGenerator?: (type: string) => string;
125
+ /** 主题名称 (内置: 'light' | 'dark' | 'blue', 也可传入自定义主题名) */
126
+ theme?: string;
127
+ /** 编辑器插件列表 */
128
+ plugins?: EditorPlugin[];
129
+ }
130
+ /**
131
+ * 面板显示状态枚举
132
+ */
133
+ export type PanelType = 'none' | 'node-add' | 'node-edit' | 'edge-add' | 'edge-edit';
134
+ /**
135
+ * 编辑器运行时状态
136
+ * 由 StateStore 管理,供 UI 层订阅消费
137
+ */
138
+ export interface EditorState {
139
+ /** 编辑器是否已就绪 */
140
+ isReady: boolean;
141
+ /** 数据是否已修改 (有未保存的更改) */
142
+ isDirty: boolean;
143
+ /** 是否正在加载 */
144
+ isLoading: boolean;
145
+ /** 当前选中的节点数据 */
146
+ selectedNode: RuleNodeConfig | null;
147
+ /** 当前选中的边数据 */
148
+ selectedEdge: RuleConnectionConfig | null;
149
+ /** 当前活跃的面板类型 */
150
+ activePanel: PanelType;
151
+ /** 规则链配置 */
152
+ ruleChain: RuleChainConfig;
153
+ /** 组件注册表 (type => definition 映射) */
154
+ nodeComponents: Record<string, ComponentDefinition>;
155
+ /** 按分类分组的组件列表 */
156
+ componentGroups: ComponentGroup[];
157
+ /** 当前正在编辑的节点视图定义 (对应的 ComponentDefinition) */
158
+ currentNodeView: ComponentDefinition | null;
159
+ /** 当前正在编辑的节点配置数据 */
160
+ currentNodeModel: Record<string, unknown>;
161
+ /** 当前正在编辑的边配置数据 */
162
+ currentEdgeModel: Record<string, unknown>;
163
+ /** 是否可以撤销 */
164
+ canUndo: boolean;
165
+ /** 是否可以重做 */
166
+ canRedo: boolean;
167
+ }
168
+ /**
169
+ * 编辑器插件接口
170
+ *
171
+ * 用于扩展编辑器功能。插件可以在编辑器的各个生命周期阶段注入自定义逻辑。
172
+ *
173
+ * 钩子方法说明:
174
+ * - onInit: 编辑器实例初始化后调用 (DOM 已挂载)
175
+ * - onDestroy: 编辑器销毁前调用 (用于清理资源)
176
+ * - beforeDataLoad: 数据加载前调用 (可修改原始数据)
177
+ * - beforeDataSave: 数据保存前调用 (可修改导出数据)
178
+ * - beforeNodeAdd: 节点添加前调用 (返回 false 阻止添加)
179
+ * - beforeEdgeAdd: 边添加前调用 (返回 false 阻止添加)
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * const debugPlugin: EditorPlugin = {
184
+ * name: 'debug',
185
+ * onInit(editor) {
186
+ * console.log('编辑器已初始化')
187
+ * },
188
+ * beforeDataSave(data) {
189
+ * console.log('保存前数据:', data)
190
+ * return data
191
+ * },
192
+ * }
193
+ * ```
194
+ *
195
+ * @see EditorCore.use() 安装插件
196
+ */
197
+ export interface EditorPlugin {
198
+ /** 插件名称 (唯一标识) */
199
+ name: string;
200
+ /** 插件优先级 (数字越小越先执行, 默认: 100) */
201
+ priority?: number;
202
+ /** 编辑器初始化后的回调 (此时 DOM 已挂载, LogicFlow 已就绪) */
203
+ onInit?(editor: unknown): void;
204
+ /** 编辑器销毁前的回调 (用于清理插件注册的资源) */
205
+ onDestroy?(editor: unknown): void;
206
+ /** 数据加载前回调 (可修改原始数据后返回) */
207
+ beforeDataLoad?(data: RuleChainData): RuleChainData;
208
+ /** 数据保存前回调 (可修改导出数据后返回) */
209
+ beforeDataSave?(data: RuleChainData): RuleChainData;
210
+ /** 节点添加前回调 (返回 false 阻止添加) */
211
+ beforeNodeAdd?(node: RuleNodeConfig): boolean | void;
212
+ /** 边添加前回调 (返回 false 阻止添加) */
213
+ beforeEdgeAdd?(edge: RuleConnectionConfig): boolean | void;
214
+ /**
215
+ * UI 渲染钩子 (可选)
216
+ * 用于向编辑器的特定区域注入自定义 UI 元素
217
+ * 每个函数接收对应区域的容器 HTMLElement
218
+ */
219
+ ui?: {
220
+ /** 侧边栏区域注入 */
221
+ sidebar?: (container: HTMLElement) => void;
222
+ /** 工具栏区域注入 */
223
+ toolbar?: (container: HTMLElement) => void;
224
+ /** 属性面板区域注入 */
225
+ panel?: (container: HTMLElement) => void;
226
+ };
227
+ }
228
+ /**
229
+ * 编辑器内部运行时数据
230
+ * 对应原版 initData 对象
231
+ */
232
+ export interface EditorInternalData {
233
+ /** 节点计数器 (用于生成节点 ID) */
234
+ nodeCount: number;
235
+ /** 边计数器 (用于生成边 ID) */
236
+ edgeCount: number;
237
+ /** 起始节点的固定 ID */
238
+ startNodeId: string;
239
+ /** 节点默认宽度 */
240
+ nodeWidth: number;
241
+ /** 关系类型分隔符 (多关系合并显示时用 '/' 连接, 如 'True/False') */
242
+ relationTypeSplit: string;
243
+ /** 当前正在复制的节点 ID (用于 Ctrl+C / Ctrl+V, 默认空字符串) */
244
+ currentCloneNodeId?: string;
245
+ }
246
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/types/editor.ts"],"names":[],"mappings":"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"}