weaver-e10-builder 1.7.0 → 1.7.2

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 (180) hide show
  1. package/assets/icon-names.txt +7438 -0
  2. package/dist/cli-register.d.ts.map +1 -1
  3. package/dist/cli-register.js +16 -3
  4. package/dist/cli-register.js.map +1 -1
  5. package/dist/commands/app-manager.d.ts +8 -0
  6. package/dist/commands/app-manager.d.ts.map +1 -0
  7. package/dist/commands/app-manager.js +330 -0
  8. package/dist/commands/app-manager.js.map +1 -0
  9. package/dist/commands/app-setting.d.ts +8 -0
  10. package/dist/commands/app-setting.d.ts.map +1 -0
  11. package/dist/commands/app-setting.js +170 -0
  12. package/dist/commands/app-setting.js.map +1 -0
  13. package/dist/commands/connector.d.ts +7 -0
  14. package/dist/commands/connector.d.ts.map +1 -0
  15. package/dist/commands/connector.js +163 -0
  16. package/dist/commands/connector.js.map +1 -0
  17. package/dist/commands/form-association-manage.d.ts.map +1 -1
  18. package/dist/commands/form-association-manage.js +57 -4
  19. package/dist/commands/form-association-manage.js.map +1 -1
  20. package/dist/commands/form-association.d.ts.map +1 -1
  21. package/dist/commands/form-association.js +4 -2
  22. package/dist/commands/form-association.js.map +1 -1
  23. package/dist/commands/form-button-actions-cmd.d.ts.map +1 -1
  24. package/dist/commands/form-button-actions-cmd.js +180 -18
  25. package/dist/commands/form-button-actions-cmd.js.map +1 -1
  26. package/dist/commands/form-button-props-cmd.d.ts.map +1 -1
  27. package/dist/commands/form-button-props-cmd.js +4 -0
  28. package/dist/commands/form-button-props-cmd.js.map +1 -1
  29. package/dist/commands/form-button.d.ts.map +1 -1
  30. package/dist/commands/form-button.js +11 -0
  31. package/dist/commands/form-button.js.map +1 -1
  32. package/dist/commands/form-permission.d.ts.map +1 -1
  33. package/dist/commands/form-permission.js +310 -84
  34. package/dist/commands/form-permission.js.map +1 -1
  35. package/dist/commands/icon.d.ts.map +1 -1
  36. package/dist/commands/icon.js +63 -1
  37. package/dist/commands/icon.js.map +1 -1
  38. package/dist/commands/menu-config.d.ts +3 -0
  39. package/dist/commands/menu-config.d.ts.map +1 -0
  40. package/dist/commands/menu-config.js +93 -0
  41. package/dist/commands/menu-config.js.map +1 -0
  42. package/dist/commands/menu-permission.d.ts.map +1 -1
  43. package/dist/commands/menu-permission.js +6 -7
  44. package/dist/commands/menu-permission.js.map +1 -1
  45. package/dist/commands/menu.d.ts.map +1 -1
  46. package/dist/commands/menu.js +2 -5
  47. package/dist/commands/menu.js.map +1 -1
  48. package/dist/services/actionflow/components/action_eb_add.js +1 -1
  49. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  50. package/dist/services/actionflow/components/date_trigger.js +1 -1
  51. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  52. package/dist/services/actionflow/components/enquiry_form.js +4 -4
  53. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  54. package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
  55. package/dist/services/actionflow/components/meeting_create.js +2 -1
  56. package/dist/services/actionflow/components/meeting_create.js.map +1 -1
  57. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/output.js +2 -0
  59. package/dist/services/actionflow/components/output.js.map +1 -1
  60. package/dist/services/actionflow/context_discovery.d.ts.map +1 -1
  61. package/dist/services/actionflow/context_discovery.js +3 -0
  62. package/dist/services/actionflow/context_discovery.js.map +1 -1
  63. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  64. package/dist/services/actionflow/context_preflight.js +0 -10
  65. package/dist/services/actionflow/context_preflight.js.map +1 -1
  66. package/dist/services/actionflow/date_trigger_field.d.ts +3 -0
  67. package/dist/services/actionflow/date_trigger_field.d.ts.map +1 -0
  68. package/dist/services/actionflow/date_trigger_field.js +23 -0
  69. package/dist/services/actionflow/date_trigger_field.js.map +1 -0
  70. package/dist/services/actionflow/form_source.d.ts +1 -1
  71. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  72. package/dist/services/actionflow/form_source.js +9 -1
  73. package/dist/services/actionflow/form_source.js.map +1 -1
  74. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  75. package/dist/services/actionflow/formula_service.js +4 -12
  76. package/dist/services/actionflow/formula_service.js.map +1 -1
  77. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  78. package/dist/services/actionflow/generation_service.js +2 -1
  79. package/dist/services/actionflow/generation_service.js.map +1 -1
  80. package/dist/services/actionflow/loop_context.d.ts.map +1 -1
  81. package/dist/services/actionflow/loop_context.js +17 -0
  82. package/dist/services/actionflow/loop_context.js.map +1 -1
  83. package/dist/services/actionflow/meeting_secret_level.d.ts +5 -0
  84. package/dist/services/actionflow/meeting_secret_level.d.ts.map +1 -0
  85. package/dist/services/actionflow/meeting_secret_level.js +49 -0
  86. package/dist/services/actionflow/meeting_secret_level.js.map +1 -0
  87. package/dist/services/actionflow/preflight_service.d.ts +2 -0
  88. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  89. package/dist/services/actionflow/preflight_service.js +212 -4
  90. package/dist/services/actionflow/preflight_service.js.map +1 -1
  91. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  92. package/dist/services/actionflow/readback_verifier.js +22 -0
  93. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  94. package/dist/services/actionflow/runtime_metadata.d.ts +2 -1
  95. package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
  96. package/dist/services/actionflow/runtime_metadata.js +6 -1
  97. package/dist/services/actionflow/runtime_metadata.js.map +1 -1
  98. package/dist/services/actionflow/update_service.d.ts.map +1 -1
  99. package/dist/services/actionflow/update_service.js +42 -1
  100. package/dist/services/actionflow/update_service.js.map +1 -1
  101. package/dist/services/actionflow/webhook_response_context.d.ts +7 -0
  102. package/dist/services/actionflow/webhook_response_context.d.ts.map +1 -0
  103. package/dist/services/actionflow/webhook_response_context.js +82 -0
  104. package/dist/services/actionflow/webhook_response_context.js.map +1 -0
  105. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  106. package/dist/services/actionflow/workflow_compiler.js +67 -35
  107. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  108. package/dist/services/app-manager.d.ts +128 -0
  109. package/dist/services/app-manager.d.ts.map +1 -0
  110. package/dist/services/app-manager.js +420 -0
  111. package/dist/services/app-manager.js.map +1 -0
  112. package/dist/services/app-setting.d.ts +109 -0
  113. package/dist/services/app-setting.d.ts.map +1 -0
  114. package/dist/services/app-setting.js +410 -0
  115. package/dist/services/app-setting.js.map +1 -0
  116. package/dist/services/esb-interface/connector-lock.d.ts +42 -0
  117. package/dist/services/esb-interface/connector-lock.d.ts.map +1 -0
  118. package/dist/services/esb-interface/connector-lock.js +79 -0
  119. package/dist/services/esb-interface/connector-lock.js.map +1 -0
  120. package/dist/services/esb-interface/connector-update.d.ts +34 -0
  121. package/dist/services/esb-interface/connector-update.d.ts.map +1 -0
  122. package/dist/services/esb-interface/connector-update.js +58 -0
  123. package/dist/services/esb-interface/connector-update.js.map +1 -0
  124. package/dist/services/form-association.d.ts +28 -1
  125. package/dist/services/form-association.d.ts.map +1 -1
  126. package/dist/services/form-association.js +232 -2
  127. package/dist/services/form-association.js.map +1 -1
  128. package/dist/services/form-button-action.d.ts +48 -2
  129. package/dist/services/form-button-action.d.ts.map +1 -1
  130. package/dist/services/form-button-action.js +68 -2
  131. package/dist/services/form-button-action.js.map +1 -1
  132. package/dist/services/form-field-options.d.ts +45 -0
  133. package/dist/services/form-field-options.d.ts.map +1 -0
  134. package/dist/services/form-field-options.js +179 -0
  135. package/dist/services/form-field-options.js.map +1 -0
  136. package/dist/services/form-permission-archive.d.ts +1 -0
  137. package/dist/services/form-permission-archive.d.ts.map +1 -1
  138. package/dist/services/form-permission-archive.js +3 -3
  139. package/dist/services/form-permission-archive.js.map +1 -1
  140. package/dist/services/form-permission-edit.d.ts +36 -0
  141. package/dist/services/form-permission-edit.d.ts.map +1 -1
  142. package/dist/services/form-permission-edit.js +77 -1
  143. package/dist/services/form-permission-edit.js.map +1 -1
  144. package/dist/services/icon-catalog.d.ts +60 -0
  145. package/dist/services/icon-catalog.d.ts.map +1 -0
  146. package/dist/services/icon-catalog.js +175 -0
  147. package/dist/services/icon-catalog.js.map +1 -0
  148. package/dist/services/icon-path.d.ts +2 -0
  149. package/dist/services/icon-path.d.ts.map +1 -1
  150. package/dist/services/icon-path.js +4 -0
  151. package/dist/services/icon-path.js.map +1 -1
  152. package/dist/services/menu-config.d.ts +42 -0
  153. package/dist/services/menu-config.d.ts.map +1 -0
  154. package/dist/services/menu-config.js +174 -0
  155. package/dist/services/menu-config.js.map +1 -0
  156. package/dist/services/menu-permission-config.d.ts +47 -0
  157. package/dist/services/menu-permission-config.d.ts.map +1 -0
  158. package/dist/services/menu-permission-config.js +222 -0
  159. package/dist/services/menu-permission-config.js.map +1 -0
  160. package/package.json +1 -1
  161. package/skill-docs/SKILL.md +193 -188
  162. package/skill-docs/_catalog.md +5 -1
  163. package/skill-docs/actionflows/SKILL.md +195 -193
  164. package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
  165. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +5 -1
  166. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +80 -80
  167. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +75 -75
  168. package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +2 -0
  169. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +113 -111
  170. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +2 -0
  171. package/skill-docs/actionflows/references/condition_rules.md +100 -100
  172. package/skill-docs/references/app/guide-app-manager.md +93 -0
  173. package/skill-docs/references/app/guide-app-settings.md +93 -0
  174. package/skill-docs/references/common/guide-install.md +2 -0
  175. package/skill-docs/references/common/ref-cli-commands.md +22 -7
  176. package/skill-docs/references/form/guide-form-association.md +36 -0
  177. package/skill-docs/references/form/guide-form-button.md +22 -1
  178. package/skill-docs/references/form/guide-form-permission.md +17 -5
  179. package/skill-docs/references/menu/guide-menu-config.md +130 -0
  180. package/skill-docs/references/menu/guide-menu-permission.md +94 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 平台图标名目录 —— 写按钮/组件图标前的「名字是否存在」校验。
