weaver-e10-builder 1.2.3 → 1.2.5
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/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +12 -25
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/designer-css.d.ts +15 -0
- package/dist/commands/designer-css.d.ts.map +1 -0
- package/dist/commands/designer-css.js +205 -0
- package/dist/commands/designer-css.js.map +1 -0
- package/dist/commands/form-field-lang.d.ts.map +1 -1
- package/dist/commands/form-field-lang.js +4 -39
- package/dist/commands/form-field-lang.js.map +1 -1
- package/dist/commands/form-layout-init.d.ts.map +1 -1
- package/dist/commands/form-layout-init.js +15 -10
- package/dist/commands/form-layout-init.js.map +1 -1
- package/dist/commands/form-layout.js +24 -21
- package/dist/commands/form-layout.js.map +1 -1
- package/dist/commands/form-native.d.ts.map +1 -1
- package/dist/commands/form-native.js +181 -0
- package/dist/commands/form-native.js.map +1 -1
- package/dist/commands/form-validate.d.ts.map +1 -1
- package/dist/commands/form-validate.js +11 -3
- package/dist/commands/form-validate.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +76 -19
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +170 -23
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/wf-form.d.ts +1 -0
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +44 -13
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-node-assign-flow.d.ts.map +1 -1
- package/dist/commands/workflow-node-assign-flow.js +1 -2
- package/dist/commands/workflow-node-assign-flow.js.map +1 -1
- package/dist/commands/workflow-node.d.ts.map +1 -1
- package/dist/commands/workflow-node.js +147 -2
- package/dist/commands/workflow-node.js.map +1 -1
- package/dist/commands/workflow-odoc.d.ts.map +1 -1
- package/dist/commands/workflow-odoc.js +56 -56
- package/dist/commands/workflow-odoc.js.map +1 -1
- package/dist/commands/workflow-setting.d.ts.map +1 -1
- package/dist/commands/workflow-setting.js +77 -1
- package/dist/commands/workflow-setting.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +36 -80
- package/dist/commands/workflow.js.map +1 -1
- package/dist/core/client.d.ts +14 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +28 -12
- package/dist/core/client.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/command_output.d.ts +7 -0
- package/dist/services/actionflow/command_output.d.ts.map +1 -1
- package/dist/services/actionflow/command_output.js +46 -0
- package/dist/services/actionflow/command_output.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +14 -4
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add_compiler.js +29 -0
- package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +23 -8
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +239 -6
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/custom_set_form.d.ts +10 -0
- package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -0
- package/dist/services/actionflow/components/custom_set_form.js +65 -0
- package/dist/services/actionflow/components/custom_set_form.js.map +1 -0
- package/dist/services/actionflow/components/custom_trigger.d.ts +2 -2
- package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/custom_trigger.js +7 -10
- package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +1 -1
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/output.d.ts.map +1 -1
- package/dist/services/actionflow/components/output.js +6 -1
- package/dist/services/actionflow/components/output.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +13 -6
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/context_provider.d.ts.map +1 -1
- package/dist/services/actionflow/context_provider.js +3 -2
- package/dist/services/actionflow/context_provider.js.map +1 -1
- package/dist/services/actionflow/dynamic_resources.d.ts.map +1 -1
- package/dist/services/actionflow/dynamic_resources.js +1 -1
- package/dist/services/actionflow/dynamic_resources.js.map +1 -1
- package/dist/services/actionflow/ebuilder_source.d.ts +19 -0
- package/dist/services/actionflow/ebuilder_source.d.ts.map +1 -0
- package/dist/services/actionflow/ebuilder_source.js +78 -0
- package/dist/services/actionflow/ebuilder_source.js.map +1 -0
- package/dist/services/actionflow/form_source.d.ts +51 -10
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +173 -29
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +4 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +46 -22
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +6 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +211 -3
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +83 -15
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/designer-css.d.ts +89 -0
- package/dist/services/designer-css.d.ts.map +1 -0
- package/dist/services/designer-css.js +163 -0
- package/dist/services/designer-css.js.map +1 -0
- package/dist/services/dom-structure.d.ts +42 -0
- package/dist/services/dom-structure.d.ts.map +1 -0
- package/dist/services/dom-structure.js +251 -0
- package/dist/services/dom-structure.js.map +1 -0
- package/dist/services/form-field-patch.d.ts +22 -0
- package/dist/services/form-field-patch.d.ts.map +1 -1
- package/dist/services/form-field-patch.js +29 -0
- package/dist/services/form-field-patch.js.map +1 -1
- package/dist/services/form-i18n-label.d.ts +48 -0
- package/dist/services/form-i18n-label.d.ts.map +1 -0
- package/dist/services/form-i18n-label.js +91 -0
- package/dist/services/form-i18n-label.js.map +1 -0
- package/dist/services/form-style-template.d.ts +6 -2
- package/dist/services/form-style-template.d.ts.map +1 -1
- package/dist/services/form-style-template.js +8 -4
- package/dist/services/form-style-template.js.map +1 -1
- package/dist/services/menu-catalog.d.ts +84 -0
- package/dist/services/menu-catalog.d.ts.map +1 -0
- package/dist/services/menu-catalog.js +183 -0
- package/dist/services/menu-catalog.js.map +1 -0
- package/dist/services/workflow-add-step.d.ts +45 -0
- package/dist/services/workflow-add-step.d.ts.map +1 -0
- package/dist/services/workflow-add-step.js +122 -0
- package/dist/services/workflow-add-step.js.map +1 -0
- package/dist/services/workflow-assign-flow.d.ts +1 -6
- package/dist/services/workflow-assign-flow.d.ts.map +1 -1
- package/dist/services/workflow-assign-flow.js +3 -8
- package/dist/services/workflow-assign-flow.js.map +1 -1
- package/dist/services/workflow-drawback.d.ts +19 -0
- package/dist/services/workflow-drawback.d.ts.map +1 -0
- package/dist/services/workflow-drawback.js +59 -0
- package/dist/services/workflow-drawback.js.map +1 -0
- package/dist/services/workflow-links.d.ts +51 -0
- package/dist/services/workflow-links.d.ts.map +1 -0
- package/dist/services/workflow-links.js +162 -0
- package/dist/services/workflow-links.js.map +1 -0
- package/dist/services/workflow-node-layout.d.ts +45 -4
- package/dist/services/workflow-node-layout.d.ts.map +1 -1
- package/dist/services/workflow-node-layout.js +142 -41
- package/dist/services/workflow-node-layout.js.map +1 -1
- package/dist/services/workflow-odoc-setting.d.ts +43 -0
- package/dist/services/workflow-odoc-setting.d.ts.map +1 -0
- package/dist/services/workflow-odoc-setting.js +100 -0
- package/dist/services/workflow-odoc-setting.js.map +1 -0
- package/dist/services/workflow-tab-config.d.ts +54 -0
- package/dist/services/workflow-tab-config.d.ts.map +1 -0
- package/dist/services/workflow-tab-config.js +137 -0
- package/dist/services/workflow-tab-config.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +48 -48
- package/skill-docs/SKILL.md +7 -7
- package/skill-docs/_catalog.md +2 -0
- package/skill-docs/actionflows/SKILL.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +38 -1
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +42 -0
- package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +1 -1
- package/skill-docs/actionflows/references/components/logic/Output.md +2 -0
- package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +16 -11
- package/skill-docs/assets/dom-structure/Bar.json +341 -0
- package/skill-docs/assets/dom-structure/BarStack.json +341 -0
- package/skill-docs/assets/dom-structure/Bubble.json +323 -0
- package/skill-docs/assets/dom-structure/Calendar.json +515 -0
- package/skill-docs/assets/dom-structure/Circular.json +337 -0
- package/skill-docs/assets/dom-structure/CollapsePanel.json +289 -0
- package/skill-docs/assets/dom-structure/Comment.json +617 -0
- package/skill-docs/assets/dom-structure/CountDown.json +755 -0
- package/skill-docs/assets/dom-structure/DigitalPanel.json +191 -0
- package/skill-docs/assets/dom-structure/EbButton.json +387 -0
- package/skill-docs/assets/dom-structure/FastCreate.json +242 -0
- package/skill-docs/assets/dom-structure/Gauge.json +282 -0
- package/skill-docs/assets/dom-structure/HBar.json +336 -0
- package/skill-docs/assets/dom-structure/HBarStack.json +337 -0
- package/skill-docs/assets/dom-structure/Line.json +341 -0
- package/skill-docs/assets/dom-structure/NList.json +712 -0
- package/skill-docs/assets/dom-structure/NavBar.json +274 -0
- package/skill-docs/assets/dom-structure/NavPanel.json +390 -0
- package/skill-docs/assets/dom-structure/NewTab.json +606 -0
- package/skill-docs/assets/dom-structure/Nightingale.json +336 -0
- package/skill-docs/assets/dom-structure/PageHeader.json +205 -0
- package/skill-docs/assets/dom-structure/Picture.json +209 -0
- package/skill-docs/assets/dom-structure/Pie.json +338 -0
- package/skill-docs/assets/dom-structure/ProgressChart.json +299 -0
- package/skill-docs/assets/dom-structure/SearchGlobal.json +628 -0
- package/skill-docs/assets/dom-structure/Slide.json +489 -0
- package/skill-docs/assets/dom-structure/Treemap.json +324 -0
- package/skill-docs/references/common/guide-plan-template.md +1 -1
- package/skill-docs/references/common/ref-cli-commands.md +21 -13
- package/skill-docs/references/ebuilder-designer/guide-designer-components.md +12 -1
- package/skill-docs/references/ebuilder-designer/guide-designer-css.md +127 -0
- package/skill-docs/references/ebuilder-designer/guide-designer.md +6 -5
- package/skill-docs/references/form/guide-create-form.md +1 -1
- package/skill-docs/references/form/guide-form-layout-planning.md +1 -1
- package/skill-docs/references/form/guide-form-linkage.md +28 -2
- package/skill-docs/references/menu/system-menus.md +12 -0
- package/skill-docs/references/workflow/guide-workflow-odoc.md +22 -2
- package/skill-docs/references/workflow/guide-workflow.md +18 -3
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 页面设计器 —— 组件自定义 CSS(纯函数层,可单测)。
|
|
3
|
+
*
|
|
4
|
+
* 落点:`comp.config.styles[0].customStyle.base.codeSource`(自由文本 CSS)。
|
|
5
|
+
* 一个页面有 PC/MOBILE 两套布局,**每个终端各有一份组件**,靠互指 `refCompId` 配对。
|
|
6
|
+
*
|
|
7
|
+
* `styles` 数组里有两种记录,**必须分清**(真机样本 + factory 模板对照得出):
|
|
8
|
+
* - **自由 CSS 记录**:`{category, useCustom:true, useComStyle:false, styleVersion, customStyle:{...}}`
|
|
9
|
+
* - **主题绑定记录**:`{id, category, customType, useCustom:false, themeId, useComStyle:true}`(Picture/CountDown 自带)
|
|
10
|
+
* 两者标志位正好相反。干净组件是 `styles: []`。
|
|
11
|
+
* 本模块**只认自由记录、绝不碰主题记录**。
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ 写入本身是通的(真机确认:最小记录存得进去、回读一模一样、设计器里能看到),
|
|
14
|
+
* 但 `/layout/save` **不会**触发服务端重新编译 `sourceCode.cssCache` —— 编译属平台渲染环节,
|
|
15
|
+
* 不在 CLI 职责内,故这里不做「样式是否已编译」的判断,只保证**写对、写稳、回读一致**。
|
|
16
|
+
*/
|
|
17
|
+
import { randomBytes, randomInt } from 'node:crypto';
|
|
18
|
+
/**
|
|
19
|
+
* 新建自由 CSS 记录时用的骨架。
|
|
20
|
+
*
|
|
21
|
+
* 真机验证:**只有这四项 + `customStyle.base.codeSource` 就能存进去**,服务端不会补字段,
|
|
22
|
+
* 也不是必须把 `customStyle` 的 title/content/footer/container 都填上。
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_FREE_RECORD = Object.freeze({
|
|
25
|
+
category: '1',
|
|
26
|
+
useCustom: true,
|
|
27
|
+
useComStyle: false,
|
|
28
|
+
styleVersion: '1',
|
|
29
|
+
});
|
|
30
|
+
/** 主题绑定记录:一定不碰。 */
|
|
31
|
+
export function isThemeBound(record) {
|
|
32
|
+
if (!record || typeof record !== 'object')
|
|
33
|
+
return true;
|
|
34
|
+
if (record.useComStyle === true)
|
|
35
|
+
return true;
|
|
36
|
+
return record.themeId !== undefined && record.themeId !== null && record.themeId !== '';
|
|
37
|
+
}
|
|
38
|
+
/** 定位自由 CSS 记录:优先看 `customStyle`,其次看 `useComStyle === false`。找不到返回 null。 */
|
|
39
|
+
export function findFreeCssRecord(comp) {
|
|
40
|
+
const styles = comp?.config?.styles;
|
|
41
|
+
if (!Array.isArray(styles) || !styles.length)
|
|
42
|
+
return null;
|
|
43
|
+
const byCustom = styles.findIndex((r) => r && typeof r === 'object' && r.customStyle && typeof r.customStyle === 'object' && !isThemeBound(r));
|
|
44
|
+
if (byCustom >= 0)
|
|
45
|
+
return { record: styles[byCustom], index: byCustom };
|
|
46
|
+
const byFlag = styles.findIndex((r) => r && typeof r === 'object' && r.useComStyle === false && !isThemeBound(r));
|
|
47
|
+
return byFlag >= 0 ? { record: styles[byFlag], index: byFlag } : null;
|
|
48
|
+
}
|
|
49
|
+
/** 读组件的自定义 CSS;没有则空串。 */
|
|
50
|
+
export function readCustomCss(comp) {
|
|
51
|
+
const hit = findFreeCssRecord(comp);
|
|
52
|
+
const src = hit?.record?.customStyle?.base?.codeSource;
|
|
53
|
+
return typeof src === 'string' ? src : '';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 算出写入后的 `styles` 数组。**返回新数组、不改入参。**
|
|
57
|
+
*
|
|
58
|
+
* - 已有自由记录 → **外科式**只换 `customStyle.base.codeSource`,`customStyle` 下其它块
|
|
59
|
+
* (title/content/footer/container)与记录的其它字段原样保留。
|
|
60
|
+
* - 只有主题绑定记录(或无记录)→ **追加**一条新记录,不动已有的。
|
|
61
|
+
*/
|
|
62
|
+
export function buildCustomCssPatch(comp, css, o = {}) {
|
|
63
|
+
const input = typeof css === 'string' ? css : '';
|
|
64
|
+
const existing = Array.isArray(comp?.config?.styles) ? comp.config.styles : [];
|
|
65
|
+
const before = readCustomCss(comp);
|
|
66
|
+
let after;
|
|
67
|
+
if (o.clear)
|
|
68
|
+
after = '';
|
|
69
|
+
else if (o.append && before.trim())
|
|
70
|
+
after = `${before.replace(/\s+$/, '')}\n\n${input}`;
|
|
71
|
+
else
|
|
72
|
+
after = input;
|
|
73
|
+
const hit = findFreeCssRecord(comp);
|
|
74
|
+
if (hit) {
|
|
75
|
+
const styles = existing.map((r, i) => (i === hit.index
|
|
76
|
+
? { ...r, customStyle: { ...(r.customStyle || {}), base: { ...((r.customStyle || {}).base || {}), codeSource: after } } }
|
|
77
|
+
: r));
|
|
78
|
+
return { styles, before, after, created: false, recordIndex: hit.index };
|
|
79
|
+
}
|
|
80
|
+
const styles = [...existing, { ...DEFAULT_FREE_RECORD, customStyle: { base: { codeSource: after } } }];
|
|
81
|
+
return { styles, before, after, created: true, recordIndex: existing.length };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 归一化:去注释、压空白、抹平结构符号周围的空格。
|
|
85
|
+
* 只用于**比对**,不用于落库 —— 编译器本身会去掉注释,我们写的原文要原样保存。
|
|
86
|
+
*/
|
|
87
|
+
export function normalizeCss(css) {
|
|
88
|
+
return String(css ?? '')
|
|
89
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
90
|
+
.replace(/\s+/g, ' ')
|
|
91
|
+
.replace(/\s*([{};:,])\s*/g, '$1')
|
|
92
|
+
.trim();
|
|
93
|
+
}
|
|
94
|
+
/** 两份 CSS 在归一化后是否等价。 */
|
|
95
|
+
export function sameCss(a, b) {
|
|
96
|
+
return normalizeCss(a) === normalizeCss(b);
|
|
97
|
+
}
|
|
98
|
+
/** 兼容大小写与 `ebd_page`/`ebd_style_lib` 之外的写法差异的终端名归一。 */
|
|
99
|
+
function terminalOf(layout) {
|
|
100
|
+
const t = String(layout?.terminalType || '').toUpperCase();
|
|
101
|
+
return t === 'PC' || t === 'MOBILE' ? t : '';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 由**任一端**的 compId 解出要写的目标组件。
|
|
105
|
+
*
|
|
106
|
+
* 设计器本身就是双端同写(真机:一次编写两端 `codeSource` 一模一样),所以默认也是双端。
|
|
107
|
+
* 允许传移动端的 id(用户在移动端设计器里复制到的是那一个),按 `refCompId` 反查 PC 端。
|
|
108
|
+
*/
|
|
109
|
+
export function resolveCssTargets(layouts, compId, terminal = 'both') {
|
|
110
|
+
const id = String(compId || '').trim();
|
|
111
|
+
if (!id)
|
|
112
|
+
throw new Error('缺少组件 ID');
|
|
113
|
+
const pc = layouts.find((l) => terminalOf(l) === 'PC');
|
|
114
|
+
const mobile = layouts.find((l) => terminalOf(l) === 'MOBILE');
|
|
115
|
+
const pcComps = pc?.comps || [];
|
|
116
|
+
const mobComps = mobile?.comps || [];
|
|
117
|
+
const hitPc = pcComps.find((c) => String(c?.id) === id);
|
|
118
|
+
const hitMob = mobComps.find((c) => String(c?.id) === id);
|
|
119
|
+
if (!hitPc && !hitMob)
|
|
120
|
+
throw new Error(`未找到组件 ${id}(用 designer layout <pageId> --json 查组件 id)`);
|
|
121
|
+
// 任一端命中后,用 refCompId 把另一端配出来
|
|
122
|
+
const anchorPc = hitPc || pcComps.find((c) => String(c?.id) === String(hitMob?.refCompId));
|
|
123
|
+
const anchorMob = hitMob || mobComps.find((c) => String(c?.id) === String(hitPc?.refCompId));
|
|
124
|
+
const out = [];
|
|
125
|
+
if ((terminal === 'pc' || terminal === 'both') && anchorPc && pc)
|
|
126
|
+
out.push({ terminal: 'PC', comp: anchorPc, layout: pc });
|
|
127
|
+
if ((terminal === 'mobile' || terminal === 'both') && anchorMob && mobile)
|
|
128
|
+
out.push({ terminal: 'MOBILE', comp: anchorMob, layout: mobile });
|
|
129
|
+
if (!out.length) {
|
|
130
|
+
throw new Error(`组件 ${id} 在 ${terminal} 端不存在(该页只有 ${[pc && 'PC', mobile && 'MOBILE'].filter(Boolean).join('/')})`);
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 两端现有的自定义 CSS 是否已经分叉(都非空且不一致)。
|
|
136
|
+
*
|
|
137
|
+
* 双端同写会覆盖掉其中一端,分叉说明有人单独改过 —— 调用方须据此要一次确认。
|
|
138
|
+
*/
|
|
139
|
+
export function terminalConflict(targets) {
|
|
140
|
+
const filled = targets
|
|
141
|
+
.map((t) => ({ terminal: t.terminal, id: String(t.comp?.id || ''), css: readCustomCss(t.comp) }))
|
|
142
|
+
.filter((x) => x.css.trim() !== '');
|
|
143
|
+
if (filled.length < 2)
|
|
144
|
+
return { conflict: false, detail: '' };
|
|
145
|
+
const first = normalizeCss(filled[0].css);
|
|
146
|
+
const diverged = filled.some((x) => normalizeCss(x.css) !== first);
|
|
147
|
+
if (!diverged)
|
|
148
|
+
return { conflict: false, detail: '' };
|
|
149
|
+
return {
|
|
150
|
+
conflict: true,
|
|
151
|
+
detail: filled.map((x) => `${x.terminal}(${x.id.slice(0, 12)}) ${Buffer.byteLength(x.css, 'utf-8')} 字节`).join(','),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** 组件在页面里的展示名(回显用)。 */
|
|
155
|
+
export function describeComp(comp) {
|
|
156
|
+
return [comp?.type, comp?.id ? String(comp.id).slice(0, 12) : ''].filter(Boolean).join(' ');
|
|
157
|
+
}
|
|
158
|
+
/** 供命令层生成占位名/调试用(与 designer-common 同款:首位字母,其余 hex)。 */
|
|
159
|
+
export function genProbeId(length = 8) {
|
|
160
|
+
const tail = randomBytes(Math.ceil((length - 1) / 2)).toString('hex').slice(0, length - 1);
|
|
161
|
+
return 'abcdef'[randomInt(6)] + tail;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=designer-css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer-css.js","sourceRoot":"","sources":["../../src/services/designer-css.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文档目录解析顺序(与 designer factoryDirs 同款四层):
|
|
3
|
+
* npm 包 → 仓库源码 → 已装 skill(workbuddy / claude)。
|
|
4
|
+
*/
|
|
5
|
+
export declare function domStructureDirs(): string[];
|
|
6
|
+
/** 把用户给的类型/名称解成规范 type;解不出时报错并列出已覆盖的组件。 */
|
|
7
|
+
export declare function typeToFile(input: string): string;
|
|
8
|
+
export interface DomEntry {
|
|
9
|
+
type: string;
|
|
10
|
+
file: string;
|
|
11
|
+
path: string;
|
|
12
|
+
/** 文档自述的组件名(`component` 字段)。 */
|
|
13
|
+
display: string;
|
|
14
|
+
bytes: number;
|
|
15
|
+
/** 顶层区块与各自字节数,供按需取用。 */
|
|
16
|
+
sections: Array<{
|
|
17
|
+
key: string;
|
|
18
|
+
bytes: number;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/** 列出全部可用文档(运行时扫描,不落索引文件,免得再多一份要同步的东西)。 */
|
|
22
|
+
export declare function listDomStructures(): DomEntry[];
|
|
23
|
+
export interface DomDoc extends DomEntry {
|
|
24
|
+
doc: any;
|
|
25
|
+
}
|
|
26
|
+
/** 取一份文档(input 可以是平台 type,也可以是常见写法)。 */
|
|
27
|
+
export declare function readDomStructure(input: string): DomDoc;
|
|
28
|
+
/** 取顶层区块或子路径,如 `shared` / `shared.title` / `branches.btn-pc.root`。 */
|
|
29
|
+
export declare function sectionOf(doc: any, path: string): any;
|
|
30
|
+
/**
|
|
31
|
+
* 统一取出根树。容忍三种 `root` 形态与 eb-button 的 `branches`。
|
|
32
|
+
* 返回的每一项是 `{name, node}`;`name` 用于回显(`root` / `branches.<分支>`)。
|
|
33
|
+
*/
|
|
34
|
+
export declare function domRoots(doc: any): Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
node: any;
|
|
37
|
+
}>;
|
|
38
|
+
/** `class` 归一:字符串按空白切、数组原样收,统一返回字符串数组。 */
|
|
39
|
+
export declare function classList(node: any): string[];
|
|
40
|
+
/** 就地展开 `{ref:"shared.x"}` / `"ref:shared.x"`;解不出或成环时原样返回,不抛。 */
|
|
41
|
+
export declare function deref(node: any, shared: any, seen?: Set<string>): any;
|
|
42
|
+
//# sourceMappingURL=dom-structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-structure.d.ts","sourceRoot":"","sources":["../../src/services/dom-structure.ts"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAW3C;AA0CD,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAahD;AAaD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,IAAI,QAAQ,EAAE,CA0B9C;AAED,MAAM,WAAW,MAAO,SAAQ,QAAQ;IAAG,GAAG,EAAE,GAAG,CAAA;CAAE;AAErD,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBtD;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAYrD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC,CAerE;AAED,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,CAK7C;AAED,iEAAiE;AACjE,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAmBhF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 组件 DOM 结构索引 —— 写页面组件自定义 CSS 时用来找选择器。
|
|
3
|
+
*
|
|
4
|
+
* 每份文档回答一件事:**「给这个组件的某一部分设样式」该选谁**。
|
|
5
|
+
* 它**不是完整 DOM 树**,是「样式定位索引」:`usage`/`pickTree`/`legend` 是散文说明,
|
|
6
|
+
* 树上的 `class` 才是选择器材料。所以默认输出原样 JSON,让调用方读散文,不做加工。
|
|
7
|
+
*
|
|
8
|
+
* 记号(各文件自己的 `legend` 里有解释):
|
|
9
|
+
* `[cls]` 条件类名,满足条件才挂
|
|
10
|
+
* `{a|b}` 同一个位置二选一
|
|
11
|
+
* `a > b` 父子层级压缩写法
|
|
12
|
+
* `<comId>` 占位符,替换成页面里该组件的实例 id
|
|
13
|
+
* `ref:shared.x` / `{"ref":"shared.x"}` 引用同文件的复用片段
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ 源文档由人工整理,形态**不统一**,读取端必须容忍:
|
|
16
|
+
* - `root` 有三种形态:`{desc,tree}` / 普通节点 / eb-button 的占位壳
|
|
17
|
+
* - eb-button 把各分支树放在 `branches.<名字>.root`,其余组件放在顶层
|
|
18
|
+
* - `class` 有字符串(图表类)和数组(widget 类)两种
|
|
19
|
+
* 故 `domRoots` / `classList` / `deref` 都做归一,调用方不必自己分支。
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
22
|
+
import { resolve, basename } from 'node:path';
|
|
23
|
+
import { dirname } from 'node:path';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
/**
|
|
28
|
+
* 文档目录解析顺序(与 designer factoryDirs 同款四层):
|
|
29
|
+
* npm 包 → 仓库源码 → 已装 skill(workbuddy / claude)。
|
|
30
|
+
*/
|
|
31
|
+
export function domStructureDirs() {
|
|
32
|
+
const home = homedir();
|
|
33
|
+
return [
|
|
34
|
+
// npm 包:dist/services → dist → 包根 → skill-docs/assets/dom-structure
|
|
35
|
+
resolve(__dirname, '..', '..', 'skill-docs', 'assets', 'dom-structure'),
|
|
36
|
+
// 仓库源码布局:<repo>/skills/weaver-e10-builder/assets/dom-structure
|
|
37
|
+
resolve(__dirname, '..', '..', '..', '..', 'skills', 'weaver-e10-builder', 'assets', 'dom-structure'),
|
|
38
|
+
// 已装 skill(auth status 会从 skill-docs 同步 assets)
|
|
39
|
+
resolve(home, '.workbuddy', 'skills', 'weaver-e10-builder', 'assets', 'dom-structure'),
|
|
40
|
+
resolve(home, '.claude', 'skills', 'weaver-e10-builder', 'assets', 'dom-structure'),
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
function primaryDir() {
|
|
44
|
+
for (const dir of domStructureDirs())
|
|
45
|
+
if (existsSync(dir))
|
|
46
|
+
return dir;
|
|
47
|
+
throw new Error(`找不到组件 DOM 结构文档目录。查过:\n ${domStructureDirs().join('\n ')}`);
|
|
48
|
+
}
|
|
49
|
+
/** 文件名一律以**平台组件 type** 命名(见 guide-designer-css 的对照表)。 */
|
|
50
|
+
function domFiles() {
|
|
51
|
+
const dir = primaryDir();
|
|
52
|
+
const out = new Map();
|
|
53
|
+
for (const f of readdirSync(dir)) {
|
|
54
|
+
if (!f.toLowerCase().endsWith('.json'))
|
|
55
|
+
continue;
|
|
56
|
+
const type = basename(f, '.json');
|
|
57
|
+
out.set(type.toLowerCase(), type);
|
|
58
|
+
out.set(type.toLowerCase().replace(/[^a-z0-9]/g, ''), type);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 少数**源文档名与平台 type 对不上**的,以及常见口语写法。
|
|
64
|
+
* 其余靠「去分隔符 + 忽略大小写」机械命中,不必逐个列。
|
|
65
|
+
*/
|
|
66
|
+
const ALIASES = {
|
|
67
|
+
'progress-bar': 'ProgressChart',
|
|
68
|
+
progressbar: 'ProgressChart',
|
|
69
|
+
'progress-chart': 'ProgressChart',
|
|
70
|
+
'progresschart': 'ProgressChart',
|
|
71
|
+
'n-list': 'NList',
|
|
72
|
+
'digital-panel': 'DigitalPanel',
|
|
73
|
+
'eb-button': 'EbButton',
|
|
74
|
+
'nav-panel': 'NavPanel',
|
|
75
|
+
'nav-bar': 'NavBar',
|
|
76
|
+
'new-tab': 'NewTab',
|
|
77
|
+
'count-down': 'CountDown',
|
|
78
|
+
'fast-create': 'FastCreate',
|
|
79
|
+
'search-global': 'SearchGlobal',
|
|
80
|
+
'collapse-panel': 'CollapsePanel',
|
|
81
|
+
'page-header': 'PageHeader',
|
|
82
|
+
};
|
|
83
|
+
/** 把用户给的类型/名称解成规范 type;解不出时报错并列出已覆盖的组件。 */
|
|
84
|
+
export function typeToFile(input) {
|
|
85
|
+
const raw = String(input ?? '').trim();
|
|
86
|
+
if (!raw)
|
|
87
|
+
throw new Error('缺少组件类型或名称');
|
|
88
|
+
if (ALIASES[raw])
|
|
89
|
+
return ALIASES[raw];
|
|
90
|
+
const lower = raw.toLowerCase();
|
|
91
|
+
if (ALIASES[lower])
|
|
92
|
+
return ALIASES[lower];
|
|
93
|
+
const files = domFiles();
|
|
94
|
+
const compact = lower.replace(/[^a-z0-9]/g, '');
|
|
95
|
+
const hit = files.get(lower) || files.get(compact);
|
|
96
|
+
if (hit)
|
|
97
|
+
return hit;
|
|
98
|
+
throw new Error(`暂无「${raw}」的 DOM 结构文档。已覆盖 ${[...new Set(files.values())].sort().join('、')}`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 文档自述的组件名。**形态不统一**:多数是字符串,Calendar 之类是
|
|
102
|
+
* `{name, pkg, entries, ...}` 对象,所以取 `name` 兜底。
|
|
103
|
+
*/
|
|
104
|
+
function displayOf(doc) {
|
|
105
|
+
const c = doc?.component;
|
|
106
|
+
if (typeof c === 'string')
|
|
107
|
+
return c;
|
|
108
|
+
if (c && typeof c === 'object')
|
|
109
|
+
return String(c.name ?? c.component ?? c.type ?? '');
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
112
|
+
/** 列出全部可用文档(运行时扫描,不落索引文件,免得再多一份要同步的东西)。 */
|
|
113
|
+
export function listDomStructures() {
|
|
114
|
+
const dir = primaryDir();
|
|
115
|
+
const out = [];
|
|
116
|
+
for (const f of readdirSync(dir)) {
|
|
117
|
+
if (!f.toLowerCase().endsWith('.json'))
|
|
118
|
+
continue;
|
|
119
|
+
const p = resolve(dir, f);
|
|
120
|
+
let doc = null;
|
|
121
|
+
let bytes = 0;
|
|
122
|
+
try {
|
|
123
|
+
const text = readFileSync(p, 'utf-8');
|
|
124
|
+
bytes = Buffer.byteLength(text, 'utf-8');
|
|
125
|
+
doc = JSON.parse(text);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
out.push({
|
|
131
|
+
type: basename(f, '.json'),
|
|
132
|
+
file: f,
|
|
133
|
+
path: p,
|
|
134
|
+
display: displayOf(doc),
|
|
135
|
+
bytes,
|
|
136
|
+
sections: Object.entries(doc || {}).map(([key, v]) => ({
|
|
137
|
+
key,
|
|
138
|
+
bytes: Buffer.byteLength(JSON.stringify(v) ?? '', 'utf-8'),
|
|
139
|
+
})),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return out.sort((a, b) => a.type.localeCompare(b.type, 'en'));
|
|
143
|
+
}
|
|
144
|
+
/** 取一份文档(input 可以是平台 type,也可以是常见写法)。 */
|
|
145
|
+
export function readDomStructure(input) {
|
|
146
|
+
const type = typeToFile(input);
|
|
147
|
+
const dir = primaryDir();
|
|
148
|
+
const path = resolve(dir, `${type}.json`);
|
|
149
|
+
if (!existsSync(path))
|
|
150
|
+
throw new Error(`文档文件缺失:${path}`);
|
|
151
|
+
const text = readFileSync(path, 'utf-8');
|
|
152
|
+
let doc;
|
|
153
|
+
try {
|
|
154
|
+
doc = JSON.parse(text);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
throw new Error(`${type}.json 解析失败:${e?.message || e}`);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
type,
|
|
161
|
+
file: `${type}.json`,
|
|
162
|
+
path,
|
|
163
|
+
display: displayOf(doc),
|
|
164
|
+
bytes: Buffer.byteLength(text, 'utf-8'),
|
|
165
|
+
sections: Object.entries(doc || {}).map(([key, v]) => ({
|
|
166
|
+
key,
|
|
167
|
+
bytes: Buffer.byteLength(JSON.stringify(v) ?? '', 'utf-8'),
|
|
168
|
+
})),
|
|
169
|
+
doc,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/** 取顶层区块或子路径,如 `shared` / `shared.title` / `branches.btn-pc.root`。 */
|
|
173
|
+
export function sectionOf(doc, path) {
|
|
174
|
+
const keys = String(path || '').split('.').filter(Boolean);
|
|
175
|
+
if (!keys.length)
|
|
176
|
+
throw new Error('缺少区块路径');
|
|
177
|
+
let cur = doc;
|
|
178
|
+
for (const k of keys) {
|
|
179
|
+
if (cur === null || typeof cur !== 'object' || !(k in cur)) {
|
|
180
|
+
const avail = cur && typeof cur === 'object' ? Object.keys(cur).slice(0, 20).join('、') : '(非对象)';
|
|
181
|
+
throw new Error(`文档里不存在「${path}」(在「${k}」处断了;该层可用键:${avail})`);
|
|
182
|
+
}
|
|
183
|
+
cur = cur[k];
|
|
184
|
+
}
|
|
185
|
+
return cur;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 统一取出根树。容忍三种 `root` 形态与 eb-button 的 `branches`。
|
|
189
|
+
* 返回的每一项是 `{name, node}`;`name` 用于回显(`root` / `branches.<分支>`)。
|
|
190
|
+
*/
|
|
191
|
+
export function domRoots(doc) {
|
|
192
|
+
const out = [];
|
|
193
|
+
const root = doc?.root;
|
|
194
|
+
if (root && typeof root === 'object') {
|
|
195
|
+
// `{desc, tree}` 形态:把真正的树取出来
|
|
196
|
+
out.push({ name: 'root', node: root.tree && typeof root.tree === 'object' ? root.tree : root });
|
|
197
|
+
}
|
|
198
|
+
const branches = doc?.branches;
|
|
199
|
+
if (branches && typeof branches === 'object' && !Array.isArray(branches)) {
|
|
200
|
+
for (const [k, v] of Object.entries(branches)) {
|
|
201
|
+
const node = v?.root ?? v;
|
|
202
|
+
if (node && typeof node === 'object')
|
|
203
|
+
out.push({ name: `branches.${k}`, node });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
/** `class` 归一:字符串按空白切、数组原样收,统一返回字符串数组。 */
|
|
209
|
+
export function classList(node) {
|
|
210
|
+
const c = node?.class ?? node?.className;
|
|
211
|
+
if (Array.isArray(c))
|
|
212
|
+
return c.map((x) => String(x ?? '')).filter(Boolean);
|
|
213
|
+
if (typeof c === 'string')
|
|
214
|
+
return c.split(/\s+/).filter(Boolean);
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
/** 就地展开 `{ref:"shared.x"}` / `"ref:shared.x"`;解不出或成环时原样返回,不抛。 */
|
|
218
|
+
export function deref(node, shared, seen = new Set()) {
|
|
219
|
+
if (typeof node === 'string') {
|
|
220
|
+
const m = /^ref:(.+)$/.exec(node.trim());
|
|
221
|
+
if (!m)
|
|
222
|
+
return node;
|
|
223
|
+
const hit = resolveRef(m[1].trim(), shared, seen);
|
|
224
|
+
return hit === undefined ? node : hit;
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(node))
|
|
227
|
+
return node.map((x) => deref(x, shared, seen));
|
|
228
|
+
if (!node || typeof node !== 'object')
|
|
229
|
+
return node;
|
|
230
|
+
const ref = node.ref ?? node.$ref;
|
|
231
|
+
if (typeof ref === 'string' && Object.keys(node).length <= 2) {
|
|
232
|
+
const hit = resolveRef(ref, shared, seen);
|
|
233
|
+
return hit === undefined ? { ...node } : hit; // 解不出保持原样,不换成标记串
|
|
234
|
+
}
|
|
235
|
+
const out = {};
|
|
236
|
+
for (const [k, v] of Object.entries(node)) {
|
|
237
|
+
out[k] = k === 'ref' || k === '$ref' ? v : deref(v, shared, seen);
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
/** 解不到(不存在 / 成环)返回 undefined,由调用方决定怎么保留。 */
|
|
242
|
+
function resolveRef(ref, shared, seen) {
|
|
243
|
+
const key = String(ref || '').replace(/^shared\./, '');
|
|
244
|
+
if (seen.has(key))
|
|
245
|
+
return undefined;
|
|
246
|
+
if (!shared || typeof shared !== 'object' || !(key in shared))
|
|
247
|
+
return undefined;
|
|
248
|
+
seen.add(key);
|
|
249
|
+
return deref(shared[key], shared, seen);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=dom-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-structure.js","sourceRoot":"","sources":["../../src/services/dom-structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,28 @@
|
|
|
18
18
|
export declare const NO_MAX_LEN_TYPES: readonly ["IDCard", "Date", "DateTime", "Time", "City", "EInvoice", "SelectMultiple"];
|
|
19
19
|
/** 支持「默认值」的类型(文本类写 content,数字类同键)。 */
|
|
20
20
|
export declare const DEFAULT_VALUE_TYPES: readonly ["Text", "TextArea", "Number", "Money"];
|
|
21
|
+
/**
|
|
22
|
+
* CLI 类型名 → **平台归一后的字段形状**(`type` / `componentKey` / 默认 `format`)。
|
|
23
|
+
*
|
|
24
|
+
* 为什么必须归一:`saveFormFieldNew` 要求 `componentKey` 非空,而平台接受的
|
|
25
|
+
* `componentKey` **不是 CLI 类型名**。同一个「日期时间」字段,平台存的是
|
|
26
|
+
* `type=Date` + `componentKey=DateComponent` + `format=yyyy-MM-dd HH:mm`;
|
|
27
|
+
* 送 `componentKey=Date`(哪怕 `type=DateTime`)直接 500 程序异常。
|
|
28
|
+
*
|
|
29
|
+
* 这张表不是推的,是拿真实租户读回来的 —— 建表路径建出来的字段,平台实际存什么就写什么。
|
|
30
|
+
* 只列**与类型名不同**的那几个,其余原样直通。
|
|
31
|
+
*/
|
|
32
|
+
export declare const PLATFORM_FIELD_SHAPES: Record<string, {
|
|
33
|
+
type: string;
|
|
34
|
+
componentKey: string;
|
|
35
|
+
format?: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** 取某 CLI 类型对应要发送的平台形状;未登记的类型原样直通(`type`/`componentKey` 同为类型名)。 */
|
|
38
|
+
export declare function platformFieldShape(cliType: string): {
|
|
39
|
+
type: string;
|
|
40
|
+
componentKey: string;
|
|
41
|
+
format?: string;
|
|
42
|
+
};
|
|
21
43
|
export interface FieldPatchOpts {
|
|
22
44
|
/** 文本最大长度(字符串形式,来自命令行)。 */
|
|
23
45
|
maxLen?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-patch.d.ts","sourceRoot":"","sources":["../../src/services/form-field-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,uFAEnB,CAAC;AAEX,sCAAsC;AACtC,eAAO,MAAM,mBAAmB,kDAAmD,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,GACjD,YAAY,CA0Dd"}
|
|
1
|
+
{"version":3,"file":"form-field-patch.d.ts","sourceRoot":"","sources":["../../src/services/form-field-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,uFAEnB,CAAC;AAEX,sCAAsC;AACtC,eAAO,MAAM,mBAAmB,kDAAmD,CAAC;AAEpF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAazG,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAE3G;AAED,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,GACjD,YAAY,CA0Dd"}
|
|
@@ -20,6 +20,35 @@ export const NO_MAX_LEN_TYPES = [
|
|
|
20
20
|
];
|
|
21
21
|
/** 支持「默认值」的类型(文本类写 content,数字类同键)。 */
|
|
22
22
|
export const DEFAULT_VALUE_TYPES = ['Text', 'TextArea', 'Number', 'Money'];
|
|
23
|
+
/**
|
|
24
|
+
* CLI 类型名 → **平台归一后的字段形状**(`type` / `componentKey` / 默认 `format`)。
|
|
25
|
+
*
|
|
26
|
+
* 为什么必须归一:`saveFormFieldNew` 要求 `componentKey` 非空,而平台接受的
|
|
27
|
+
* `componentKey` **不是 CLI 类型名**。同一个「日期时间」字段,平台存的是
|
|
28
|
+
* `type=Date` + `componentKey=DateComponent` + `format=yyyy-MM-dd HH:mm`;
|
|
29
|
+
* 送 `componentKey=Date`(哪怕 `type=DateTime`)直接 500 程序异常。
|
|
30
|
+
*
|
|
31
|
+
* 这张表不是推的,是拿真实租户读回来的 —— 建表路径建出来的字段,平台实际存什么就写什么。
|
|
32
|
+
* 只列**与类型名不同**的那几个,其余原样直通。
|
|
33
|
+
*/
|
|
34
|
+
export const PLATFORM_FIELD_SHAPES = {
|
|
35
|
+
// 数字:平台 componentKey 带 Component 后缀(type 仍是 Number)
|
|
36
|
+
Number: { type: 'Number', componentKey: 'NumberComponent' },
|
|
37
|
+
// 日期 / 日期时间:**存储层是同一个东西** —— 都归成 Date/DateComponent,
|
|
38
|
+
// 唯一区别是 format。所以 `--type Date` 与 `--type DateTime` 的差异全在 format 上,
|
|
39
|
+
// 改类型时 format 必须一起写:平台不会补默认值(只送 type+componentKey 会存成 format 为空)。
|
|
40
|
+
Date: { type: 'Date', componentKey: 'DateComponent', format: 'yyyy-MM-dd' },
|
|
41
|
+
DateTime: { type: 'Date', componentKey: 'DateComponent', format: 'yyyy-MM-dd HH:mm' },
|
|
42
|
+
Time: { type: 'Time', componentKey: 'TimeComponent', format: 'HH:mm:ss' },
|
|
43
|
+
// 日期区间:componentKey 与 type 不同名
|
|
44
|
+
DateRange: { type: 'DateRange', componentKey: 'DateInterval' },
|
|
45
|
+
// 附件:平台 type 是 File(componentKey 保持全名)
|
|
46
|
+
FileComponent: { type: 'File', componentKey: 'FileComponent' },
|
|
47
|
+
};
|
|
48
|
+
/** 取某 CLI 类型对应要发送的平台形状;未登记的类型原样直通(`type`/`componentKey` 同为类型名)。 */
|
|
49
|
+
export function platformFieldShape(cliType) {
|
|
50
|
+
return PLATFORM_FIELD_SHAPES[cliType] || { type: cliType, componentKey: cliType };
|
|
51
|
+
}
|
|
23
52
|
/**
|
|
24
53
|
* 平台接口本身比设计器更宽容:`maxLen` 到 10000 都照收(65535 会被拒,
|
|
25
54
|
* 但报的是「表单字段已超限制,不能继续新增字段」——指的是加字段数,与长度无关)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-patch.js","sourceRoot":"","sources":["../../src/services/form-field-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB;CAClE,CAAC;AAEX,sCAAsC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"form-field-patch.js","sourceRoot":"","sources":["../../src/services/form-field-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB;CAClE,CAAC;AAEX,sCAAsC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEpF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA4E;IAC5G,oDAAoD;IACpD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE;IAC3D,qDAAqD;IACrD,oEAAoE;IACpE,kEAAkE;IAClE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE;IAC3E,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACrF,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE;IACzE,+BAA+B;IAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE;IAC9D,uCAAuC;IACvC,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE;CAC/D,CAAC;AAEF,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACpF,CAAC;AAsBD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAC/B,OAA4B,EAAE,IAAoB;IAElD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAExC,uDAAuD;IACvD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAK,gBAAsC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;oBACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,eAAe,yBAAyB,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACzD,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,WAAW,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YACrE,mDAAmD;YACnD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;YACtB,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,KAAK,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,mBAAmB;YACnB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 表单多语言标签(i18n label)。
|
|
3
|
+
*
|
|
4
|
+
* 平台的**文本类配置位**(字段标题、查重规则的提示语等)存的是**标签 id**,不是文本本身。
|
|
5
|
+
* 设计器就是这么存的:先在多语言编辑器里写文案,拿到 `labelid`,再把 `labelid` 存进那个配置位。
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ **不能直接存中文**。查重规则的 `helpContent` 传文本会被服务端拒:
|
|
8
|
+
* `提示内容格式不正确。`(2026-09-24 起后端已加拦截)。实测只要给的是 id,
|
|
9
|
+
* 无论接口走短路径还是双 form 路径、`checkFields` 带不带描述字段,都通。
|
|
10
|
+
*
|
|
11
|
+
* 标签 id 的形状是**负数雪花**(如 `-1318635683985383424`)—— 负数不是异常值,
|
|
12
|
+
* 字段的 `labelObj.title` 用的也是同一种形状。
|
|
13
|
+
*/
|
|
14
|
+
import type { ApiClient } from '../core/client.js';
|
|
15
|
+
export interface LangRow {
|
|
16
|
+
id: string;
|
|
17
|
+
langid?: number;
|
|
18
|
+
langtype: string;
|
|
19
|
+
langName: string;
|
|
20
|
+
value?: string;
|
|
21
|
+
[k: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 读多语言标签的各语言行。
|
|
25
|
+
* `labelId` 传 `'-1'` 拿的是**模板行**(每行有 id/langid/langtype,value 为空),新建标签时用它当底。
|
|
26
|
+
*/
|
|
27
|
+
export declare function readLanguageRows(client: ApiClient, baseUrl: string, labelId: string, module: string): Promise<LangRow[]>;
|
|
28
|
+
/**
|
|
29
|
+
* 新建一个多语言标签,返回它的 `labelid`(负数雪花)。
|
|
30
|
+
*
|
|
31
|
+
* 默认只写简体中文;要同时写英文传 `en`。
|
|
32
|
+
* 报文形状对齐设计器实际发出的那一次(`dialogVisible`/`loading` 都是 `false`、
|
|
33
|
+
* `tabMenuValue` 给的是 **en_US 那一行**、`usernamePerLangs` 里不带「(默认)」后缀)。
|
|
34
|
+
*/
|
|
35
|
+
export declare function createMultilangLabel(client: ApiClient, baseUrl: string, zh: string, module: string, en?: string): Promise<string>;
|
|
36
|
+
/** 配置位里存的是不是多语言标签 id(负数雪花)。**不要**用「是负数」一概而论地判文本。 */
|
|
37
|
+
export declare function looksLikeLabelId(value: unknown): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* 标签写入后有**约 10 秒的延迟才可读**(实测:存完 +7s 仍取回空、+11s 才拿到文本)。
|
|
40
|
+
* 所以「刚建完规则马上 list」会看到原始 id,**这不是 bug**,等一会儿再读就有文本。
|
|
41
|
+
* 命令层不做重试等待 —— 等十秒会让人以为卡住了,而换个时间读就好了。
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* 把配置位里的值还原成人能读的文本:是标签 id 就查回简体中文,否则原样返回。
|
|
45
|
+
* **老数据兼容**:拦截上线前存的规则里 `helpContent` 是中文原文,这条路要能照常显示。
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveLabelText(client: ApiClient, baseUrl: string, value: unknown, module: string): Promise<string>;
|
|
48
|
+
//# sourceMappingURL=form-i18n-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-i18n-label.d.ts","sourceRoot":"","sources":["../../src/services/form-i18n-label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAClE,OAAO,CAAC,OAAO,EAAE,CAAC,CAMpB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAC1E,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;;GAIG;AAEH;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GACjE,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|