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.
- package/assets/icon-names.txt +7438 -0
- package/dist/cli-register.d.ts.map +1 -1
- package/dist/cli-register.js +16 -3
- package/dist/cli-register.js.map +1 -1
- package/dist/commands/app-manager.d.ts +8 -0
- package/dist/commands/app-manager.d.ts.map +1 -0
- package/dist/commands/app-manager.js +330 -0
- package/dist/commands/app-manager.js.map +1 -0
- package/dist/commands/app-setting.d.ts +8 -0
- package/dist/commands/app-setting.d.ts.map +1 -0
- package/dist/commands/app-setting.js +170 -0
- package/dist/commands/app-setting.js.map +1 -0
- package/dist/commands/connector.d.ts +7 -0
- package/dist/commands/connector.d.ts.map +1 -0
- package/dist/commands/connector.js +163 -0
- package/dist/commands/connector.js.map +1 -0
- package/dist/commands/form-association-manage.d.ts.map +1 -1
- package/dist/commands/form-association-manage.js +57 -4
- package/dist/commands/form-association-manage.js.map +1 -1
- package/dist/commands/form-association.d.ts.map +1 -1
- package/dist/commands/form-association.js +4 -2
- package/dist/commands/form-association.js.map +1 -1
- package/dist/commands/form-button-actions-cmd.d.ts.map +1 -1
- package/dist/commands/form-button-actions-cmd.js +180 -18
- package/dist/commands/form-button-actions-cmd.js.map +1 -1
- package/dist/commands/form-button-props-cmd.d.ts.map +1 -1
- package/dist/commands/form-button-props-cmd.js +4 -0
- package/dist/commands/form-button-props-cmd.js.map +1 -1
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +11 -0
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +310 -84
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/icon.d.ts.map +1 -1
- package/dist/commands/icon.js +63 -1
- package/dist/commands/icon.js.map +1 -1
- package/dist/commands/menu-config.d.ts +3 -0
- package/dist/commands/menu-config.d.ts.map +1 -0
- package/dist/commands/menu-config.js +93 -0
- package/dist/commands/menu-config.js.map +1 -0
- package/dist/commands/menu-permission.d.ts.map +1 -1
- package/dist/commands/menu-permission.js +6 -7
- package/dist/commands/menu-permission.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +2 -5
- package/dist/commands/menu.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +1 -1
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +1 -1
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +4 -4
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +2 -1
- package/dist/services/actionflow/components/meeting_create.js.map +1 -1
- package/dist/services/actionflow/components/output.d.ts.map +1 -1
- package/dist/services/actionflow/components/output.js +2 -0
- package/dist/services/actionflow/components/output.js.map +1 -1
- package/dist/services/actionflow/context_discovery.d.ts.map +1 -1
- package/dist/services/actionflow/context_discovery.js +3 -0
- package/dist/services/actionflow/context_discovery.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +0 -10
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/date_trigger_field.d.ts +3 -0
- package/dist/services/actionflow/date_trigger_field.d.ts.map +1 -0
- package/dist/services/actionflow/date_trigger_field.js +23 -0
- package/dist/services/actionflow/date_trigger_field.js.map +1 -0
- package/dist/services/actionflow/form_source.d.ts +1 -1
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +9 -1
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +4 -12
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/generation_service.d.ts.map +1 -1
- package/dist/services/actionflow/generation_service.js +2 -1
- package/dist/services/actionflow/generation_service.js.map +1 -1
- package/dist/services/actionflow/loop_context.d.ts.map +1 -1
- package/dist/services/actionflow/loop_context.js +17 -0
- package/dist/services/actionflow/loop_context.js.map +1 -1
- package/dist/services/actionflow/meeting_secret_level.d.ts +5 -0
- package/dist/services/actionflow/meeting_secret_level.d.ts.map +1 -0
- package/dist/services/actionflow/meeting_secret_level.js +49 -0
- package/dist/services/actionflow/meeting_secret_level.js.map +1 -0
- package/dist/services/actionflow/preflight_service.d.ts +2 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +212 -4
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
- package/dist/services/actionflow/readback_verifier.js +22 -0
- package/dist/services/actionflow/readback_verifier.js.map +1 -1
- package/dist/services/actionflow/runtime_metadata.d.ts +2 -1
- package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
- package/dist/services/actionflow/runtime_metadata.js +6 -1
- package/dist/services/actionflow/runtime_metadata.js.map +1 -1
- package/dist/services/actionflow/update_service.d.ts.map +1 -1
- package/dist/services/actionflow/update_service.js +42 -1
- package/dist/services/actionflow/update_service.js.map +1 -1
- package/dist/services/actionflow/webhook_response_context.d.ts +7 -0
- package/dist/services/actionflow/webhook_response_context.d.ts.map +1 -0
- package/dist/services/actionflow/webhook_response_context.js +82 -0
- package/dist/services/actionflow/webhook_response_context.js.map +1 -0
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +67 -35
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/app-manager.d.ts +128 -0
- package/dist/services/app-manager.d.ts.map +1 -0
- package/dist/services/app-manager.js +420 -0
- package/dist/services/app-manager.js.map +1 -0
- package/dist/services/app-setting.d.ts +109 -0
- package/dist/services/app-setting.d.ts.map +1 -0
- package/dist/services/app-setting.js +410 -0
- package/dist/services/app-setting.js.map +1 -0
- package/dist/services/esb-interface/connector-lock.d.ts +42 -0
- package/dist/services/esb-interface/connector-lock.d.ts.map +1 -0
- package/dist/services/esb-interface/connector-lock.js +79 -0
- package/dist/services/esb-interface/connector-lock.js.map +1 -0
- package/dist/services/esb-interface/connector-update.d.ts +34 -0
- package/dist/services/esb-interface/connector-update.d.ts.map +1 -0
- package/dist/services/esb-interface/connector-update.js +58 -0
- package/dist/services/esb-interface/connector-update.js.map +1 -0
- package/dist/services/form-association.d.ts +28 -1
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +232 -2
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-button-action.d.ts +48 -2
- package/dist/services/form-button-action.d.ts.map +1 -1
- package/dist/services/form-button-action.js +68 -2
- package/dist/services/form-button-action.js.map +1 -1
- package/dist/services/form-field-options.d.ts +45 -0
- package/dist/services/form-field-options.d.ts.map +1 -0
- package/dist/services/form-field-options.js +179 -0
- package/dist/services/form-field-options.js.map +1 -0
- package/dist/services/form-permission-archive.d.ts +1 -0
- package/dist/services/form-permission-archive.d.ts.map +1 -1
- package/dist/services/form-permission-archive.js +3 -3
- package/dist/services/form-permission-archive.js.map +1 -1
- package/dist/services/form-permission-edit.d.ts +36 -0
- package/dist/services/form-permission-edit.d.ts.map +1 -1
- package/dist/services/form-permission-edit.js +77 -1
- package/dist/services/form-permission-edit.js.map +1 -1
- package/dist/services/icon-catalog.d.ts +60 -0
- package/dist/services/icon-catalog.d.ts.map +1 -0
- package/dist/services/icon-catalog.js +175 -0
- package/dist/services/icon-catalog.js.map +1 -0
- package/dist/services/icon-path.d.ts +2 -0
- package/dist/services/icon-path.d.ts.map +1 -1
- package/dist/services/icon-path.js +4 -0
- package/dist/services/icon-path.js.map +1 -1
- package/dist/services/menu-config.d.ts +42 -0
- package/dist/services/menu-config.d.ts.map +1 -0
- package/dist/services/menu-config.js +174 -0
- package/dist/services/menu-config.js.map +1 -0
- package/dist/services/menu-permission-config.d.ts +47 -0
- package/dist/services/menu-permission-config.d.ts.map +1 -0
- package/dist/services/menu-permission-config.js +222 -0
- package/dist/services/menu-permission-config.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +193 -188
- package/skill-docs/_catalog.md +5 -1
- package/skill-docs/actionflows/SKILL.md +195 -193
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +5 -1
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +80 -80
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +75 -75
- package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +113 -111
- package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +2 -0
- package/skill-docs/actionflows/references/condition_rules.md +100 -100
- package/skill-docs/references/app/guide-app-manager.md +93 -0
- package/skill-docs/references/app/guide-app-settings.md +93 -0
- package/skill-docs/references/common/guide-install.md +2 -0
- package/skill-docs/references/common/ref-cli-commands.md +22 -7
- package/skill-docs/references/form/guide-form-association.md +36 -0
- package/skill-docs/references/form/guide-form-button.md +22 -1
- package/skill-docs/references/form/guide-form-permission.md +17 -5
- package/skill-docs/references/menu/guide-menu-config.md +130 -0
- 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"}
|