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,128 @@
1
+ /**
2
+ * EB 应用「应用管理权限」——管理对象 + 应用管理权限面板里的内联权限分组。
3
+ *
4
+ * 管理对象:
5
+ * GET /api/bs/ebuilder/app/right/getRight?appId=
6
+ * POST /api/bs/ebuilder/app/right/editRight multipart:appId + rights=JSON
7
+ *
8
+ * 实测(2026-11-06 mulinquan):
9
+ * - `rights` 里的 `targetType` 必须是**字符串枚举**(`USER`/`DEPT`/`ROLE`/`POSITION`/`ALL`);
10
+ * 传数字会按另一套枚举解析,甚至把人员静默写成部门/岗位。
11
+ * - 读回是数字(人员=1、部门=2、角色=10、岗位=1311、所有人=11),所以合并时要按
12
+ * `_entityType` 优先还原成字符串。
13
+ *
14
+ * 内联权限分组:
15
+ * - 不在独立「权限组」页,而是 `publishInfo.rightGroupList`,随
16
+ * `app/setting/publish/save` 一起存。
17
+ * - `groupType`:`CUSTOM`=自定义、`DEVELOP`=开发者、`READONLY`=查看者。
18
+ * - 新建分组用 `{uuid,name,description,rights,groupType,config}`;平台回读会补 `id`。
19
+ */
20
+ import { type PermissionEntityKey } from './permission-entity.js';
21
+ export declare const MANAGER_GET_RIGHT_PATH = "/api/bs/ebuilder/app/right/getRight";
22
+ export declare const MANAGER_EDIT_RIGHT_PATH = "/api/bs/ebuilder/app/right/editRight";
23
+ export type ManagerKind = PermissionEntityKey;
24
+ /** 平台 `targetType` 字符串枚举。**不要传数字**。 */
25
+ export declare const MANAGER_KIND_ENUM: Record<ManagerKind, string>;
26
+ export declare const GROUP_TYPES: readonly ["CUSTOM", "DEVELOP", "READONLY"];
27
+ export type GroupType = typeof GROUP_TYPES[number];
28
+ export declare const GROUP_TYPE_LABELS: Record<GroupType, string>;
29
+ /** 新建内联权限分组的默认功能权限模板(从线上 bundle 提取)。 */
30
+ export declare const DEFAULT_GROUP_CONFIG: {
31
+ form: {
32
+ right: boolean;
33
+ create: boolean;
34
+ other: boolean;
35
+ details: never[];
36
+ };
37
+ page: {
38
+ right: boolean;
39
+ create: boolean;
40
+ other: boolean;
41
+ details: never[];
42
+ };
43
+ report: {
44
+ right: boolean;
45
+ create: boolean;
46
+ other: boolean;
47
+ details: never[];
48
+ };
49
+ workflow: {
50
+ right: boolean;
51
+ create: boolean;
52
+ multiReportEnableCreate: boolean;
53
+ };
54
+ develop: {
55
+ right: boolean;
56
+ ecode: boolean;
57
+ customApi: boolean;
58
+ };
59
+ setting: {
60
+ right: boolean;
61
+ };
62
+ cusApp: {
63
+ setting: boolean;
64
+ };
65
+ };
66
+ export declare function readPublishInfo(client: any, baseUrl: string, appId: string): Promise<any>;
67
+ /** `--type` → 类型键;认不出报错并列可选值。 */
68
+ export declare function parseManagerKind(input: string): ManagerKind;
69
+ /** `--group-type` → 平台编码。 */
70
+ export declare function parseGroupType(input: string | undefined): GroupType;
71
+ export declare function groupTypeLabel(v: unknown): string;
72
+ /** 读管理对象。返回 `rights.data[]`。 */
73
+ export declare function readManagerRows(client: any, baseUrl: string, appId: string): Promise<any[]>;
74
+ /** 全量写管理对象(editRight 是整组替换)。 */
75
+ export declare function saveManagerRows(client: any, baseUrl: string, appId: string, rows: Record<string, unknown>[]): Promise<any>;
76
+ /** 读回行的类型 → 类型键。优先 `_entityType`,再字符串 targetType,再数字,再 objType。 */
77
+ export declare function managerKindOf(row: any): ManagerKind;
78
+ /** 一条读回行的稳定身份:类型 + targetId。 */
79
+ export declare function managerKeyOf(row: any): string;
80
+ /** 一条读回行 → 可回写的 DataRightVO。只保留平台认的字段,别把 browser 回显字段塞回去。 */
81
+ export declare function toDataRight(row: any, appId: string): Record<string, unknown>;
82
+ /** 新建一条管理对象/分组成员的 DataRightVO。 */
83
+ export declare function buildManagerRow(appId: string, kind: ManagerKind, target: {
84
+ targetId: string;
85
+ name: string;
86
+ }): Record<string, unknown>;
87
+ /** 解析目标(名称或 ID)。`all` 忽略入参。 */
88
+ export declare function resolveManagerTarget(client: any, baseUrl: string, kind: ManagerKind, keyword: string): Promise<{
89
+ targetId: string;
90
+ name: string;
91
+ }>;
92
+ export interface ManagerMutationResult {
93
+ unchanged: boolean;
94
+ added: string[];
95
+ removed: string[];
96
+ rows: any[];
97
+ }
98
+ /** 追加管理对象;已存在的跳过。保存后回读确认。 */
99
+ export declare function addManagerTargets(client: any, baseUrl: string, appId: string, kind: ManagerKind, keywords: string[]): Promise<ManagerMutationResult>;
100
+ /** 移除管理对象;目标不存在直接报错。保存后回读确认。 */
101
+ export declare function removeManagerTargets(client: any, baseUrl: string, appId: string, kind: ManagerKind, keywords: string[]): Promise<ManagerMutationResult>;
102
+ export declare function readGroups(data: any): any[];
103
+ /** 按 id / uuid / 名称找分组;同名多条必须改用 id。 */
104
+ export declare function findGroup(groups: any[], ref: string): any;
105
+ export interface GroupMutationResult {
106
+ unchanged: boolean;
107
+ group: any;
108
+ groups: any[];
109
+ }
110
+ /** 新建内联权限分组。 */
111
+ export declare function addGroup(client: any, baseUrl: string, appId: string, input: {
112
+ name: string;
113
+ description?: string;
114
+ groupType?: GroupType;
115
+ }): Promise<GroupMutationResult>;
116
+ /** 编辑分组名称/描述/类型。 */
117
+ export declare function updateGroup(client: any, baseUrl: string, appId: string, ref: string, input: {
118
+ name?: string;
119
+ description?: string;
120
+ groupType?: GroupType;
121
+ }): Promise<GroupMutationResult>;
122
+ /** 删除分组。 */
123
+ export declare function deleteGroup(client: any, baseUrl: string, appId: string, ref: string): Promise<GroupMutationResult>;
124
+ /** 分组内追加成员。 */
125
+ export declare function addGroupMembers(client: any, baseUrl: string, appId: string, ref: string, kind: ManagerKind, keywords: string[]): Promise<GroupMutationResult>;
126
+ /** 分组内移除成员。 */
127
+ export declare function removeGroupMembers(client: any, baseUrl: string, appId: string, ref: string, kind: ManagerKind, keywords: string[]): Promise<GroupMutationResult>;
128
+ //# sourceMappingURL=app-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-manager.d.ts","sourceRoot":"","sources":["../../src/services/app-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,420 @@
1
+ /**
2
+ * EB 应用「应用管理权限」——管理对象 + 应用管理权限面板里的内联权限分组。
3
+ *
4
+ * 管理对象:
5
+ * GET /api/bs/ebuilder/app/right/getRight?appId=
6
+ * POST /api/bs/ebuilder/app/right/editRight multipart:appId + rights=JSON
7
+ *
8
+ * 实测(2026-11-06 mulinquan):
9
+ * - `rights` 里的 `targetType` 必须是**字符串枚举**(`USER`/`DEPT`/`ROLE`/`POSITION`/`ALL`);
10
+ * 传数字会按另一套枚举解析,甚至把人员静默写成部门/岗位。
11
+ * - 读回是数字(人员=1、部门=2、角色=10、岗位=1311、所有人=11),所以合并时要按
12
+ * `_entityType` 优先还原成字符串。
13
+ *
14
+ * 内联权限分组:
15
+ * - 不在独立「权限组」页,而是 `publishInfo.rightGroupList`,随
16
+ * `app/setting/publish/save` 一起存。
17
+ * - `groupType`:`CUSTOM`=自定义、`DEVELOP`=开发者、`READONLY`=查看者。
18
+ * - 新建分组用 `{uuid,name,description,rights,groupType,config}`;平台回读会补 `id`。
19
+ */
20
+ import { randomBytes } from 'node:crypto';
21
+ import { readAppSetting, buildSavePayload, saveAppSetting, } from './app-setting.js';
22
+ import { resolveRangeTarget } from './app-range.js';
23
+ import { resolveEntityKey } from './permission-entity.js';
24
+ export const MANAGER_GET_RIGHT_PATH = '/api/bs/ebuilder/app/right/getRight';
25
+ export const MANAGER_EDIT_RIGHT_PATH = '/api/bs/ebuilder/app/right/editRight';
26
+ /** 平台 `targetType` 字符串枚举。**不要传数字**。 */
27
+ export const MANAGER_KIND_ENUM = {
28
+ user: 'USER',
29
+ dept: 'DEPT',
30
+ role: 'ROLE',
31
+ position: 'POSITION',
32
+ all: 'ALL',
33
+ };
34
+ export const GROUP_TYPES = ['CUSTOM', 'DEVELOP', 'READONLY'];
35
+ export const GROUP_TYPE_LABELS = {
36
+ CUSTOM: '自定义',
37
+ DEVELOP: '开发者',
38
+ READONLY: '查看者',
39
+ };
40
+ /** 新建内联权限分组的默认功能权限模板(从线上 bundle 提取)。 */
41
+ export const DEFAULT_GROUP_CONFIG = {
42
+ form: { right: false, create: false, other: false, details: [] },
43
+ page: { right: false, create: false, other: false, details: [] },
44
+ report: { right: false, create: false, other: false, details: [] },
45
+ workflow: { right: false, create: false, multiReportEnableCreate: false },
46
+ develop: { right: false, ecode: false, customApi: false },
47
+ setting: { right: false },
48
+ cusApp: { setting: false },
49
+ };
50
+ export async function readPublishInfo(client, baseUrl, appId) {
51
+ return readAppSetting(client, baseUrl, appId);
52
+ }
53
+ /** `--type` → 类型键;认不出报错并列可选值。 */
54
+ export function parseManagerKind(input) {
55
+ const k = resolveEntityKey(input);
56
+ if (!k) {
57
+ throw new Error(`认不出授权对象类型「${input}」。可选:user / dept / role / position / all`);
58
+ }
59
+ return k;
60
+ }
61
+ /** `--group-type` → 平台编码。 */
62
+ export function parseGroupType(input) {
63
+ const k = String(input ?? 'CUSTOM').trim().toUpperCase();
64
+ if (GROUP_TYPES.includes(k))
65
+ return k;
66
+ const cn = String(input ?? '').trim();
67
+ if (cn === '自定义')
68
+ return 'CUSTOM';
69
+ if (cn === '开发者')
70
+ return 'DEVELOP';
71
+ if (cn === '查看者' || cn === '只读')
72
+ return 'READONLY';
73
+ throw new Error(`认不出权限组类型「${input}」。可选:CUSTOM(自定义)/ DEVELOP(开发者)/ READONLY(查看者)`);
74
+ }
75
+ export function groupTypeLabel(v) {
76
+ return GROUP_TYPE_LABELS[String(v ?? '').toUpperCase()] ?? String(v ?? '');
77
+ }
78
+ /** 读管理对象。返回 `rights.data[]`。 */
79
+ export async function readManagerRows(client, baseUrl, appId) {
80
+ const res = await client.get(`${baseUrl}${MANAGER_GET_RIGHT_PATH}?appId=${encodeURIComponent(appId)}`, { ebbusinessid: appId });
81
+ if (res?.code !== 200 || res?.status === false) {
82
+ throw new Error(`读取应用管理权限失败: ${res?.msg || '未知错误'}`);
83
+ }
84
+ const rows = res?.data?.rights?.data;
85
+ return Array.isArray(rows) ? rows : [];
86
+ }
87
+ /** 全量写管理对象(editRight 是整组替换)。 */
88
+ export async function saveManagerRows(client, baseUrl, appId, rows) {
89
+ const fd = new FormData();
90
+ fd.append('appId', appId);
91
+ fd.append('rights', JSON.stringify(rows));
92
+ const res = await client.postMultipart(`${baseUrl}${MANAGER_EDIT_RIGHT_PATH}`, fd, { ebbusinessid: appId, referer: `${baseUrl}/sp/ebdapp/build/${appId}` });
93
+ if (res?.code !== 200 || res?.status === false) {
94
+ throw new Error(`保存应用管理权限失败: ${res?.msg || '未知错误'}`);
95
+ }
96
+ return res;
97
+ }
98
+ /** 读回行的类型 → 类型键。优先 `_entityType`,再字符串 targetType,再数字,再 objType。 */
99
+ export function managerKindOf(row) {
100
+ const has = (k) => Object.prototype.hasOwnProperty.call(MANAGER_KIND_ENUM, k);
101
+ const entity = String(row?._entityType ?? '').toLowerCase();
102
+ if (has(entity))
103
+ return entity;
104
+ const tt = String(row?.targetType ?? '').toLowerCase();
105
+ if (has(tt))
106
+ return tt;
107
+ const numeric = {
108
+ '1': 'user', '2': 'dept', '10': 'role', '12': 'position', '1311': 'position', '11': 'all',
109
+ };
110
+ if (numeric[tt])
111
+ return numeric[tt];
112
+ const objType = String(row?.objType ?? '').toLowerCase();
113
+ if (objType === 'resource')
114
+ return 'user';
115
+ if (objType === 'department')
116
+ return 'dept';
117
+ if (objType === 'role')
118
+ return 'role';
119
+ if (objType === 'position')
120
+ return 'position';
121
+ if (objType === 'all')
122
+ return 'all';
123
+ throw new Error(`无法识别管理权限对象的类型(targetType=${row?.targetType}, objType=${row?.objType})`);
124
+ }
125
+ /** 一条读回行的稳定身份:类型 + targetId。 */
126
+ export function managerKeyOf(row) {
127
+ return `${managerKindOf(row)}:${String(row?.targetId ?? row?.id ?? '')}`;
128
+ }
129
+ /** 一条读回行 → 可回写的 DataRightVO。只保留平台认的字段,别把 browser 回显字段塞回去。 */
130
+ export function toDataRight(row, appId) {
131
+ const kind = managerKindOf(row);
132
+ const targetId = String(row?.targetId ?? row?.id ?? '');
133
+ const targetName = String(row?.content ?? row?.name ?? row?.targetName ?? '');
134
+ const out = {
135
+ sourceId: appId,
136
+ permissionId: 'view',
137
+ rightType: 'VIEW',
138
+ permissionType: 3,
139
+ targetType: MANAGER_KIND_ENUM[kind],
140
+ targetId,
141
+ targetName,
142
+ permissionTargetType: MANAGER_KIND_ENUM[kind],
143
+ isCustom: row?.isCustom !== undefined ? Boolean(row.isCustom) : true,
144
+ sourceType: row?.sourceType ?? 1,
145
+ download: row?.download !== undefined ? Boolean(row.download) : true,
146
+ shareKey: String(row?.shareKey || randomShareKey(kind, targetId)),
147
+ };
148
+ for (const k of [
149
+ 'role_level', 'position_level', 'level', 'user_type',
150
+ 'seclevel', 'department_attribute', 'position_attribute',
151
+ 'targetMinSecLevel', 'targetMaxSecLevel',
152
+ ]) {
153
+ if (row?.[k] !== undefined)
154
+ out[k] = row[k];
155
+ }
156
+ // 不把 permissionShareBean 的安全级别塞回去:真机验证过的最小 DataRightVO 不带它,
157
+ // 顶层 seclevel / role_level / position_level 已经保留;bean 里那两个是落库后的派生值。
158
+ return out;
159
+ }
160
+ /** 新建一条管理对象/分组成员的 DataRightVO。 */
161
+ export function buildManagerRow(appId, kind, target) {
162
+ const enumName = MANAGER_KIND_ENUM[kind];
163
+ return {
164
+ sourceId: appId,
165
+ permissionId: 'view',
166
+ rightType: 'VIEW',
167
+ permissionType: 3,
168
+ targetType: enumName,
169
+ targetId: String(target.targetId),
170
+ targetName: target.name,
171
+ permissionTargetType: enumName,
172
+ isCustom: true,
173
+ sourceType: 1,
174
+ download: true,
175
+ shareKey: randomShareKey(kind, String(target.targetId)),
176
+ };
177
+ }
178
+ function randomShareKey(kind, targetId) {
179
+ return `temp_${kind}_${targetId}_${randomBytes(6).toString('hex')}`;
180
+ }
181
+ /** 解析目标(名称或 ID)。`all` 忽略入参。 */
182
+ export async function resolveManagerTarget(client, baseUrl, kind, keyword) {
183
+ const target = await resolveRangeTarget(client, baseUrl, kind, keyword);
184
+ return { targetId: String(target.targetId), name: String(target.name) };
185
+ }
186
+ /** 追加管理对象;已存在的跳过。保存后回读确认。 */
187
+ export async function addManagerTargets(client, baseUrl, appId, kind, keywords) {
188
+ const before = await readManagerRows(client, baseUrl, appId);
189
+ const saveRows = before.map((r) => toDataRight(r, appId));
190
+ const have = new Set(saveRows.map((r) => managerKeyOf(r)));
191
+ const added = [];
192
+ const newRows = [];
193
+ for (const keyword of keywords) {
194
+ const target = await resolveManagerTarget(client, baseUrl, kind, keyword);
195
+ const key = `${kind}:${target.targetId}`;
196
+ if (have.has(key))
197
+ continue;
198
+ have.add(key);
199
+ added.push(target.name);
200
+ newRows.push(buildManagerRow(appId, kind, target));
201
+ }
202
+ if (!newRows.length)
203
+ return { unchanged: true, added: [], removed: [], rows: before };
204
+ const expected = new Set([...saveRows, ...newRows].map((r) => managerKeyOf(r)));
205
+ await saveManagerRows(client, baseUrl, appId, [...saveRows, ...newRows]);
206
+ const after = await readManagerRows(client, baseUrl, appId);
207
+ const got = new Set(after.map((r) => managerKeyOf(r)));
208
+ const missing = [...expected].filter((k) => !got.has(k));
209
+ if (missing.length) {
210
+ throw new Error(`已提交,但回读缺少管理权限对象: ${missing.join('、')}`);
211
+ }
212
+ return { unchanged: false, added, removed: [], rows: after };
213
+ }
214
+ /** 移除管理对象;目标不存在直接报错。保存后回读确认。 */
215
+ export async function removeManagerTargets(client, baseUrl, appId, kind, keywords) {
216
+ const before = await readManagerRows(client, baseUrl, appId);
217
+ const saveRows = before.map((r) => toDataRight(r, appId));
218
+ const removeKeys = new Set();
219
+ const removed = [];
220
+ for (const keyword of keywords) {
221
+ const target = await resolveManagerTarget(client, baseUrl, kind, keyword);
222
+ removeKeys.add(`${kind}:${target.targetId}`);
223
+ removed.push(target.name);
224
+ }
225
+ const remaining = saveRows.filter((r) => !removeKeys.has(managerKeyOf(r)));
226
+ if (remaining.length === saveRows.length) {
227
+ throw new Error(`当前管理权限里没有这些对象: ${removed.join('、')}`);
228
+ }
229
+ await saveManagerRows(client, baseUrl, appId, remaining);
230
+ const after = await readManagerRows(client, baseUrl, appId);
231
+ const got = new Set(after.map((r) => managerKeyOf(r)));
232
+ const stuck = [...removeKeys].filter((k) => got.has(k));
233
+ if (stuck.length) {
234
+ throw new Error(`已提交,但回读仍有管理权限对象没删掉: ${stuck.join('、')}`);
235
+ }
236
+ const expected = new Set(remaining.map((r) => managerKeyOf(r)));
237
+ const missing = [...expected].filter((k) => !got.has(k));
238
+ if (missing.length) {
239
+ throw new Error(`已提交,但回读缺少其它管理权限对象: ${missing.join('、')}`);
240
+ }
241
+ return { unchanged: false, added: [], removed, rows: after };
242
+ }
243
+ // ── 内联权限分组 ──────────────────────────────────────────────────────────
244
+ export function readGroups(data) {
245
+ return Array.isArray(data?.rightGroupList) ? data.rightGroupList : [];
246
+ }
247
+ /** 按 id / uuid / 名称找分组;同名多条必须改用 id。 */
248
+ export function findGroup(groups, ref) {
249
+ const raw = String(ref ?? '').trim();
250
+ const byId = groups.filter((g) => String(g?.id ?? '') === raw || String(g?.uuid ?? '') === raw);
251
+ if (byId.length === 1)
252
+ return byId[0];
253
+ if (byId.length > 1)
254
+ throw new Error(`分组标识「${raw}」匹配到 ${byId.length} 条,请改用唯一 id`);
255
+ const byName = groups.filter((g) => String(g?.name ?? '') === raw);
256
+ if (byName.length === 1)
257
+ return byName[0];
258
+ if (byName.length > 1) {
259
+ throw new Error(`分组名「${raw}」匹配到 ${byName.length} 条,请改用 id:${byName.map((g) => g.id).join(' / ')}`);
260
+ }
261
+ throw new Error(`找不到权限组「${raw}」`);
262
+ }
263
+ function groupKey(g) {
264
+ return String(g?.id ?? g?.uuid ?? '');
265
+ }
266
+ function groupMemberKeys(g) {
267
+ return new Set((Array.isArray(g?.rights) ? g.rights : []).map((r) => managerKeyOf(r)));
268
+ }
269
+ async function saveGroups(client, baseUrl, appId, beforeData, groups) {
270
+ const payload = buildSavePayload(beforeData, null, undefined);
271
+ payload.rightGroupList = groups;
272
+ await saveAppSetting(client, baseUrl, appId, payload);
273
+ const afterData = await readPublishInfo(client, baseUrl, appId);
274
+ return { afterData, afterGroups: readGroups(afterData) };
275
+ }
276
+ function requireGroupUnchanged(before, after, exceptKey, label) {
277
+ const afterMap = new Map(after.map((g) => [groupKey(g), g]));
278
+ for (const g of before) {
279
+ const key = groupKey(g);
280
+ if (key === exceptKey)
281
+ continue;
282
+ const now = afterMap.get(key);
283
+ if (!now)
284
+ throw new Error(`已提交,但其它权限组「${g.name}」被本次保存删掉了`);
285
+ if (String(now.name) !== String(g.name)) {
286
+ throw new Error(`已提交,但其它权限组「${g.name}」的名称被改成了「${now.name}」`);
287
+ }
288
+ }
289
+ void label;
290
+ }
291
+ /** 新建内联权限分组。 */
292
+ export async function addGroup(client, baseUrl, appId, input) {
293
+ const name = String(input.name ?? '').trim();
294
+ if (!name)
295
+ throw new Error('权限组名称不能为空');
296
+ const beforeData = await readPublishInfo(client, baseUrl, appId);
297
+ const before = readGroups(beforeData);
298
+ if (before.some((g) => String(g?.name ?? '') === name)) {
299
+ throw new Error(`已存在同名权限组「${name}」,请换一个名称`);
300
+ }
301
+ const group = {
302
+ uuid: randomBytes(16).toString('hex'),
303
+ name,
304
+ description: String(input.description ?? ''),
305
+ rights: [],
306
+ groupType: input.groupType ?? 'CUSTOM',
307
+ config: JSON.stringify(DEFAULT_GROUP_CONFIG),
308
+ };
309
+ const { afterGroups } = await saveGroups(client, baseUrl, appId, beforeData, [...before, group]);
310
+ const created = afterGroups.find((g) => String(g?.name ?? '') === name);
311
+ if (!created)
312
+ throw new Error(`已提交,但回读找不到新权限组「${name}」`);
313
+ requireGroupUnchanged(before, afterGroups, groupKey(created), 'add');
314
+ return { unchanged: false, group: created, groups: afterGroups };
315
+ }
316
+ /** 编辑分组名称/描述/类型。 */
317
+ export async function updateGroup(client, baseUrl, appId, ref, input) {
318
+ if (input.name === undefined && input.description === undefined && input.groupType === undefined) {
319
+ throw new Error('至少指定 --name / --desc / --group-type 之一');
320
+ }
321
+ const beforeData = await readPublishInfo(client, baseUrl, appId);
322
+ const before = readGroups(beforeData);
323
+ const target = findGroup(before, ref);
324
+ const nextName = input.name !== undefined ? String(input.name).trim() : String(target.name ?? '');
325
+ if (!nextName)
326
+ throw new Error('权限组名称不能为空');
327
+ if (nextName !== target.name && before.some((g) => g !== target && String(g?.name ?? '') === nextName)) {
328
+ throw new Error(`已存在同名权限组「${nextName}」,请换一个名称`);
329
+ }
330
+ const updated = {
331
+ ...target,
332
+ name: nextName,
333
+ ...(input.description !== undefined ? { description: String(input.description) } : {}),
334
+ ...(input.groupType !== undefined ? { groupType: input.groupType } : {}),
335
+ };
336
+ const nextGroups = before.map((g) => (g === target ? updated : g));
337
+ const { afterGroups } = await saveGroups(client, baseUrl, appId, beforeData, nextGroups);
338
+ const after = findGroup(afterGroups, groupKey(target) || nextName);
339
+ if (String(after.name) !== nextName) {
340
+ throw new Error(`已提交,但回读名称是「${after.name}」,不是「${nextName}」`);
341
+ }
342
+ requireGroupUnchanged(before, afterGroups, groupKey(target), 'update');
343
+ return { unchanged: false, group: after, groups: afterGroups };
344
+ }
345
+ /** 删除分组。 */
346
+ export async function deleteGroup(client, baseUrl, appId, ref) {
347
+ const beforeData = await readPublishInfo(client, baseUrl, appId);
348
+ const before = readGroups(beforeData);
349
+ const target = findGroup(before, ref);
350
+ const key = groupKey(target);
351
+ const nextGroups = before.filter((g) => g !== target);
352
+ const { afterGroups } = await saveGroups(client, baseUrl, appId, beforeData, nextGroups);
353
+ if (key && afterGroups.some((g) => groupKey(g) === key)) {
354
+ throw new Error(`已提交,但回读仍有权限组「${target.name}」`);
355
+ }
356
+ if (!key && afterGroups.some((g) => String(g?.name ?? '') === String(target.name))) {
357
+ throw new Error(`已提交,但回读仍有权限组「${target.name}」`);
358
+ }
359
+ requireGroupUnchanged(before, afterGroups, key, 'delete');
360
+ return { unchanged: false, group: target, groups: afterGroups };
361
+ }
362
+ /** 分组内追加成员。 */
363
+ export async function addGroupMembers(client, baseUrl, appId, ref, kind, keywords) {
364
+ const beforeData = await readPublishInfo(client, baseUrl, appId);
365
+ const before = readGroups(beforeData);
366
+ const target = findGroup(before, ref);
367
+ const rights = Array.isArray(target.rights) ? target.rights.map((r) => toDataRight(r, appId)) : [];
368
+ const have = new Set(rights.map((r) => managerKeyOf(r)));
369
+ const added = [];
370
+ for (const keyword of keywords) {
371
+ const t = await resolveManagerTarget(client, baseUrl, kind, keyword);
372
+ const key = `${kind}:${t.targetId}`;
373
+ if (have.has(key))
374
+ continue;
375
+ have.add(key);
376
+ added.push(t.name);
377
+ rights.push(buildManagerRow(appId, kind, t));
378
+ }
379
+ if (!added.length)
380
+ return { unchanged: true, group: target, groups: before };
381
+ const updated = { ...target, rights };
382
+ const nextGroups = before.map((g) => (g === target ? updated : g));
383
+ const { afterGroups } = await saveGroups(client, baseUrl, appId, beforeData, nextGroups);
384
+ const after = findGroup(afterGroups, groupKey(target) || String(target.name));
385
+ const got = groupMemberKeys(after);
386
+ const missing = [...have].filter((k) => !got.has(k));
387
+ if (missing.length)
388
+ throw new Error(`已提交,但回读缺少分组成员: ${missing.join('、')}`);
389
+ requireGroupUnchanged(before, afterGroups, groupKey(target), 'member-add');
390
+ return { unchanged: false, group: after, groups: afterGroups };
391
+ }
392
+ /** 分组内移除成员。 */
393
+ export async function removeGroupMembers(client, baseUrl, appId, ref, kind, keywords) {
394
+ const beforeData = await readPublishInfo(client, baseUrl, appId);
395
+ const before = readGroups(beforeData);
396
+ const target = findGroup(before, ref);
397
+ const rights = Array.isArray(target.rights) ? target.rights.map((r) => toDataRight(r, appId)) : [];
398
+ const removeKeys = new Set();
399
+ const removed = [];
400
+ for (const keyword of keywords) {
401
+ const t = await resolveManagerTarget(client, baseUrl, kind, keyword);
402
+ removeKeys.add(`${kind}:${t.targetId}`);
403
+ removed.push(t.name);
404
+ }
405
+ const kept = rights.filter((r) => !removeKeys.has(managerKeyOf(r)));
406
+ if (kept.length === rights.length) {
407
+ throw new Error(`该权限组里没有这些成员: ${removed.join('、')}`);
408
+ }
409
+ const updated = { ...target, rights: kept };
410
+ const nextGroups = before.map((g) => (g === target ? updated : g));
411
+ const { afterGroups } = await saveGroups(client, baseUrl, appId, beforeData, nextGroups);
412
+ const after = findGroup(afterGroups, groupKey(target) || String(target.name));
413
+ const got = groupMemberKeys(after);
414
+ const stuck = [...removeKeys].filter((k) => got.has(k));
415
+ if (stuck.length)
416
+ throw new Error(`已提交,但回读分组成员仍存在: ${stuck.join('、')}`);
417
+ requireGroupUnchanged(before, afterGroups, groupKey(target), 'member-remove');
418
+ return { unchanged: false, group: after, groups: afterGroups };
419
+ }
420
+ //# sourceMappingURL=app-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-manager.js","sourceRoot":"","sources":["../../src/services/app-manager.ts"],"names":[],"mappings":"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"}