3
+ *
4
+ * 为什么需要它:平台对不存在的图标名**不报错**,只会在运行时按空图标处理
5
+ * (按钮上什么都没有)。真实踩过:AI 建按钮时写了 `Icon-N-Delete` / `Icon-N-Success`,
6
+ * 平台照单全收,界面上按钮图标全是空白,和手工新建的按钮看起来完全不一样。
7
+ *
8
+ * 目录来自平台前端 `@weapp/iconfont` 的 icon-index(7438 个),生成 `assets/icon-names.txt`,
9
+ * 每行 `图标名<TAB>中文名`。校验只做「名字是否存在」,不做渲染验证。
10
+ *
11
+ * 找不到目录文件时**不阻断**(旧包/裁剪包仍可建按钮),调用方按 `checked:false` 处理。
12
+ */
13
+ export interface IconCatalogEntry {
14
+ /** 带 `Icon-` 前缀的规范名 */
15
+ name: string;
16
+ /** 平台中文名(可能为空) */
17
+ chineseName: string;
18
+ }
19
+ interface IconCatalog {
20
+ entries: IconCatalogEntry[];
21
+ byName: Map<string, IconCatalogEntry>;
22
+ /** 小写名 → 规范名(用于纠正大小写/前后空格) */
23
+ byLower: Map<string, string>;
24
+ }
25
+ export declare function findIconCatalogFile(): string;
26
+ /**
27
+ * 读取图标目录(进程内缓存)。文件不存在或读坏时返回 `null`,调用方跳过校验。
28
+ * 目录行格式:`Icon-Xxx<TAB>中文名`;只有名字的行也接受。
29
+ */
30
+ export declare function loadIconCatalog(): IconCatalog | null;
31
+ /** 去掉 `#` 前缀并 trim。图标目录里存的是不带 `#` 的名字。 */
32
+ export declare function bareIconName(raw: string): string;
33
+ /**
34
+ * 找近似图标名。
35
+ *
36
+ * 排序:编辑距离小的优先;距离相同再看中文名/名字长度的接近程度。
37
+ * 大小写不同但拼写完全一致的,直接排第一(`icon-n-deleted` → `Icon-N-Deleted`)。
38
+ */
39
+ export declare function suggestIcons(raw: string, limit?: number): IconCatalogEntry[];
40
+ export interface IconCheckResult {
41
+ /** 用户给的原始值 */
42
+ raw: string;
43
+ /** 去 # 后的名字 */
44
+ name: string;
45
+ /** 是否做了实际校验(目录文件缺失时为 false) */
46
+ checked: boolean;
47
+ valid: boolean;
48
+ /** 图片路径(以 /、http、data: 开头)不参与图标名校验 */
49
+ image: boolean;
50
+ entry?: IconCatalogEntry;
51
+ suggestions: IconCatalogEntry[];
52
+ }
53
+ /** 只读检查,不抛错。 */
54
+ export declare function checkIconName(raw: string, limit?: number): IconCheckResult;
55
+ /** 给保存类命令用的硬校验:不存在就停下来,并给出近似名。 */
56
+ export declare function assertIconName(raw: string, options?: {
57
+ force?: boolean;
58
+ }): void;
59
+ export {};
60
+ //# sourceMappingURL=icon-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-catalog.d.ts","sourceRoot":"","sources":["../../src/services/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACtC,8BAA8B;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAqBD,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAuBpD;AAED,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAsBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,gBAAgB,EAAE,CA0BvE;AASD,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,gBAAgB;AAChB,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,eAAe,CAYrE;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAWnF"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * 平台图标名目录 —— 写按钮/组件图标前的「名字是否存在」校验。
3
+ *
4
+ * 为什么需要它:平台对不存在的图标名**不报错**,只会在运行时按空图标处理
5
+ * (按钮上什么都没有)。真实踩过:AI 建按钮时写了 `Icon-N-Delete` / `Icon-N-Success`,
6
+ * 平台照单全收,界面上按钮图标全是空白,和手工新建的按钮看起来完全不一样。
7
+ *
8
+ * 目录来自平台前端 `@weapp/iconfont` 的 icon-index(7438 个),生成 `assets/icon-names.txt`,
9
+ * 每行 `图标名<TAB>中文名`。校验只做「名字是否存在」,不做渲染验证。
10
+ *
11
+ * 找不到目录文件时**不阻断**(旧包/裁剪包仍可建按钮),调用方按 `checked:false` 处理。
12
+ */
13
+ import { existsSync, readFileSync } from 'node:fs';
14
+ import { dirname, resolve } from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { homedir } from 'node:os';
17
+ import { isImageIconPath } from './icon-path.js';
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ let cache;
20
+ /** 与 icon 命令一致的查找顺序:本包 assets → skill 文档树 → 已安装 skill。 */
21
+ function candidatePaths() {
22
+ const home = homedir();
23
+ const fromSkillDir = process.env.E10_SKILL_DIR
24
+ ? [resolve(process.env.E10_SKILL_DIR, 'assets', 'icon-names.txt')]
25
+ : [];
26
+ return [
27
+ // src/services 或 dist/services → packages/cli/assets/icon-names.txt
28
+ resolve(__dirname, '..', '..', 'assets', 'icon-names.txt'),
29
+ // 仓库源码布局:<repo>/skills/weaver-e10-builder/assets/icon-names.txt
30
+ resolve(__dirname, '..', '..', '..', '..', 'skills', 'weaver-e10-builder', 'assets', 'icon-names.txt'),
31
+ ...fromSkillDir,
32
+ resolve(home, '.workbuddy', 'skills', 'weaver-e10-builder', 'assets', 'icon-names.txt'),
33
+ resolve(home, '.claude', 'skills', 'weaver-e10-builder', 'assets', 'icon-names.txt'),
34
+ ];
35
+ }
36
+ export function findIconCatalogFile() {
37
+ return candidatePaths().find((path) => existsSync(path)) || '';
38
+ }
39
+ /**
40
+ * 读取图标目录(进程内缓存)。文件不存在或读坏时返回 `null`,调用方跳过校验。
41
+ * 目录行格式:`Icon-Xxx<TAB>中文名`;只有名字的行也接受。
42
+ */
43
+ export function loadIconCatalog() {
44
+ if (cache !== undefined)
45
+ return cache;
46
+ const file = findIconCatalogFile();
47
+ if (!file)
48
+ return (cache = null);
49
+ try {
50
+ const entries = [];
51
+ const byName = new Map();
52
+ const byLower = new Map();
53
+ for (const line of readFileSync(file, 'utf8').split(/\r?\n/)) {
54
+ const text = line.trim();
55
+ if (!text || text.startsWith('#'))
56
+ continue;
57
+ const [namePart, ...rest] = text.split('\t');
58
+ const name = String(namePart || '').trim();
59
+ if (!name)
60
+ continue;
61
+ const entry = { name, chineseName: rest.join('\t').trim() };
62
+ entries.push(entry);
63
+ byName.set(name, entry);
64
+ if (!byLower.has(name.toLowerCase()))
65
+ byLower.set(name.toLowerCase(), name);
66
+ }
67
+ return (cache = { entries, byName, byLower });
68
+ }
69
+ catch {
70
+ return (cache = null);
71
+ }
72
+ }
73
+ /** 去掉 `#` 前缀并 trim。图标目录里存的是不带 `#` 的名字。 */
74
+ export function bareIconName(raw) {
75
+ return String(raw ?? '').trim().replace(/^#/, '');
76
+ }
77
+ /** 计算两个名字的编辑距离(带上限,超过上限直接返回上限+1,避免无谓计算)。 */
78
+ function editDistance(a, b, cutoff) {
79
+ if (Math.abs(a.length - b.length) > cutoff)
80
+ return cutoff + 1;
81
+ const prev = new Array(b.length + 1);
82
+ const cur = new Array(b.length + 1);
83
+ for (let j = 0; j <= b.length; j += 1)
84
+ prev[j] = j;
85
+ for (let i = 1; i <= a.length; i += 1) {
86
+ cur[0] = i;
87
+ let rowMin = cur[0];
88
+ for (let j = 1; j <= b.length; j += 1) {
89
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
90
+ cur[j] = Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + cost);
91
+ if (cur[j] < rowMin)
92
+ rowMin = cur[j];
93
+ }
94
+ if (rowMin > cutoff)
95
+ return cutoff + 1;
96
+ for (let j = 0; j <= b.length; j += 1)
97
+ prev[j] = cur[j];
98
+ }
99
+ return prev[b.length];
100
+ }
101
+ /**
102
+ * 找近似图标名。
103
+ *
104
+ * 排序:编辑距离小的优先;距离相同再看中文名/名字长度的接近程度。
105
+ * 大小写不同但拼写完全一致的,直接排第一(`icon-n-deleted` → `Icon-N-Deleted`)。
106
+ */
107
+ export function suggestIcons(raw, limit = 5) {
108
+ const catalog = loadIconCatalog();
109
+ if (!catalog)
110
+ return [];
111
+ const name = bareIconName(raw);
112
+ if (!name)
113
+ return [];
114
+ const lower = name.toLowerCase();
115
+ if (catalog.byLower.has(lower)) {
116
+ const exact = catalog.byName.get(catalog.byLower.get(lower));
117
+ if (exact)
118
+ return [exact];
119
+ }
120
+ // 名字很长时放宽上限,短名保持严格,避免给出一堆毫不相关的候选。
121
+ const cutoff = Math.min(12, Math.max(3, Math.floor(name.length / 3)));
122
+ const scored = [];
123
+ for (const entry of catalog.entries) {
124
+ const entryLower = entry.name.toLowerCase();
125
+ // 共同前缀太短且距离上限也不够的,先粗筛掉,减少编辑距离计算。
126
+ const prefix = commonPrefixLength(lower, entryLower);
127
+ if (prefix < 4 && Math.abs(entryLower.length - lower.length) > cutoff)
128
+ continue;
129
+ const distance = editDistance(lower, entryLower, cutoff);
130
+ if (distance <= cutoff)
131
+ scored.push({ entry, distance });
132
+ if (scored.length > 400)
133
+ break; // 候选足够多,不必扫完全表
134
+ }
135
+ scored.sort((a, b) => a.distance - b.distance
136
+ || a.entry.name.length - b.entry.name.length
137
+ || a.entry.name.localeCompare(b.entry.name));
138
+ return scored.slice(0, limit).map((item) => item.entry);
139
+ }
140
+ function commonPrefixLength(a, b) {
141
+ const max = Math.min(a.length, b.length);
142
+ let i = 0;
143
+ while (i < max && a[i] === b[i])
144
+ i += 1;
145
+ return i;
146
+ }
147
+ /** 只读检查,不抛错。 */
148
+ export function checkIconName(raw, limit = 5) {
149
+ const name = bareIconName(raw);
150
+ const image = isImageIconPath(raw);
151
+ const catalog = loadIconCatalog();
152
+ if (image)
153
+ return { raw: String(raw ?? ''), name, checked: true, valid: true, image, suggestions: [] };
154
+ if (!catalog)
155
+ return { raw: String(raw ?? ''), name, checked: false, valid: true, image, suggestions: [] };
156
+ const entry = catalog.byName.get(name);
157
+ return {
158
+ raw: String(raw ?? ''), name, checked: true, valid: Boolean(entry), image,
159
+ ...(entry ? { entry } : {}),
160
+ suggestions: entry ? [] : suggestIcons(name, limit),
161
+ };
162
+ }
163
+ /** 给保存类命令用的硬校验:不存在就停下来,并给出近似名。 */
164
+ export function assertIconName(raw, options = {}) {
165
+ const result = checkIconName(raw);
166
+ if (!result.checked || result.valid || result.image || options.force)
167
+ return;
168
+ const similar = result.suggestions.length
169
+ ? `\n近似图标:${result.suggestions.map((item) => `${item.name}${item.chineseName ? `(${item.chineseName})` : ''}`).join('、')}`
170
+ : '';
171
+ throw new Error(`图标「${result.name}」不在平台图标库中,按钮上会显示空白。${similar}`
172
+ + `\n如果确认该名字在目标环境存在,请追加 --force-icon。`
173
+ + `\n可用 e10-cli icon search <关键词> 查图标。`);
174
+ }
175
+ //# sourceMappingURL=icon-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-catalog.js","sourceRoot":"","sources":["../../src/services/icon-catalog.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@
17
17
  * 真要发**图片**的:以 `/`(应用内路径)、`http(s)://`、`data:` 开头的一律原样发 ——
18
18
  * 这些本来就该走 AssetsImg 分支。其余一律当图标名补上 `#`。
19
19
  */
20
+ /** 是否是图片地址(这种 path 不参与图标名校验,平台会走 AssetsImg 分支)。 */
21
+ export declare function isImageIconPath(raw: string): boolean;
20
22
  /**
21
23
  * 归一化图标 path:不是图片地址就补 `#` 前缀。已经带 `#` 的原样返回。
22
24
  *
@@ -1 +1 @@
1
- {"version":3,"file":"icon-path.d.ts","sourceRoot":"","sources":["../../src/services/icon-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAU/E;AAED,uBAAuB;AACvB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAarF"}
1
+ {"version":3,"file":"icon-path.d.ts","sourceRoot":"","sources":["../../src/services/icon-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAU/E;AAED,uBAAuB;AACvB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAarF"}
@@ -19,6 +19,10 @@
19
19
  */
20
20
  /** 看起来是图片地址(应用内路径 / 外链 / data URI)而不是图标名的。 */
21
21
  const IMAGE_LIKE = /^(\/|https?:\/\/|data:|\.\/|\.\.\/)/i;
22
+ /** 是否是图片地址(这种 path 不参与图标名校验,平台会走 AssetsImg 分支)。 */
23
+ export function isImageIconPath(raw) {
24
+ return IMAGE_LIKE.test(String(raw ?? '').trim());
25
+ }
22
26
  /**
23
27
  * 归一化图标 path:不是图片地址就补 `#` 前缀。已经带 `#` 的原样返回。
24
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"icon-path.js","sourceRoot":"","sources":["../../src/services/icon-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAwB;QAChC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE;KAC9D,CAAC;IACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAiBD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA0B;IAC9D,OAAO;QACL,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;YACnC,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACpC;QACD,eAAe,EAAE,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;KAC3D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"icon-path.js","sourceRoot":"","sources":["../../src/services/icon-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAE1D,mDAAmD;AACnD,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAwB;QAChC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE;KAC9D,CAAC;IACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAiBD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA0B;IAC9D,OAAO;QACL,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;YACnC,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACpC;QACD,eAAe,EAAE,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ type Client = Pick<ApiClient, 'get' | 'post' | 'postMultipart'>;
3
+ export declare function normalizeMenuAddress(value: string): string;
4
+ export declare function buildMenuTarget(raw: any, appId: string, config: any, clear?: boolean): any;
5
+ export declare function readMenuConfig(c: Client, base: string, appId: string, menuId: string, terminal: 'PC' | 'H5'): Promise<any>;
6
+ export declare function menuPermissionRows(c: Client, b: string, appId: string, id: string, scope: number): Promise<any[]>;
7
+ export declare function menuPermissions(c: Client, b: string, appId: string, id: string): Promise<any[][]>;
8
+ export declare function setMenuTarget(c: Client, b: string, appId: string, id: string, terminal: 'PC' | 'H5', config: any, clear: boolean, apply: boolean): Promise<{
9
+ saved: boolean;
10
+ navigation: any;
11
+ terminal?: undefined;
12
+ menu?: undefined;
13
+ permissionsPreserved?: undefined;
14
+ } | {
15
+ saved: boolean;
16
+ terminal: "PC" | "H5";
17
+ menu: any;
18
+ permissionsPreserved: boolean;
19
+ navigation?: undefined;
20
+ }>;
21
+ /** Partial attributes: omitted fields are preserved, explicit empty description/condition clears. */
22
+ export declare function buildMenuSettings(raw: any, appId: string, input: any): any;
23
+ export declare function setMenuSettings(c: Client, b: string, appId: string, id: string, terminal: 'PC' | 'H5', input: any, apply?: boolean): Promise<{
24
+ saved: boolean;
25
+ navigation: any;
26
+ effects: {
27
+ defaultSelection: string | undefined;
28
+ icon: string | undefined;
29
+ };
30
+ terminal?: undefined;
31
+ menu?: undefined;
32
+ permissionsPreserved?: undefined;
33
+ } | {
34
+ saved: boolean;
35
+ terminal: "PC" | "H5";
36
+ menu: any;
37
+ permissionsPreserved: boolean;
38
+ navigation?: undefined;
39
+ effects?: undefined;
40
+ }>;
41
+ export {};
42
+ //# sourceMappingURL=menu-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-config.d.ts","sourceRoot":"","sources":["../../src/services/menu-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC;AAMhE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,UAKjD;AAWD,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,UAAQ,OAyBlF;AACD,wBAAsB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,gBAMjH;AACD,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAStG;AACD,wBAAsB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,oBAEpF;AACD,wBAAsB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;GAkBtJ;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAkBpE;AACD,wBAAsB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,UAAQ;;;;;;;;;;;;;;;;;GActI"}
@@ -0,0 +1,174 @@
1
+ import { parseLayoutJson } from './form-layout-source/json.js';
2
+ import { pickMenuBucket, MENU_READONLY_KEYS, resolveOpenMode } from './menu-catalog.js';
3
+ const check = (v, msg) => { if (!v)
4
+ throw Error(msg); };
5
+ function result(r) { check(r?.code === 200 && r.status === true && !r.fail && r.data !== undefined && r.data !== false, r?.msg || '菜单接口业务失败'); return r.data; }
6
+ function json(v, fallback) { if (v === undefined || v === null || v === '')
7
+ return fallback; return typeof v === 'string' ? parseLayoutJson(v) : structuredClone(v); }
8
+ function stable(v) { return Array.isArray(v) ? v.map(stable) : v && typeof v === 'object' ? Object.fromEntries(Object.keys(v).sort().map(k => [k, stable(v[k])])) : v; }
9
+ const same = (a, b) => JSON.stringify(stable(a)) === JSON.stringify(stable(b));
10
+ export function normalizeMenuAddress(value) {
11
+ check(!!value.trim(), '地址不能为空');
12
+ const msys = value.match(/^[A-Za-z]:[/\\].+?(\/sp\/.+)$/);
13
+ value = msys?.[1] || value.trim();
14
+ return /^https?:\/\//i.test(value) ? value : '/' + value.replace(/^\/+/, '');
15
+ }
16
+ function baseMenuNavigation(raw, appId) {
17
+ const nav = structuredClone(raw);
18
+ for (const k of [...MENU_READONLY_KEYS, 'pageId', 'pageName', 'pageType', 'terminalScopes', 'appid', 'pageParam'])
19
+ delete nav[k];
20
+ nav.params = json(raw.pageParam, []);
21
+ nav.filterCondition = json(raw.filterCondition, {});
22
+ if (raw.icon)
23
+ nav.icon = json(raw.icon, {});
24
+ if (raw.selectLayout)
25
+ nav.selectLayout = json(raw.selectLayout, {});
26
+ nav.page = { pageId: raw.pageId || '', pageName: raw.pageName || '', pageType: raw.pageType, terminalScopes: raw.terminalScopes || '', appid: raw.remoteAppId || appId };
27
+ return nav;
28
+ }
29
+ export function buildMenuTarget(raw, appId, config, clear = false) {
30
+ const nav = baseMenuNavigation(raw, appId);
31
+ if (clear) {
32
+ nav.page = { pageId: '', pageName: '', pageType: null, terminalScopes: '', appid: appId };
33
+ nav.params = [];
34
+ delete nav.menuUrl;
35
+ }
36
+ else {
37
+ check(config && typeof config === 'object' && !Array.isArray(config), '目标配置需要对象');
38
+ if (config.url !== undefined) {
39
+ const url = normalizeMenuAddress(config.url);
40
+ nav.page = { pageId: url, pageName: url, pageType: 'LINK', terminalScopes: '', appid: appId };
41
+ nav.menuUrl = url;
42
+ nav.menuType = /^https?:\/\//i.test(url) ? '2' : '1';
43
+ nav.linkType = '1';
44
+ nav.params = [];
45
+ }
46
+ else {
47
+ check(config.page?.pageType && config.page?.pageId, '需提供 url 或 page.pageType/pageId');
48
+ check(typeof config.menuUrl === 'string' && config.menuUrl.length, '选择目标需提供其 menuUrl');
49
+ nav.page = { terminalScopes: '', appid: appId, ...config.page };
50
+ if (nav.page.pageType === 'LAYOUT')
51
+ nav.page.pageId = String(nav.page.pageId).replace(/^(\d+)\//, '$1_');
52
+ nav.menuUrl = config.menuUrl;
53
+ nav.menuType = '1';
54
+ nav.params = [];
55
+ }
56
+ for (const key of ['params', 'selectLayout', 'urlLinkType', 'linkType', 'remoteAppId', 'pageExtend'])
57
+ if (config[key] !== undefined)
58
+ nav[key] = structuredClone(config[key]);
59
+ check(Array.isArray(nav.params), 'params 必须为数组');
60
+ if (config.openMode !== undefined)
61
+ nav.openMode = resolveOpenMode(String(config.openMode));
62
+ }
63
+ return nav;
64
+ }
65
+ export async function readMenuConfig(c, base, appId, menuId, terminal) {
66
+ for (const value of [appId, menuId])
67
+ check(/^\d+$/.test(value), '应用/菜单需真实 ID');
68
+ const tree = result(await c.get(`${base}/api/cusapp/app/allMenus?` + new URLSearchParams({ appId, terminalType: terminal, isFront: '0', domain: base })));
69
+ check(pickMenuBucket(tree).nodes.some(n => n.id === menuId), '菜单不属于该应用及终端');
70
+ const detail = result(await c.get(`${base}/api/cusapp/app/getMenu?id=${menuId}`));
71
+ check(String(detail?.id) === menuId, '菜单详情 ID 不一致');
72
+ return detail;
73
+ }
74
+ export async function menuPermissionRows(c, b, appId, id, scope) {
75
+ check([1, -1].includes(scope), '权限范围无效');
76
+ const rows = [];
77
+ for (let current = 1;; current++) {
78
+ const data = result(await c.post(b + '/api/cusapp/permissionForm/table/list/new', { permissionId: 'sys_view', permissionType: scope, id, sourceId: id, pageSize: 100, current }, { ebbusinessid: appId }));
79
+ check(Array.isArray(data.data), '权限列表结构无效');
80
+ rows.push(...data.data);
81
+ if (data.data.length < 100 || (data.total !== undefined && rows.length >= Number(data.total)))
82
+ break;
83
+ check(current < 1000, '权限分页未结束');
84
+ }
85
+ return rows;
86
+ }
87
+ export async function menuPermissions(c, b, appId, id) {
88
+ return Promise.all([1, -1].map(scope => menuPermissionRows(c, b, appId, id, scope)));
89
+ }
90
+ export async function setMenuTarget(c, b, appId, id, terminal, config, clear, apply) {
91
+ const before = await readMenuConfig(c, b, appId, id, terminal);
92
+ const nav = buildMenuTarget(before, appId, config, clear);
93
+ if (!apply)
94
+ return { saved: false, navigation: nav };
95
+ const rights = await menuPermissions(c, b, appId, id);
96
+ check(same(before, await readMenuConfig(c, b, appId, id, terminal)), '菜单已变化,请重新读取后配置');
97
+ const form = new FormData();
98
+ for (const [k, v] of Object.entries({ appId, navigation: JSON.stringify(nav), isThirdParty: 'true', terminalType: terminal === 'H5' ? 'MOBILE' : 'PC' }))
99
+ form.set(k, v);
100
+ result(await c.postMultipart(b + '/api/cusapp/app/savePublishMenu', form, { ebbusinessid: appId }));
101
+ const after = await readMenuConfig(c, b, appId, id, terminal);
102
+ check(clear ? after.pageType === 'EMPTY' && !after.pageId : after.pageType === nav.page.pageType && String(after.pageId) === String(nav.page.pageId) && after.menuUrl === nav.menuUrl, '已保存,但有效目标回读不一致');
103
+ check(same(json(after.pageParam, []), nav.params), '已保存,但参数回读不一致');
104
+ check(String(after.openMode) === String(nav.openMode), '打开方式回读不一致');
105
+ if (!clear && config.selectLayout !== undefined)
106
+ check(same(json(after.selectLayout, {}), nav.selectLayout), '目标布局回读不一致');
107
+ for (const k of ['content', 'pid', 'showOrder', 'defaultFrontEnable', 'defaultMenuSelect', 'activeIcon', 'menuDesc', 'tabs'])
108
+ check(same(before[k], after[k]), `已保存,但 ${k} 回读变化,请核对`);
109
+ check(same(json(before.filterCondition, {}), json(after.filterCondition, {})), '显示条件回读变化');
110
+ check(same(rights, await menuPermissions(c, b, appId, id)), '权限回读变化,请核对');
111
+ return { saved: true, terminal, menu: after, permissionsPreserved: true };
112
+ }
113
+ /** Partial attributes: omitted fields are preserved, explicit empty description/condition clears. */
114
+ export function buildMenuSettings(raw, appId, input) {
115
+ check(input && typeof input === 'object' && !Array.isArray(input), '属性配置需要对象');
116
+ const keys = ['visible', 'enabled', 'defaultSelected', 'description', 'icon', 'condition'];
117
+ check(Object.keys(input).length && Object.keys(input).every(k => keys.includes(k)), '属性包含未知字段或为空');
118
+ const nav = baseMenuNavigation(raw, appId);
119
+ if (raw.pageType === 'EMPTY')
120
+ nav.page.pageType = null;
121
+ for (const [key, field, yes, no] of [['visible', 'showType', '1', '2'], ['enabled', 'defaultFrontEnable', '1', '0'], ['defaultSelected', 'defaultMenuSelect', true, false]]) {
122
+ if (Object.hasOwn(input, key)) {
123
+ check(typeof input[key] === 'boolean', `${key} 需要布尔值`);
124
+ nav[field] = input[key] ? yes : no;
125
+ }
126
+ }
127
+ if (Object.hasOwn(input, 'description')) {
128
+ check(typeof input.description === 'string', 'description 需要 HTML 字符串,空串清空');
129
+ nav.menuDesc = input.description;
130
+ nav.menuDescLabelId = '0';
131
+ }
132
+ if (Object.hasOwn(input, 'icon')) {
133
+ if (input.icon === null)
134
+ nav.icon = '';
135
+ else {
136
+ check(input.icon && typeof input.icon === 'object' && !Array.isArray(input.icon) && typeof input.icon.path === 'string' && input.icon.path.length, 'icon 需要候选中的完整图标对象,null 清空');
137
+ nav.icon = structuredClone(input.icon);
138
+ }
139
+ }
140
+ if (Object.hasOwn(input, 'condition')) {
141
+ check(input.condition && typeof input.condition === 'object' && !Array.isArray(input.condition), 'condition 需要完整条件树,{} 清空');
142
+ const visit = (node) => { check(node && typeof node === 'object', '条件节点无效'); if (node.isParent) {
143
+ check(['0', '1'].includes(String(node.relationship)) && Array.isArray(node.datas), '条件组需要 relationship 和 datas');
144
+ node.datas.forEach(visit);
145
+ }
146
+ else
147
+ check(node.conditions && typeof node.conditions.func === 'string', '条件叶子缺少 conditions.func'); };
148
+ if (Object.keys(input.condition).length)
149
+ visit(input.condition);
150
+ nav.filterCondition = structuredClone(input.condition);
151
+ }
152
+ return nav;
153
+ }
154
+ export async function setMenuSettings(c, b, appId, id, terminal, input, apply = false) {
155
+ const before = await readMenuConfig(c, b, appId, id, terminal), nav = buildMenuSettings(before, appId, input);
156
+ if (!apply)
157
+ return { saved: false, navigation: nav, effects: { defaultSelection: input.defaultSelected === true ? '设置默认项可能使其他菜单取消默认;保存后检查应用菜单' : undefined, icon: input.icon && String(before.pid) !== '0' ? '子级菜单的前台图标展示取决于导航样式' : undefined } };
158
+ const rights = await menuPermissions(c, b, appId, id);
159
+ check(same(before, await readMenuConfig(c, b, appId, id, terminal)), '菜单发生变化,停止覆盖');
160
+ const f = new FormData();
161
+ for (const [k, v] of Object.entries({ appId, navigation: JSON.stringify(nav), isThirdParty: 'true', terminalType: terminal === 'H5' ? 'MOBILE' : 'PC' }))
162
+ f.set(k, v);
163
+ result(await c.postMultipart(b + '/api/cusapp/app/savePublishMenu', f, { ebbusinessid: appId }));
164
+ const after = await readMenuConfig(c, b, appId, id, terminal);
165
+ for (const key of ['pageType', 'pageId', 'menuUrl', 'content', 'pid', 'showOrder', 'openMode'])
166
+ check(String(before[key] ?? '') === String(after[key] ?? ''), `保存后 ${key} 变化,请核对`);
167
+ for (const key of ['showType', 'defaultFrontEnable', 'defaultMenuSelect', 'menuDesc'])
168
+ check(String(nav[key] ?? '') === String(after[key] ?? ''), `${key} 回读不一致`);
169
+ check(same(json(nav.icon, {}), json(after.icon, {})), '图标回读不一致');
170
+ check(same(nav.filterCondition, json(after.filterCondition, {})), '显示条件回读不一致');
171
+ check(same(rights, await menuPermissions(c, b, appId, id)), '菜单权限回读变化');
172
+ return { saved: true, terminal, menu: after, permissionsPreserved: true };
173
+ }
174
+ //# sourceMappingURL=menu-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-config.js","sourceRoot":"","sources":["../../src/services/menu-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ type Client = Pick<ApiClient, 'get' | 'post' | 'postMultipart'>;
3
+ export declare function menuPermissionSchema(c: Client, b: string, id: string, scope: number): Promise<{
4
+ form: any;
5
+ security: any;
6
+ structuredTypes: string[];
7
+ nativeTypes: any;
8
+ }>;
9
+ export declare function menuPermissionBrowse(c: Client, b: string, menu: string, scope: number, type: string, operation: string, query?: any): Promise<any>;
10
+ export declare function compileMenuPermission(form: any, menuId: string, scope: number, input: any, item?: any): any;
11
+ export declare function buildMenuPermissionDelete(row: any, menuId: string, scope: number): {
12
+ sourceId: string;
13
+ permissionId: string;
14
+ objType: any;
15
+ objTypeSpan: any;
16
+ obj_id: any;
17
+ objIdList: any;
18
+ id: string;
19
+ obj_id_span: any;
20
+ targetId: any;
21
+ targetType: any;
22
+ permissionType: number;
23
+ _entityType: any;
24
+ permissionShareBean: any;
25
+ shareKey: string;
26
+ sourceType: number;
27
+ name: any;
28
+ }[];
29
+ export declare function menuGrantKey(row: any): string;
30
+ export declare function menuGrantMatches(actual: any, expected: any): boolean;
31
+ export declare function mutateMenuPermission(c: Client, b: string, app: string, id: string, terminal: 'PC' | 'H5', scope: number, operation: 'add' | 'remove' | 'replace', input: any, key: string | undefined, apply: boolean): Promise<{
32
+ saved: boolean;
33
+ operation: "replace" | "remove" | "add";
34
+ scope: number;
35
+ row: any;
36
+ remove: any;
37
+ permissions?: undefined;
38
+ } | {
39
+ saved: boolean;
40
+ operation: "replace" | "remove" | "add";
41
+ scope: number;
42
+ permissions: any[][];
43
+ row?: undefined;
44
+ remove?: undefined;
45
+ }>;
46
+ export {};
47
+ //# sourceMappingURL=menu-permission-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-permission-config.d.ts","sourceRoot":"","sources":["../../src/services/menu-permission-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC;AAWhE,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;GAIzF;AAKD,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,GAAQ,gBAY7I;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,OA8BrG;AACD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;IAOhF;AACD,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAgF;AAI9H,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,WAQ1D;AACD,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;GA6D3N"}