ice-entity-designer-dsl 0.0.18 → 0.0.19

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/README.md CHANGED
@@ -46,15 +46,18 @@ The package contains:
46
46
  npm install ice-entity-designer-dsl
47
47
  ```
48
48
 
49
- This installs `ice-entity-designer` as well (the DSL runtime renders through it; the engine
50
- kernel ships bundled in that package). For the browser build, load
51
- `node_modules/ice-entity-designer/dist/index.umd.js` first, then `dist/index.umd.js` see below.
49
+ This installs `ice-entity-designer` as well (the DSL runtime renders through it). The engine
50
+ (`ice-render`) is a **peer dependency** of both packages and stays **external** in the UMD builds
51
+ (`globals: { 'ice-render': 'ICE' }` / `{ 'ice-entity-designer': 'IED' }`), so a plain `<script>`
52
+ page must load the three UMDs **in this order**: `ice-render` → `ice-entity-designer` → `dist/index.umd.js`
53
+ — see below.
52
54
 
53
55
  ## Browser usage
54
56
 
55
57
  ```html
56
58
  <canvas id="canvas" width="1200" height="800"></canvas>
57
59
 
60
+ <script src="node_modules/ice-render/dist/index.umd.js"></script>
58
61
  <script src="node_modules/ice-entity-designer/dist/index.umd.js"></script>
59
62
  <script src="dist/index.umd.js"></script>
60
63
  <script>
@@ -256,6 +259,18 @@ intermediate / end) + `trigger`, gateways carry `gatewayType` (exclusive / paral
256
259
  ## API
257
260
 
258
261
  - `validateDsl(dsl)` —— ER / flowchart / BPMN / UML / statechart / gantt / power documents (dispatches on `kind`); `validateFlowDsl(dsl)` / `validateBpmnDsl(dsl)` / `validateUmlDsl(dsl)` / `validateStatechartDsl(dsl)` / `validateGanttDsl(dsl)` / `validatePowerDsl(dsl)` for one kind only
262
+ - 返回值除了 `{ valid, errors }`(英文句子,给人看)还带 **`diagnostics`**:`{ severity, code, message, path }`,
263
+ 其中 **`code` 才是合同**(`IED_DSL_*`,见 `src/types.ts` 的 `IED_DSL_CODES`),`path` 指出位置(如 `nodes[3].source`)。
264
+ **Agent / 工具请按 `code` 分支、按 `path` 定位**,不要匹配 `message` 里的自然语言 —— 这是
265
+ ice-render [`docs/architecture/17-i18n-boundary.md`](../ice-render/docs/architecture/17-i18n-boundary.md)
266
+ 里那条「库不翻译文案,但必须给稳定 id」的契约。
267
+ - 常用码:`IED_DSL_ROOT_NOT_OBJECT` / `IED_DSL_SCHEMA_VERSION_UNSUPPORTED` / `IED_DSL_ID_INVALID` /
268
+ `IED_DSL_ID_DUPLICATED` / `IED_DSL_NOT_OBJECT` / `IED_DSL_NODES_NOT_ARRAY` / `IED_DSL_EDGES_NOT_ARRAY` /
269
+ `IED_DSL_KIND_INVALID` / `IED_DSL_FIELD_TYPE` / `IED_DSL_FIELD_ENUM` / `IED_DSL_FIELD_FORMAT` /
270
+ `IED_DSL_FIELD_RANGE` / `IED_DSL_EDGE_ENDPOINT_INVALID` / `IED_DSL_EDGE_ENDPOINT_UNKNOWN` /
271
+ `IED_DSL_EDGE_SELF_LOOP` / `IED_DSL_PARENT_INVALID` / `IED_DSL_PARENT_UNKNOWN` / `IED_DSL_PARENT_SELF` /
272
+ `IED_DSL_PARENT_KIND` / `IED_DSL_PARENT_NOT_ALLOWED` / `IED_DSL_ATTACHED_TO_UNKNOWN` /
273
+ `IED_DSL_ATTACHED_TO_NOT_BUSBAR`(完整列表见 `src/types.ts`)。
259
274
  - `compileDsl(dsl)` —— ER document → `Entity` / `Relation` props
260
275
  - `compileFlowDsl(dsl)` —— flowchart document → `FlowNode` / `FlowEdge` props (with layered auto-layout)
261
276
  - `compileBpmnDsl(dsl)` —— BPMN document → `FlowNode` / `FlowEdge` props (container auto-geometry + container-scoped auto-layout)
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("ice-entity-designer");function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const t=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const r=["terminator","process","decision","io"],i=["T","R","B","L","C"],o=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],n=["start","intermediate","end"],s=["none","message","timer","error","terminate"],a=["exclusive","parallel","inclusive","event"],d=["none","user","service","script","send","receive","manual"],l=["sequence","message","association"],p=["initial","final","state","composite"],c=["class","interface","enum"],u=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const r=new Set;e.entities.forEach((e,i)=>{const o=`entities[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):r.add(e.id):t.push(`${o}.id must be a non-empty string`),Array.isArray(e.fields)?e.fields.forEach((e,r)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||t.push(`${o}.fields[${r}].name must be a non-empty string`)}):t.push(`${o}.fields must be an array`)):t.push(`${o} must be an object`)})}else t.push("entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,r)=>{const i=`relations[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||t.push(`${i}.source must be a non-empty string`),"string"==typeof e.target&&e.target.trim()||t.push(`${i}.target must be a non-empty string`)):t.push(`${i} must be an object`)}):t.push("relations must be an array");return{valid:0===t.length,errors:t}}(e)}function validateBpmnDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set,i=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,l)=>{const p=`nodes[${l}]`;if(!e||"object"!=typeof e)return void t.push(`${p} must be an object`);"string"==typeof e.id&&e.id.trim()?r.has(e.id)?t.push(`${p}.id is duplicated: ${e.id}`):(r.add(e.id),i.set(e.id,e.kind||"task")):t.push(`${p}.id must be a non-empty string`),void 0!==e.kind&&-1===o.indexOf(e.kind)&&t.push(`${p}.kind must be one of ${o.join("/")}`),["left","top","width","height"].forEach(r=>{const i=e[r];void 0!==i&&"number"!=typeof i&&t.push(`${p}.${r} must be a number when present`)});[["eventKind",n],["trigger",s],["gatewayType",a],["taskType",d]].forEach(([r,i])=>{const o=e[r];void 0!==o&&-1===i.indexOf(o)&&t.push(`${p}.${r} must be one of ${i.join("/")}`)})}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;if("string"!=typeof e.parent||!e.parent.trim())return void t.push(`${n}.parent must be a non-empty string when present`);if(!r.has(e.parent))return void t.push(`${n}.parent must reference an existing node id`);if(e.parent===e.id)return void t.push(`${n}.parent must not reference itself`);const s=i.get(e.parent);"pool"===e.kind?t.push(`${n}.parent is not allowed on a pool (池是最外层容器)`):"lane"===e.kind&&"pool"!==s?t.push(`${n}.parent must reference a pool`):"pool"!==s&&"lane"!==s&&t.push(`${n}.parent must reference a pool or a lane`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,i)=>{const o=`edges[${i}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&r.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.flowType;void 0!==n&&-1===l.indexOf(n)&&t.push(`${o}.type must be one of ${l.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`),void 0!==e.condition&&"string"!=typeof e.condition&&t.push(`${o}.condition must be a string when present`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${o}.linkShape must be "visio" or "bezier" when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateFlowDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,i)=>{const n=`nodes[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?o.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):o.add(e.id):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===r.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${r.join("/")}`),["left","top","width","height"].forEach(r=>{const i=e[r];void 0!==i&&"number"!=typeof i&&t.push(`${n}.${r} must be a number when present`)})):t.push(`${n} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const n=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&o.has(e.source)||t.push(`${n}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||t.push(`${n}.target must reference an existing node id`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${n}.label must be a string when present`),void 0!==e.sourcePort&&-1===i.indexOf(e.sourcePort)&&t.push(`${n}.sourcePort must be one of ${i.join("/")}`),void 0!==e.targetPort&&-1===i.indexOf(e.targetPort)&&t.push(`${n}.targetPort must be one of ${i.join("/")}`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${n}.linkShape must be "visio" or "bezier" when present`)):t.push(`${n} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateUmlDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,i)=>{const o=`nodes[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):r.add(e.id):t.push(`${o}.id must be a non-empty string`),void 0!==e.kind&&-1===c.indexOf(e.kind)&&t.push(`${o}.kind must be one of ${c.join("/")}`),["attributes","methods"].forEach(r=>{const i=e[r];void 0!==i&&(Array.isArray(i)&&!i.some(e=>"string"!=typeof e)||t.push(`${o}.${r} must be an array of strings when present`))}),["left","top","width","height"].forEach(r=>{const i=e[r];void 0!==i&&"number"!=typeof i&&t.push(`${o}.${r} must be a number when present`)})):t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,i)=>{const o=`edges[${i}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&r.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.relation;void 0!==n&&-1===u.indexOf(n)&&t.push(`${o}.type must be one of ${u.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateStatechartDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set,i=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,o)=>{const n=`nodes[${o}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):(r.add(e.id),i.set(e.id,e.kind||"state")):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===p.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${p.join("/")}`),["left","top","width","height"].forEach(r=>{const i=e[r];void 0!==i&&"number"!=typeof i&&t.push(`${n}.${r} must be a number when present`)})):t.push(`${n} must be an object`)}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;"string"==typeof e.parent&&e.parent.trim()&&r.has(e.parent)?e.parent!==e.id?"composite"!==i.get(e.parent)&&t.push(`${n}.parent must reference a composite state`):t.push(`${n}.parent must not reference itself`):t.push(`${n}.parent must reference an existing node id`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,i)=>{const o=`edges[${i}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&r.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||t.push(`${o}.target must reference an existing node id`),["event","guard","action","label"].forEach(r=>{const i=e[r];void 0!==i&&"string"!=typeof i&&t.push(`${o}.${r} must be a string when present`)})):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateGanttDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,i)=>{const o=`nodes[${i}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?r.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):r.add(e.id):t.push(`${o}.id must be a non-empty string`),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||t.push(`${o}.start must be a "YYYY-MM-DD" string`),void 0===e.days||Number(e.days)>=1||t.push(`${o}.days must be a number >= 1 when present`),void 0!==e.progress){const r=Number(e.progress);r>=0&&r<=1||t.push(`${o}.progress must be between 0 and 1 when present`)}void 0===e.row||Number(e.row)>=0||t.push(`${o}.row must be a number >= 0 when present`)}else t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,i)=>{const o=`edges[${i}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&r.has(e.source)||t.push(`${o}.source must reference an existing task id`),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||t.push(`${o}.target must reference an existing task id`)):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validatePowerDsl(e){const r=[],i=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||r.push("nodes must be an array");const o=new Set;return i.forEach((e,i)=>{const n=`nodes[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?o.has(e.id)?r.push(`duplicated node id: ${e.id}`):o.add(e.id):r.push(`${n}.id must be a non-empty string`),-1===t.indexOf(e.kind)&&r.push(`${n}.kind must be one of ${t.join(" / ")}`),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||r.push(`${n}.voltageLevel must look like "110kV"`)):r.push(`${n} must be an object`)}),i.forEach((e,t)=>{if(!e||void 0===e.attachedTo)return;const o=i.find(t=>t&&t.id===e.attachedTo);o?"busbar"!==o.kind&&r.push(`nodes[${t}].attachedTo must point at a busbar: ${e.attachedTo} is ${o.kind}`):r.push(`nodes[${t}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;e&&"object"==typeof e?(o.has(e.source)||r.push(`${i}.source references an unknown node: ${e.source}`),o.has(e.target)||r.push(`${i}.target references an unknown node: ${e.target}`),e.source===e.target&&r.push(`${i} must not connect a node to itself`)):r.push(`${i} must be an object`)}),{valid:0===r.length,errors:r}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,r={}){const i=Number(r.gapX)||90,o=Number(r.gapY)||90,n=void 0===r.originX?80:r.originX,s=void 0===r.originY?80:r.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,p=new Map;e.forEach(e=>{l.set(e.id,0),p.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),p.get(e.sourceId).push(e.targetId))});const c=new Map,u=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(c.set(e.id,0),u.push(e.id))}),u.length||(c.set(e[0].id,0),u.push(e[0].id));let h=e.length*e.length+e.length;for(;u.length&&h-- >0;){const e=u.shift(),t=c.get(e)||0;(p.get(e)||[]).forEach(e=>{const r=t+1;(void 0===c.get(e)?-1:c.get(e))<r&&(c.set(e,r),u.push(e))})}e.forEach(e=>{c.has(e.id)||c.set(e.id,0)});const f=new Map;e.forEach(e=>{const t=c.get(e.id)||0;f.has(t)||f.set(t,[]),f.get(t).push(e)});const m=[...f.keys()].sort((e,t)=>e-t);if("horizontal"===r.direction){const e=m.map(e=>Math.max(...f.get(e).map(e=>e.width)));let t=0;m.forEach((r,n)=>{const s=f.get(r);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(r=>{a.set(r.id,{left:Math.round(t+(e[n]-r.width)/2),top:Math.round(d)}),d+=r.height+o}),t+=e[n]+i})}else{const e=m.map(e=>Math.max(...f.get(e).map(e=>e.height)));let t=0;m.forEach((r,n)=>{const s=f.get(r);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*i)/2;s.forEach(r=>{a.set(r.id,{left:Math.round(d),top:Math.round(t+(e[n]-r.height)/2)}),d+=r.width+i}),t+=e[n]+o})}const g=Math.min(...e.map(e=>a.get(e.id).left)),y=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-g,e.top+=s-y}),a}const h={terminator:{width:e.FLOW_NODE_KINDS.terminator.width,height:e.FLOW_NODE_KINDS.terminator.height,fill:e.FLOW_NODE_KINDS.terminator.fill,stroke:e.FLOW_NODE_KINDS.terminator.stroke},process:{width:e.FLOW_NODE_KINDS.process.width,height:e.FLOW_NODE_KINDS.process.height,fill:e.FLOW_NODE_KINDS.process.fill,stroke:e.FLOW_NODE_KINDS.process.stroke},decision:{width:e.FLOW_NODE_KINDS.decision.width,height:e.FLOW_NODE_KINDS.decision.height,fill:e.FLOW_NODE_KINDS.decision.fill,stroke:e.FLOW_NODE_KINDS.decision.stroke},io:{width:e.FLOW_NODE_KINDS.io.width,height:e.FLOW_NODE_KINDS.io.height,fill:e.FLOW_NODE_KINDS.io.fill,stroke:e.FLOW_NODE_KINDS.io.stroke}};function compileFlowDsl(t){const r=t.options||{},i=(t.nodes||[]).map(t=>{const r=function nodeKind$1(e){return e.kind&&h[e.kind]?e.kind:"process"}(t),i=h[r];return{id:t.id,typeId:e.FlowNode.typeId,kind:r,title:(o=t,o.title||o.name||o.id),left:"number"==typeof t.left?t.left:Number.NaN,top:"number"==typeof t.top?t.top:Number.NaN,width:"number"==typeof t.width?t.width:i.width,height:"number"==typeof t.height?t.height:i.height,fillColor:t.fillColor||i.fill,strokeColor:t.strokeColor||i.stroke};var o}),o=(t.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=r.layout||"layered";return"none"!==n&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,r,i){const o=layeredLayout(e,t,{gapX:r,gapY:i});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(i,o,Number(r.gapX)||90,Number(r.gapY)||90)),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:i,edges:o,layout:n,options:r}}const f={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},m=Number(e.FLOW_NODE_KINDS.bpmnPool.bandSize)||32,g=Number(e.FLOW_NODE_KINDS.bpmnLane.bandSize)||32,y=Number(e.FLOW_NODE_KINDS.bpmnLane.height)||130,b=Number(e.FLOW_NODE_KINDS.bpmnPool.width)||900,w=28;function toWorkingNode(t){const r=t.kind||"task",i=function presetOf(t){return e.FLOW_NODE_KINDS[t]||e.FLOW_NODE_KINDS.bpmnTask}(f[r]||"bpmnTask"),o={id:t.id,typeId:e.FlowNode.typeId,kind:f[r]||"bpmnTask",title:t.title||t.name||t.id,left:"number"==typeof t.left?t.left:0,top:"number"==typeof t.top?t.top:0,width:"number"==typeof t.width?t.width:i.width,height:"number"==typeof t.height?t.height:i.height,fillColor:t.fillColor,strokeColor:t.strokeColor,dslKind:r,parent:t.parent,explicitLeft:"number"==typeof t.left,explicitTop:"number"==typeof t.top,explicitWidth:"number"==typeof t.width,explicitHeight:"number"==typeof t.height};return"event"===r&&(o.eventKind=t.eventKind||i.eventKind||"start",o.trigger=t.trigger||i.trigger||"none"),"gateway"===r&&(o.gatewayType=t.gatewayType||i.gatewayType||"exclusive"),"task"!==r&&"subprocess"!==r||(o.taskType=t.taskType||i.taskType||"none"),o}function buildGroups(e,t){const r=new Map;t.forEach(e=>r.set(e.id,e));const i=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?r.get(e.parent):void 0)||i).nodes.push(e)}),o}function layoutGroups(e,t,r,i){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:r,gapY:i,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,r=1/0,i=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),r=Math.min(r,e.top),i=Math.max(i,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:r,maxX:i,maxY:o}}(e.nodes)})}function compileBpmnDsl(t){const r=t.options||{},i=(t.nodes||[]).map(toWorkingNode),o=i.filter(e=>"pool"===e.dslKind),n=i.filter(e=>"lane"===e.dslKind),s=i.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(t.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=r.layout||"auto",l=function resolveLaneOwners(e,t){const r=new Map;return e.forEach(e=>{let i=e.parent;i||1!==t.length||(i=t[0].id),i&&r.set(e.id,i)}),r}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let p=[];"none"!==d&&(p=buildGroups(s,o.concat(n)),layoutGroups(p,a,Number(r.gapX)||90,Number(r.gapY)||60)),n.forEach(e=>{const t=p.filter(t=>t.owner===e)[0],r=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(r?r.maxY-r.minY:0),y))),e.explicitWidth||(e.width=Math.round(Math.max((r?r.maxX-r.minX:0)+g+56,b)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const r=t.reduce((e,t)=>Math.max(e,t.width),b);return e.explicitWidth||(e.width=r),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=m+t.reduce((e,t)=>e+t.height,0)))}const r=p.filter(t=>t.owner===e)[0],i=r?r.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(i?i.maxX-i.minX:0),b))),e.explicitHeight||(e.height=Math.round(Math.max((i?i.maxY-i.minY:0)+m+56,160)))});let c=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=c),c=Math.max(c,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const r=e.top+m,i=Math.max(e.height-m,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(i-o,0)/n.length:0;let a=r;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||y)),a=t.top+t.height})});let u=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=u,u=e.top+e.height+60))}),p.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const r=e.owner;let i=80,o=80;r&&(i=r.left+w,o=r.top+w,"pool"===r.dslKind?o+=m:i+=g),e.nodes.forEach(e=>{e.left=Math.round(i+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(t=>{const r={id:t.id,typeId:e.FlowNode.typeId,kind:t.kind,title:t.title,left:t.left,top:t.top,width:t.width,height:t.height};return void 0!==t.eventKind&&(r.eventKind=t.eventKind),void 0!==t.trigger&&(r.trigger=t.trigger),void 0!==t.gatewayType&&(r.gatewayType=t.gatewayType),void 0!==t.taskType&&(r.taskType=t.taskType),void 0!==t.fillColor&&(r.fillColor=t.fillColor),void 0!==t.strokeColor&&(r.strokeColor=t.strokeColor),r}),edges:a,layout:d,options:r}}function compileUmlDsl(e){const t=e.options||{},r=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),i=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(r,i.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});r.forEach(t=>{const r=e.get(t.id);r&&(t.left=r.left,t.top=r.top)})}return r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:r,edges:i,layout:o,options:t}}const v={width:160,height:64},D={width:500,height:200},O=56;function compileStatechartDsl(e){const t=e.options||{},r=(e.nodes||[]).map(e=>{const t=e.kind||"state",r="initial"===t||"final"===t,i="composite"===t?D:r?{width:24,height:24}:v;return{id:e.id,kind:t,title:e.title||e.name||(r?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:i.width,height:"number"==typeof e.height?e.height:i.height}}),i=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;r.forEach(t=>e.set(t.id,t));const o=r.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let r=e.get(t);for(;r&&r.parent&&e.has(r.parent);)r=e.get(r.parent);return r?r.id:t},r=i.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,r,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;r.filter(e=>"composite"===e.kind).forEach(e=>{const t=r.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let i=O,a=O,d=0,l=O;const p=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(i>O&&i+e.width>O+p&&(i=O,a=l+40),n.add(e.id),e.left=i,e.top=a,i+=e.width+40,d=Math.max(d,i),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+O),e.height=Math.max(e.height,l+O)}),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,i)=>{r.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=i,offsetChildren(e,t,i))})};r.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:r,edges:i,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},r=(e.nodes||[]).map((e,t)=>{const r=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:r.left,top:"number"==typeof e.top?e.top:r.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),i=new Map;r.forEach(e=>i.set(e.id,e));return{kind:"power",nodes:r,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(i.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const x={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},k=["terminator","process","decision","io"],N=["class","interface","enum"],$=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const r=e.links;return r&&r[t]||{}}function absolutePosition(e){let t=0,r=0,i=e;for(;i&&i.state&&"number"==typeof i.state.left;)t+=i.state.left||0,r+=i.state.top||0,i=i.parentNode;return{left:Math.round(t),top:Math.round(r)}}function parentIdOf(e){const t=e&&e.parentNode,r=t&&t.state?t.state.id:void 0;return"string"==typeof r&&r.length>0?r:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(r=>{void 0!==e[r]&&(t[r]=e[r])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),r=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:r.left,top:r.top}}function toDsl(e,r={}){const i=e&&e.designer?e.designer:e,o=r.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const r=nodesOf(e)[0],i=r?String(stateOf(r).kind||""):"";return i.startsWith("bpmn")?"bpmn":N.indexOf(i)>=0?"uml":$.indexOf(i)>=0?"statechart":t.indexOf(i)>=0?"power":k.indexOf(i)>=0?"flowchart":void 0}(i);if(!o)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(o){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,sourcePort:r.position,targetPort:i.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(i);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:x[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(i);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(i);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(i);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id})})}}(i);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),r=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:r.left,top:r.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,sourcePort:r.position,targetPort:i.position,voltageLevel:textOf(t.voltageLevel)})})}}(i);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],r=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),r=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:r.left,top:r.top})}),relations:r.map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(i)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderGanttDsl(t,r){const i=compileGanttDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.GanttDesigner(n);return o.dayWidth&&s.setDayWidth(o.dayWidth),i.nodes.forEach(e=>{s.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),i.edges.forEach(e=>{s.createDependency(e)}),s.select(null),o.autoSchedule&&s.autoSchedule(),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"gantt",ice:n,designer:s})}function renderPowerDsl(t,r){const i=compilePowerDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.PowerDesigner(n);o.voltageColors&&s.setVoltageColors(o.voltageColors);const a=new Map;return i.nodes.forEach(e=>{const t=s.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),a.set(e.id,t)}),i.attachments.forEach(e=>{const t=a.get(e.deviceId),r=a.get(e.busId);t&&r&&s.attachToBus(t,r)}),i.edges.forEach(e=>{const t=a.get(e.sourceId),r=a.get(e.targetId);t&&r&&s.createLine({sourceId:t.state.id,targetId:r.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),s.select(null),s.applyTopology(),!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"power",ice:n,designer:s})}function renderStatechartDsl(t,r){const i=compileStatechartDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.StatechartDesigner(n);return i.nodes.forEach(e=>{s.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),i.edges.forEach(e=>{s.createTransition(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"statechart",ice:n,designer:s})}function renderUmlDsl(t,r){const i=compileUmlDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.UmlDesigner(n);return i.nodes.forEach(e=>{s.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),i.edges.forEach(e=>{s.createRelation(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"uml",ice:n,designer:s})}function renderBpmnDsl(t,r){const i=compileBpmnDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.BpmnDesigner(n);return i.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(r=>{void 0!==e[r]&&(t[r]=e[r])}),s.createNode(e.kind,t)}),i.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(t,r){const i=compileFlowDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.FlowDesigner(n);return i.nodes.forEach(e=>{s.createNode(e.kind,e)}),i.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}exports.DSL_SCHEMA_VERSION=1,exports.POWER_DSL_KINDS=t,exports.compileBpmnDsl=compileBpmnDsl,exports.compileDsl=compileDsl,exports.compileFlowDsl=compileFlowDsl,exports.compileGanttDsl=compileGanttDsl,exports.compilePowerDsl=compilePowerDsl,exports.compileStatechartDsl=compileStatechartDsl,exports.compileUmlDsl=compileUmlDsl,exports.isBpmnDsl=isBpmnDsl,exports.isFlowDsl=isFlowDsl,exports.isGanttDsl=isGanttDsl,exports.isPowerDsl=isPowerDsl,exports.isStatechartDsl=isStatechartDsl,exports.isUmlDsl=isUmlDsl,exports.layeredLayout=layeredLayout,exports.renderBpmnDsl=renderBpmnDsl,exports.renderDsl=function renderDsl(t,r){const i=validateDsl(r);if(!i.valid)throw new Error(i.errors.join("\n"));return isGanttDsl(r)?renderGanttDsl(t,r):isPowerDsl(r)?renderPowerDsl(t,r):isStatechartDsl(r)?renderStatechartDsl(t,r):isUmlDsl(r)?renderUmlDsl(t,r):isBpmnDsl(r)?renderBpmnDsl(t,r):isFlowDsl(r)?renderFlowDsl(t,r):function renderErDsl(t,r){const i=compileDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.EntityDesigner(n);i.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,r){const i=new Map;return e.entities.forEach(e=>{i.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=i.get(e.sourceId),o=i.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],r=o.center[1]-t.center[1];Math.abs(e)>Math.abs(r)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=r>=0?"B":"T",s=r>=0?"T":"B")}return{...e,routeType:e.routeType||r||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,i,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===i.layout||"horizontal"===i.layout)&&new e.ICELayeredLayout({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,r){const i=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;i.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,p=e.canvasWidth||0,c=e.canvasHeight||0;if(!p||!c||d<=0||l<=0)return;const u=Number.isFinite(r)&&r>=0?r:40,h=Math.max(1,p-2*u),f=Math.max(1,c-2*u),m=Math.min(h/d,f/l,1),g=(p-d*m)/2-o*m,y=(c-l*m)/2-n*m;e.setViewport(m,g,y)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(t,r)},exports.renderFlowDsl=renderFlowDsl,exports.renderGanttDsl=renderGanttDsl,exports.renderPowerDsl=renderPowerDsl,exports.renderStatechartDsl=renderStatechartDsl,exports.renderUmlDsl=renderUmlDsl,exports.toDsl=toDsl,exports.validateBpmnDsl=validateBpmnDsl,exports.validateDsl=validateDsl,exports.validateFlowDsl=validateFlowDsl,exports.validateGanttDsl=validateGanttDsl,exports.validatePowerDsl=validatePowerDsl,exports.validateStatechartDsl=validateStatechartDsl,exports.validateUmlDsl=validateUmlDsl;
1
+ "use strict";var e=require("ice-entity-designer");const t={ROOT_NOT_OBJECT:"IED_DSL_ROOT_NOT_OBJECT",SCHEMA_VERSION_UNSUPPORTED:"IED_DSL_SCHEMA_VERSION_UNSUPPORTED",NOT_OBJECT:"IED_DSL_NOT_OBJECT",ID_INVALID:"IED_DSL_ID_INVALID",ID_DUPLICATED:"IED_DSL_ID_DUPLICATED",NODES_NOT_ARRAY:"IED_DSL_NODES_NOT_ARRAY",EDGES_NOT_ARRAY:"IED_DSL_EDGES_NOT_ARRAY",ENTITIES_NOT_ARRAY:"IED_DSL_ENTITIES_NOT_ARRAY",RELATIONS_NOT_ARRAY:"IED_DSL_RELATIONS_NOT_ARRAY",FIELDS_NOT_ARRAY:"IED_DSL_FIELDS_NOT_ARRAY",KIND_INVALID:"IED_DSL_KIND_INVALID",FIELD_TYPE:"IED_DSL_FIELD_TYPE",FIELD_ENUM:"IED_DSL_FIELD_ENUM",FIELD_FORMAT:"IED_DSL_FIELD_FORMAT",FIELD_RANGE:"IED_DSL_FIELD_RANGE",FIELD_NAME_INVALID:"IED_DSL_FIELD_NAME_INVALID",EDGE_ENDPOINT_INVALID:"IED_DSL_EDGE_ENDPOINT_INVALID",EDGE_ENDPOINT_UNKNOWN:"IED_DSL_EDGE_ENDPOINT_UNKNOWN",EDGE_SELF_LOOP:"IED_DSL_EDGE_SELF_LOOP",PARENT_INVALID:"IED_DSL_PARENT_INVALID",PARENT_UNKNOWN:"IED_DSL_PARENT_UNKNOWN",PARENT_SELF:"IED_DSL_PARENT_SELF",PARENT_KIND:"IED_DSL_PARENT_KIND",PARENT_NOT_ALLOWED:"IED_DSL_PARENT_NOT_ALLOWED",ATTACHED_TO_UNKNOWN:"IED_DSL_ATTACHED_TO_UNKNOWN",ATTACHED_TO_NOT_BUSBAR:"IED_DSL_ATTACHED_TO_NOT_BUSBAR"};function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const r=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const i=["terminator","process","decision","io"],o=["T","R","B","L","C"],n=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],s=["start","intermediate","end"],a=["none","message","timer","error","terminate"],d=["exclusive","parallel","inclusive","event"],l=["none","user","service","script","send","receive","manual"],c=["sequence","message","association"],p=["initial","final","state","composite"],u=["class","interface","enum"],f=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const r=[],i=[],fail=(e,t,o)=>{r.push(t),i.push({severity:"error",code:e,message:t,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const r=new Set;e.entities.forEach((e,i)=>{const o=`entities[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(t.ID_DUPLICATED,`${o}.id is duplicated: ${e.id}`,o):r.add(e.id):fail(t.ID_INVALID,`${o}.id must be a non-empty string`,o),Array.isArray(e.fields)?e.fields.forEach((e,r)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||fail(t.FIELD_NAME_INVALID,`${o}.fields[${r}].name must be a non-empty string`,o)}):fail(t.FIELDS_NOT_ARRAY,`${o}.fields must be an array`,o)):fail(t.NOT_OBJECT,`${o} must be an object`,o)})}else fail(t.ENTITIES_NOT_ARRAY,"entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,r)=>{const i=`relations[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||fail(t.EDGE_ENDPOINT_INVALID,`${i}.source must be a non-empty string`,i),"string"==typeof e.target&&e.target.trim()||fail(t.EDGE_ENDPOINT_INVALID,`${i}.target must be a non-empty string`,i)):fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.RELATIONS_NOT_ARRAY,"relations must be an array");return{valid:0===r.length,errors:r,diagnostics:i}}(e)}function validateBpmnDsl(e){const r=[],i=[],fail=(e,t,o)=>{r.push(t),i.push({severity:"error",code:e,message:t,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set,p=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,r)=>{const i=`nodes[${r}]`;if(!e||"object"!=typeof e)return void fail(t.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(t.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):(o.add(e.id),p.set(e.id,e.kind||"task")):fail(t.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===n.indexOf(e.kind)&&fail(t.KIND_INVALID,`${i}.kind must be one of ${n.join("/")}`,i),["left","top","width","height"].forEach(r=>{const o=e[r];void 0!==o&&"number"!=typeof o&&fail(t.FIELD_TYPE,`${i}.${r} must be a number when present`,i)});[["eventKind",s],["trigger",a],["gatewayType",d],["taskType",l]].forEach(([r,o])=>{const n=e[r];void 0!==n&&-1===o.indexOf(n)&&fail(t.FIELD_ENUM,`${i}.${r} must be one of ${o.join("/")}`,i)})}),e.nodes.forEach((e,r)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const i=`nodes[${r}]`;if("string"!=typeof e.parent||!e.parent.trim())return void fail(t.PARENT_INVALID,`${i}.parent must be a non-empty string when present`,i);if(!o.has(e.parent))return void fail(t.PARENT_UNKNOWN,`${i}.parent must reference an existing node id`,i);if(e.parent===e.id)return void fail(t.PARENT_SELF,`${i}.parent must not reference itself`,i);const n=p.get(e.parent);"pool"===e.kind?fail(t.PARENT_NOT_ALLOWED,`${i}.parent is not allowed on a pool (池是最外层容器)`,i):"lane"===e.kind&&"pool"!==n?fail(t.PARENT_KIND,`${i}.parent must reference a pool`,i):"pool"!==n&&"lane"!==n&&fail(t.PARENT_KIND,`${i}.parent must reference a pool or a lane`,i)})):fail(t.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;if(!e||"object"!=typeof e)return void fail(t.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i);const n=void 0!==e.type?e.type:e.flowType;void 0!==n&&-1===c.indexOf(n)&&fail(t.FIELD_ENUM,`${i}.type must be one of ${c.join("/")}`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(t.FIELD_TYPE,`${i}.label must be a string when present`,i),void 0!==e.condition&&"string"!=typeof e.condition&&fail(t.FIELD_TYPE,`${i}.condition must be a string when present`,i),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(t.FIELD_ENUM,`${i}.linkShape must be "visio" or "bezier" when present`,i)}):fail(t.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===r.length,errors:r,diagnostics:i}}function validateFlowDsl(e){const r=[],n=[],fail=(e,t,i)=>{r.push(t),n.push({severity:"error",code:e,message:t,path:i})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:n};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const s=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?s.has(e.id)?fail(t.ID_DUPLICATED,`${o}.id is duplicated: ${e.id}`,o):s.add(e.id):fail(t.ID_INVALID,`${o}.id must be a non-empty string`,o),void 0!==e.kind&&-1===i.indexOf(e.kind)&&fail(t.KIND_INVALID,`${o}.kind must be one of ${i.join("/")}`,o),["left","top","width","height"].forEach(r=>{const i=e[r];void 0!==i&&"number"!=typeof i&&fail(t.FIELD_TYPE,`${o}.${r} must be a number when present`,o)})):fail(t.NOT_OBJECT,`${o} must be an object`,o)}):fail(t.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&s.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&s.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(t.FIELD_TYPE,`${i}.label must be a string when present`,i),void 0!==e.sourcePort&&-1===o.indexOf(e.sourcePort)&&fail(t.FIELD_ENUM,`${i}.sourcePort must be one of ${o.join("/")}`,i),void 0!==e.targetPort&&-1===o.indexOf(e.targetPort)&&fail(t.FIELD_ENUM,`${i}.targetPort must be one of ${o.join("/")}`,i),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(t.FIELD_ENUM,`${i}.linkShape must be "visio" or "bezier" when present`,i)):fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===r.length,errors:r,diagnostics:n}}function validateUmlDsl(e){const r=[],i=[],fail=(e,t,o)=>{r.push(t),i.push({severity:"error",code:e,message:t,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const i=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(t.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):o.add(e.id):fail(t.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===u.indexOf(e.kind)&&fail(t.KIND_INVALID,`${i}.kind must be one of ${u.join("/")}`,i),["attributes","methods"].forEach(r=>{const o=e[r];void 0!==o&&(Array.isArray(o)&&!o.some(e=>"string"!=typeof e)||fail(t.FIELD_TYPE,`${i}.${r} must be an array of strings when present`,i))}),["left","top","width","height"].forEach(r=>{const o=e[r];void 0!==o&&"number"!=typeof o&&fail(t.FIELD_TYPE,`${i}.${r} must be a number when present`,i)})):fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;if(!e||"object"!=typeof e)return void fail(t.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i);const n=void 0!==e.type?e.type:e.relation;void 0!==n&&-1===f.indexOf(n)&&fail(t.FIELD_ENUM,`${i}.type must be one of ${f.join("/")}`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(t.FIELD_TYPE,`${i}.label must be a string when present`,i)}):fail(t.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===r.length,errors:r,diagnostics:i}}function validateStatechartDsl(e){const r=[],i=[],fail=(e,t,o)=>{r.push(t),i.push({severity:"error",code:e,message:t,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set,n=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,r)=>{const i=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(t.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):(o.add(e.id),n.set(e.id,e.kind||"state")):fail(t.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===p.indexOf(e.kind)&&fail(t.KIND_INVALID,`${i}.kind must be one of ${p.join("/")}`,i),["left","top","width","height"].forEach(r=>{const o=e[r];void 0!==o&&"number"!=typeof o&&fail(t.FIELD_TYPE,`${i}.${r} must be a number when present`,i)})):fail(t.NOT_OBJECT,`${i} must be an object`,i)}),e.nodes.forEach((e,r)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const i=`nodes[${r}]`;"string"==typeof e.parent&&e.parent.trim()&&o.has(e.parent)?e.parent!==e.id?"composite"!==n.get(e.parent)&&fail(t.PARENT_KIND,`${i}.parent must reference a composite state`,i):fail(t.PARENT_SELF,`${i}.parent must not reference itself`,i):fail(t.PARENT_UNKNOWN,`${i}.parent must reference an existing node id`,i)})):fail(t.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i),["event","guard","action","label"].forEach(r=>{const o=e[r];void 0!==o&&"string"!=typeof o&&fail(t.FIELD_TYPE,`${i}.${r} must be a string when present`,i)})):fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===r.length,errors:r,diagnostics:i}}function validateGanttDsl(e){const r=[],i=[],fail=(e,t,o)=>{r.push(t),i.push({severity:"error",code:e,message:t,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(t.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:r,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(t.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const i=`nodes[${r}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(t.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):o.add(e.id):fail(t.ID_INVALID,`${i}.id must be a non-empty string`,i),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||fail(t.FIELD_FORMAT,`${i}.start must be a "YYYY-MM-DD" string`,i),void 0===e.days||Number(e.days)>=1||fail(t.FIELD_RANGE,`${i}.days must be a number >= 1 when present`,i),void 0!==e.progress){const r=Number(e.progress);r>=0&&r<=1||fail(t.FIELD_RANGE,`${i}.progress must be between 0 and 1 when present`,i)}void 0===e.row||Number(e.row)>=0||fail(t.FIELD_RANGE,`${i}.row must be a number >= 0 when present`,i)}else fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing task id`,i),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing task id`,i)):fail(t.NOT_OBJECT,`${i} must be an object`,i)}):fail(t.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===r.length,errors:r,diagnostics:i}}function validatePowerDsl(e){const i=[],o=[],fail=(e,t,r)=>{i.push(t),o.push({severity:"error",code:e,message:t,path:r})},n=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||fail(t.NODES_NOT_ARRAY,"nodes must be an array");const s=new Set;return n.forEach((e,i)=>{const o=`nodes[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?s.has(e.id)?fail(t.ID_DUPLICATED,`duplicated node id: ${e.id}`):s.add(e.id):fail(t.ID_INVALID,`${o}.id must be a non-empty string`,o),-1===r.indexOf(e.kind)&&fail(t.KIND_INVALID,`${o}.kind must be one of ${r.join(" / ")}`,o),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||fail(t.FIELD_FORMAT,`${o}.voltageLevel must look like "110kV"`,o)):fail(t.NOT_OBJECT,`${o} must be an object`,o)}),n.forEach((e,r)=>{if(!e||void 0===e.attachedTo)return;const i=n.find(t=>t&&t.id===e.attachedTo);i?"busbar"!==i.kind&&fail(t.ATTACHED_TO_NOT_BUSBAR,`nodes[${r}].attachedTo must point at a busbar: ${e.attachedTo} is ${i.kind}`):fail(t.ATTACHED_TO_UNKNOWN,`nodes[${r}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,r)=>{const i=`edges[${r}]`;e&&"object"==typeof e?(s.has(e.source)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.source references an unknown node: ${e.source}`,i),s.has(e.target)||fail(t.EDGE_ENDPOINT_UNKNOWN,`${i}.target references an unknown node: ${e.target}`,i),e.source===e.target&&fail(t.EDGE_SELF_LOOP,`${i} must not connect a node to itself`,i)):fail(t.NOT_OBJECT,`${i} must be an object`,i)}),{valid:0===i.length,errors:i,diagnostics:o}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,r={}){const i=Number(r.gapX)||90,o=Number(r.gapY)||90,n=void 0===r.originX?80:r.originX,s=void 0===r.originY?80:r.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,c=new Map;e.forEach(e=>{l.set(e.id,0),c.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),c.get(e.sourceId).push(e.targetId))});const p=new Map,u=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(p.set(e.id,0),u.push(e.id))}),u.length||(p.set(e[0].id,0),u.push(e[0].id));let f=e.length*e.length+e.length;for(;u.length&&f-- >0;){const e=u.shift(),t=p.get(e)||0;(c.get(e)||[]).forEach(e=>{const r=t+1;(void 0===p.get(e)?-1:p.get(e))<r&&(p.set(e,r),u.push(e))})}e.forEach(e=>{p.has(e.id)||p.set(e.id,0)});const h=new Map;e.forEach(e=>{const t=p.get(e.id)||0;h.has(t)||h.set(t,[]),h.get(t).push(e)});const g=[...h.keys()].sort((e,t)=>e-t);if("horizontal"===r.direction){const e=g.map(e=>Math.max(...h.get(e).map(e=>e.width)));let t=0;g.forEach((r,n)=>{const s=h.get(r);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(r=>{a.set(r.id,{left:Math.round(t+(e[n]-r.width)/2),top:Math.round(d)}),d+=r.height+o}),t+=e[n]+i})}else{const e=g.map(e=>Math.max(...h.get(e).map(e=>e.height)));let t=0;g.forEach((r,n)=>{const s=h.get(r);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*i)/2;s.forEach(r=>{a.set(r.id,{left:Math.round(d),top:Math.round(t+(e[n]-r.height)/2)}),d+=r.width+i}),t+=e[n]+o})}const m=Math.min(...e.map(e=>a.get(e.id).left)),D=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-m,e.top+=s-D}),a}const h={terminator:{width:e.FLOW_NODE_KINDS.terminator.width,height:e.FLOW_NODE_KINDS.terminator.height,fill:e.FLOW_NODE_KINDS.terminator.fill,stroke:e.FLOW_NODE_KINDS.terminator.stroke},process:{width:e.FLOW_NODE_KINDS.process.width,height:e.FLOW_NODE_KINDS.process.height,fill:e.FLOW_NODE_KINDS.process.fill,stroke:e.FLOW_NODE_KINDS.process.stroke},decision:{width:e.FLOW_NODE_KINDS.decision.width,height:e.FLOW_NODE_KINDS.decision.height,fill:e.FLOW_NODE_KINDS.decision.fill,stroke:e.FLOW_NODE_KINDS.decision.stroke},io:{width:e.FLOW_NODE_KINDS.io.width,height:e.FLOW_NODE_KINDS.io.height,fill:e.FLOW_NODE_KINDS.io.fill,stroke:e.FLOW_NODE_KINDS.io.stroke}};function compileFlowDsl(t){const r=t.options||{},i=(t.nodes||[]).map(t=>{const r=function nodeKind$1(e){return e.kind&&h[e.kind]?e.kind:"process"}(t),i=h[r];return{id:t.id,typeId:e.FlowNode.typeId,kind:r,title:(o=t,o.title||o.name||o.id),left:"number"==typeof t.left?t.left:Number.NaN,top:"number"==typeof t.top?t.top:Number.NaN,width:"number"==typeof t.width?t.width:i.width,height:"number"==typeof t.height?t.height:i.height,fillColor:t.fillColor||i.fill,strokeColor:t.strokeColor||i.stroke};var o}),o=(t.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=r.layout||"layered";return"none"!==n&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,r,i){const o=layeredLayout(e,t,{gapX:r,gapY:i});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(i,o,Number(r.gapX)||90,Number(r.gapY)||90)),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:i,edges:o,layout:n,options:r}}const g={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},m=Number(e.FLOW_NODE_KINDS.bpmnPool.bandSize)||32,D=Number(e.FLOW_NODE_KINDS.bpmnLane.bandSize)||32,N=Number(e.FLOW_NODE_KINDS.bpmnLane.height)||130,E=Number(e.FLOW_NODE_KINDS.bpmnPool.width)||900,y=28;function toWorkingNode(t){const r=t.kind||"task",i=function presetOf(t){return e.FLOW_NODE_KINDS[t]||e.FLOW_NODE_KINDS.bpmnTask}(g[r]||"bpmnTask"),o={id:t.id,typeId:e.FlowNode.typeId,kind:g[r]||"bpmnTask",title:t.title||t.name||t.id,left:"number"==typeof t.left?t.left:0,top:"number"==typeof t.top?t.top:0,width:"number"==typeof t.width?t.width:i.width,height:"number"==typeof t.height?t.height:i.height,fillColor:t.fillColor,strokeColor:t.strokeColor,dslKind:r,parent:t.parent,explicitLeft:"number"==typeof t.left,explicitTop:"number"==typeof t.top,explicitWidth:"number"==typeof t.width,explicitHeight:"number"==typeof t.height};return"event"===r&&(o.eventKind=t.eventKind||i.eventKind||"start",o.trigger=t.trigger||i.trigger||"none"),"gateway"===r&&(o.gatewayType=t.gatewayType||i.gatewayType||"exclusive"),"task"!==r&&"subprocess"!==r||(o.taskType=t.taskType||i.taskType||"none"),o}function buildGroups(e,t){const r=new Map;t.forEach(e=>r.set(e.id,e));const i=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?r.get(e.parent):void 0)||i).nodes.push(e)}),o}function layoutGroups(e,t,r,i){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:r,gapY:i,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,r=1/0,i=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),r=Math.min(r,e.top),i=Math.max(i,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:r,maxX:i,maxY:o}}(e.nodes)})}function compileBpmnDsl(t){const r=t.options||{},i=(t.nodes||[]).map(toWorkingNode),o=i.filter(e=>"pool"===e.dslKind),n=i.filter(e=>"lane"===e.dslKind),s=i.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(t.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=r.layout||"auto",l=function resolveLaneOwners(e,t){const r=new Map;return e.forEach(e=>{let i=e.parent;i||1!==t.length||(i=t[0].id),i&&r.set(e.id,i)}),r}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let c=[];"none"!==d&&(c=buildGroups(s,o.concat(n)),layoutGroups(c,a,Number(r.gapX)||90,Number(r.gapY)||60)),n.forEach(e=>{const t=c.filter(t=>t.owner===e)[0],r=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(r?r.maxY-r.minY:0),N))),e.explicitWidth||(e.width=Math.round(Math.max((r?r.maxX-r.minX:0)+D+56,E)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const r=t.reduce((e,t)=>Math.max(e,t.width),E);return e.explicitWidth||(e.width=r),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=m+t.reduce((e,t)=>e+t.height,0)))}const r=c.filter(t=>t.owner===e)[0],i=r?r.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(i?i.maxX-i.minX:0),E))),e.explicitHeight||(e.height=Math.round(Math.max((i?i.maxY-i.minY:0)+m+56,160)))});let p=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=p),p=Math.max(p,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const r=e.top+m,i=Math.max(e.height-m,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(i-o,0)/n.length:0;let a=r;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||N)),a=t.top+t.height})});let u=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=u,u=e.top+e.height+60))}),c.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const r=e.owner;let i=80,o=80;r&&(i=r.left+y,o=r.top+y,"pool"===r.dslKind?o+=m:i+=D),e.nodes.forEach(e=>{e.left=Math.round(i+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(t=>{const r={id:t.id,typeId:e.FlowNode.typeId,kind:t.kind,title:t.title,left:t.left,top:t.top,width:t.width,height:t.height};return void 0!==t.eventKind&&(r.eventKind=t.eventKind),void 0!==t.trigger&&(r.trigger=t.trigger),void 0!==t.gatewayType&&(r.gatewayType=t.gatewayType),void 0!==t.taskType&&(r.taskType=t.taskType),void 0!==t.fillColor&&(r.fillColor=t.fillColor),void 0!==t.strokeColor&&(r.strokeColor=t.strokeColor),r}),edges:a,layout:d,options:r}}function compileUmlDsl(e){const t=e.options||{},r=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),i=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(r,i.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});r.forEach(t=>{const r=e.get(t.id);r&&(t.left=r.left,t.top=r.top)})}return r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:r,edges:i,layout:o,options:t}}const O={width:160,height:64},b={width:500,height:200},_=56;function compileStatechartDsl(e){const t=e.options||{},r=(e.nodes||[]).map(e=>{const t=e.kind||"state",r="initial"===t||"final"===t,i="composite"===t?b:r?{width:24,height:24}:O;return{id:e.id,kind:t,title:e.title||e.name||(r?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:i.width,height:"number"==typeof e.height?e.height:i.height}}),i=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;r.forEach(t=>e.set(t.id,t));const o=r.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let r=e.get(t);for(;r&&r.parent&&e.has(r.parent);)r=e.get(r.parent);return r?r.id:t},r=i.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,r,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;r.filter(e=>"composite"===e.kind).forEach(e=>{const t=r.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let i=_,a=_,d=0,l=_;const c=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(i>_&&i+e.width>_+c&&(i=_,a=l+40),n.add(e.id),e.left=i,e.top=a,i+=e.width+40,d=Math.max(d,i),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+_),e.height=Math.max(e.height,l+_)}),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,i)=>{r.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=i,offsetChildren(e,t,i))})};r.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:r,edges:i,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},r=(e.nodes||[]).map((e,t)=>{const r=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:r.left,top:"number"==typeof e.top?e.top:r.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),i=new Map;r.forEach(e=>i.set(e.id,e));return{kind:"power",nodes:r,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(i.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const w={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},I=["terminator","process","decision","io"],T=["class","interface","enum"],v=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const r=e.links;return r&&r[t]||{}}function absolutePosition(e){let t=0,r=0,i=e;for(;i&&i.state&&"number"==typeof i.state.left;)t+=i.state.left||0,r+=i.state.top||0,i=i.parentNode;return{left:Math.round(t),top:Math.round(r)}}function parentIdOf(e){const t=e&&e.parentNode,r=t&&t.state?t.state.id:void 0;return"string"==typeof r&&r.length>0?r:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(r=>{void 0!==e[r]&&(t[r]=e[r])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),r=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:r.left,top:r.top}}function toDsl(e,t={}){const i=e&&e.designer?e.designer:e,o=t.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const t=nodesOf(e)[0],i=t?String(stateOf(t).kind||""):"";return i.startsWith("bpmn")?"bpmn":T.indexOf(i)>=0?"uml":v.indexOf(i)>=0?"statechart":r.indexOf(i)>=0?"power":I.indexOf(i)>=0?"flowchart":void 0}(i);if(!o)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(o){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,sourcePort:r.position,targetPort:i.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(i);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:w[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(i);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(i);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(i);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id})})}}(i);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),r=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:r.left,top:r.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,sourcePort:r.position,targetPort:i.position,voltageLevel:textOf(t.voltageLevel)})})}}(i);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],r=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),r=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:r.left,top:r.top})}),relations:r.map(e=>{const t=stateOf(e),r=linkOf(t,"start"),i=linkOf(t,"end");return clean({id:t.id,source:r.id,target:i.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(i)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderGanttDsl(t,r){const i=compileGanttDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.GanttDesigner(n);return o.dayWidth&&s.setDayWidth(o.dayWidth),i.nodes.forEach(e=>{s.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),i.edges.forEach(e=>{s.createDependency(e)}),s.select(null),o.autoSchedule&&s.autoSchedule(),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"gantt",ice:n,designer:s})}function renderPowerDsl(t,r){const i=compilePowerDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.PowerDesigner(n);o.voltageColors&&s.setVoltageColors(o.voltageColors);const a=new Map;return i.nodes.forEach(e=>{const t=s.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),a.set(e.id,t)}),i.attachments.forEach(e=>{const t=a.get(e.deviceId),r=a.get(e.busId);t&&r&&s.attachToBus(t,r)}),i.edges.forEach(e=>{const t=a.get(e.sourceId),r=a.get(e.targetId);t&&r&&s.createLine({sourceId:t.state.id,targetId:r.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),s.select(null),s.applyTopology(),!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"power",ice:n,designer:s})}function renderStatechartDsl(t,r){const i=compileStatechartDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.StatechartDesigner(n);return i.nodes.forEach(e=>{s.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),i.edges.forEach(e=>{s.createTransition(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"statechart",ice:n,designer:s})}function renderUmlDsl(t,r){const i=compileUmlDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.UmlDesigner(n);return i.nodes.forEach(e=>{s.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),i.edges.forEach(e=>{s.createRelation(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"uml",ice:n,designer:s})}function renderBpmnDsl(t,r){const i=compileBpmnDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.BpmnDesigner(n);return i.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(r=>{void 0!==e[r]&&(t[r]=e[r])}),s.createNode(e.kind,t)}),i.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(t,r){const i=compileFlowDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.FlowDesigner(n);return i.nodes.forEach(e=>{s.createNode(e.kind,e)}),i.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}exports.DSL_SCHEMA_VERSION=1,exports.IED_DSL_CODES=t,exports.POWER_DSL_KINDS=r,exports.compileBpmnDsl=compileBpmnDsl,exports.compileDsl=compileDsl,exports.compileFlowDsl=compileFlowDsl,exports.compileGanttDsl=compileGanttDsl,exports.compilePowerDsl=compilePowerDsl,exports.compileStatechartDsl=compileStatechartDsl,exports.compileUmlDsl=compileUmlDsl,exports.isBpmnDsl=isBpmnDsl,exports.isFlowDsl=isFlowDsl,exports.isGanttDsl=isGanttDsl,exports.isPowerDsl=isPowerDsl,exports.isStatechartDsl=isStatechartDsl,exports.isUmlDsl=isUmlDsl,exports.layeredLayout=layeredLayout,exports.renderBpmnDsl=renderBpmnDsl,exports.renderDsl=function renderDsl(t,r){const i=validateDsl(r);if(!i.valid)throw new Error(i.errors.join("\n"));return isGanttDsl(r)?renderGanttDsl(t,r):isPowerDsl(r)?renderPowerDsl(t,r):isStatechartDsl(r)?renderStatechartDsl(t,r):isUmlDsl(r)?renderUmlDsl(t,r):isBpmnDsl(r)?renderBpmnDsl(t,r):isFlowDsl(r)?renderFlowDsl(t,r):function renderErDsl(t,r){const i=compileDsl(r),o=i.options||{},n=(new e.ICE).init(t),s=new e.EntityDesigner(n);i.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,r){const i=new Map;return e.entities.forEach(e=>{i.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=i.get(e.sourceId),o=i.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],r=o.center[1]-t.center[1];Math.abs(e)>Math.abs(r)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=r>=0?"B":"T",s=r>=0?"T":"B")}return{...e,routeType:e.routeType||r||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,i,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===i.layout||"horizontal"===i.layout)&&new e.ICELayeredLayout({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,r){const i=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;i.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,c=e.canvasWidth||0,p=e.canvasHeight||0;if(!c||!p||d<=0||l<=0)return;const u=Number.isFinite(r)&&r>=0?r:40,f=Math.max(1,c-2*u),h=Math.max(1,p-2*u),g=Math.min(f/d,h/l,1),m=(c-d*g)/2-o*g,D=(p-l*g)/2-n*g;e.setViewport(g,m,D)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(t,r)},exports.renderFlowDsl=renderFlowDsl,exports.renderGanttDsl=renderGanttDsl,exports.renderPowerDsl=renderPowerDsl,exports.renderStatechartDsl=renderStatechartDsl,exports.renderUmlDsl=renderUmlDsl,exports.toDsl=toDsl,exports.validateBpmnDsl=validateBpmnDsl,exports.validateDsl=validateDsl,exports.validateFlowDsl=validateFlowDsl,exports.validateGanttDsl=validateGanttDsl,exports.validatePowerDsl=validatePowerDsl,exports.validateStatechartDsl=validateStatechartDsl,exports.validateUmlDsl=validateUmlDsl;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{FLOW_NODE_KINDS as e,FlowNode as t,ICE as i,GanttDesigner as r,PowerDesigner as o,StatechartDesigner as n,UmlDesigner as s,BpmnDesigner as a,FlowDesigner as d,EntityDesigner as l,ICELayeredLayout as p}from"ice-entity-designer";function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const c=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const u=1,h=["terminator","process","decision","io"],f=["T","R","B","L","C"],m=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],g=["start","intermediate","end"],b=["none","message","timer","error","terminate"],y=["exclusive","parallel","inclusive","event"],w=["none","user","service","script","send","receive","manual"],v=["sequence","message","association"],k=["initial","final","state","composite"],x=["class","interface","enum"],$=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const i=new Set;e.entities.forEach((e,r)=>{const o=`entities[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),Array.isArray(e.fields)?e.fields.forEach((e,i)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||t.push(`${o}.fields[${i}].name must be a non-empty string`)}):t.push(`${o}.fields must be an array`)):t.push(`${o} must be an object`)})}else t.push("entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,i)=>{const r=`relations[${i}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||t.push(`${r}.source must be a non-empty string`),"string"==typeof e.target&&e.target.trim()||t.push(`${r}.target must be a non-empty string`)):t.push(`${r} must be an object`)}):t.push("relations must be an array");return{valid:0===t.length,errors:t}}(e)}function validateBpmnDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set,r=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,o)=>{const n=`nodes[${o}]`;if(!e||"object"!=typeof e)return void t.push(`${n} must be an object`);"string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):(i.add(e.id),r.set(e.id,e.kind||"task")):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===m.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${m.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${n}.${i} must be a number when present`)});[["eventKind",g],["trigger",b],["gatewayType",y],["taskType",w]].forEach(([i,r])=>{const o=e[i];void 0!==o&&-1===r.indexOf(o)&&t.push(`${n}.${i} must be one of ${r.join("/")}`)})}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;if("string"!=typeof e.parent||!e.parent.trim())return void t.push(`${n}.parent must be a non-empty string when present`);if(!i.has(e.parent))return void t.push(`${n}.parent must reference an existing node id`);if(e.parent===e.id)return void t.push(`${n}.parent must not reference itself`);const s=r.get(e.parent);"pool"===e.kind?t.push(`${n}.parent is not allowed on a pool (池是最外层容器)`):"lane"===e.kind&&"pool"!==s?t.push(`${n}.parent must reference a pool`):"pool"!==s&&"lane"!==s&&t.push(`${n}.parent must reference a pool or a lane`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.flowType;void 0!==n&&-1===v.indexOf(n)&&t.push(`${o}.type must be one of ${v.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`),void 0!==e.condition&&"string"!=typeof e.condition&&t.push(`${o}.condition must be a string when present`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${o}.linkShape must be "visio" or "bezier" when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateFlowDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),void 0!==e.kind&&-1===h.indexOf(e.kind)&&t.push(`${o}.kind must be one of ${h.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${o}.${i} must be a number when present`)})):t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`),void 0!==e.sourcePort&&-1===f.indexOf(e.sourcePort)&&t.push(`${o}.sourcePort must be one of ${f.join("/")}`),void 0!==e.targetPort&&-1===f.indexOf(e.targetPort)&&t.push(`${o}.targetPort must be one of ${f.join("/")}`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${o}.linkShape must be "visio" or "bezier" when present`)):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateUmlDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),void 0!==e.kind&&-1===x.indexOf(e.kind)&&t.push(`${o}.kind must be one of ${x.join("/")}`),["attributes","methods"].forEach(i=>{const r=e[i];void 0!==r&&(Array.isArray(r)&&!r.some(e=>"string"!=typeof e)||t.push(`${o}.${i} must be an array of strings when present`))}),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${o}.${i} must be a number when present`)})):t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.relation;void 0!==n&&-1===$.indexOf(n)&&t.push(`${o}.type must be one of ${$.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateStatechartDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set,r=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,o)=>{const n=`nodes[${o}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):(i.add(e.id),r.set(e.id,e.kind||"state")):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===k.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${k.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${n}.${i} must be a number when present`)})):t.push(`${n} must be an object`)}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;"string"==typeof e.parent&&e.parent.trim()&&i.has(e.parent)?e.parent!==e.id?"composite"!==r.get(e.parent)&&t.push(`${n}.parent must reference a composite state`):t.push(`${n}.parent must not reference itself`):t.push(`${n}.parent must reference an existing node id`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`),["event","guard","action","label"].forEach(i=>{const r=e[i];void 0!==r&&"string"!=typeof r&&t.push(`${o}.${i} must be a string when present`)})):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateGanttDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||t.push(`${o}.start must be a "YYYY-MM-DD" string`),void 0===e.days||Number(e.days)>=1||t.push(`${o}.days must be a number >= 1 when present`),void 0!==e.progress){const i=Number(e.progress);i>=0&&i<=1||t.push(`${o}.progress must be between 0 and 1 when present`)}void 0===e.row||Number(e.row)>=0||t.push(`${o}.row must be a number >= 0 when present`)}else t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing task id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing task id`)):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validatePowerDsl(e){const t=[],i=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||t.push("nodes must be an array");const r=new Set;return i.forEach((e,i)=>{const o=`nodes[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?r.has(e.id)?t.push(`duplicated node id: ${e.id}`):r.add(e.id):t.push(`${o}.id must be a non-empty string`),-1===c.indexOf(e.kind)&&t.push(`${o}.kind must be one of ${c.join(" / ")}`),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||t.push(`${o}.voltageLevel must look like "110kV"`)):t.push(`${o} must be an object`)}),i.forEach((e,r)=>{if(!e||void 0===e.attachedTo)return;const o=i.find(t=>t&&t.id===e.attachedTo);o?"busbar"!==o.kind&&t.push(`nodes[${r}].attachedTo must point at a busbar: ${e.attachedTo} is ${o.kind}`):t.push(`nodes[${r}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,i)=>{const o=`edges[${i}]`;e&&"object"==typeof e?(r.has(e.source)||t.push(`${o}.source references an unknown node: ${e.source}`),r.has(e.target)||t.push(`${o}.target references an unknown node: ${e.target}`),e.source===e.target&&t.push(`${o} must not connect a node to itself`)):t.push(`${o} must be an object`)}),{valid:0===t.length,errors:t}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,i={}){const r=Number(i.gapX)||90,o=Number(i.gapY)||90,n=void 0===i.originX?80:i.originX,s=void 0===i.originY?80:i.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,p=new Map;e.forEach(e=>{l.set(e.id,0),p.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),p.get(e.sourceId).push(e.targetId))});const c=new Map,u=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(c.set(e.id,0),u.push(e.id))}),u.length||(c.set(e[0].id,0),u.push(e[0].id));let h=e.length*e.length+e.length;for(;u.length&&h-- >0;){const e=u.shift(),t=c.get(e)||0;(p.get(e)||[]).forEach(e=>{const i=t+1;(void 0===c.get(e)?-1:c.get(e))<i&&(c.set(e,i),u.push(e))})}e.forEach(e=>{c.has(e.id)||c.set(e.id,0)});const f=new Map;e.forEach(e=>{const t=c.get(e.id)||0;f.has(t)||f.set(t,[]),f.get(t).push(e)});const m=[...f.keys()].sort((e,t)=>e-t);if("horizontal"===i.direction){const e=m.map(e=>Math.max(...f.get(e).map(e=>e.width)));let t=0;m.forEach((i,n)=>{const s=f.get(i);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(t+(e[n]-i.width)/2),top:Math.round(d)}),d+=i.height+o}),t+=e[n]+r})}else{const e=m.map(e=>Math.max(...f.get(e).map(e=>e.height)));let t=0;m.forEach((i,n)=>{const s=f.get(i);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*r)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(d),top:Math.round(t+(e[n]-i.height)/2)}),d+=i.width+r}),t+=e[n]+o})}const g=Math.min(...e.map(e=>a.get(e.id).left)),b=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-g,e.top+=s-b}),a}const O={terminator:{width:e.terminator.width,height:e.terminator.height,fill:e.terminator.fill,stroke:e.terminator.stroke},process:{width:e.process.width,height:e.process.height,fill:e.process.fill,stroke:e.process.stroke},decision:{width:e.decision.width,height:e.decision.height,fill:e.decision.fill,stroke:e.decision.stroke},io:{width:e.io.width,height:e.io.height,fill:e.io.fill,stroke:e.io.stroke}};function compileFlowDsl(e){const i=e.options||{},r=(e.nodes||[]).map(e=>{const i=function nodeKind$1(e){return e.kind&&O[e.kind]?e.kind:"process"}(e),r=O[i];return{id:e.id,typeId:t.typeId,kind:i,title:(o=e,o.title||o.name||o.id),left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor||r.fill,strokeColor:e.strokeColor||r.stroke};var o}),o=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=i.layout||"layered";return"none"!==n&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,i,r){const o=layeredLayout(e,t,{gapX:i,gapY:r});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(r,o,Number(i.gapX)||90,Number(i.gapY)||90)),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:r,edges:o,layout:n,options:i}}const D={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},N=Number(e.bpmnPool.bandSize)||32,E=Number(e.bpmnLane.bandSize)||32,S=Number(e.bpmnLane.height)||130,T=Number(e.bpmnPool.width)||900,j=28;function toWorkingNode(i){const r=i.kind||"task",o=function presetOf(t){return e[t]||e.bpmnTask}(D[r]||"bpmnTask"),n={id:i.id,typeId:t.typeId,kind:D[r]||"bpmnTask",title:i.title||i.name||i.id,left:"number"==typeof i.left?i.left:0,top:"number"==typeof i.top?i.top:0,width:"number"==typeof i.width?i.width:o.width,height:"number"==typeof i.height?i.height:o.height,fillColor:i.fillColor,strokeColor:i.strokeColor,dslKind:r,parent:i.parent,explicitLeft:"number"==typeof i.left,explicitTop:"number"==typeof i.top,explicitWidth:"number"==typeof i.width,explicitHeight:"number"==typeof i.height};return"event"===r&&(n.eventKind=i.eventKind||o.eventKind||"start",n.trigger=i.trigger||o.trigger||"none"),"gateway"===r&&(n.gatewayType=i.gatewayType||o.gatewayType||"exclusive"),"task"!==r&&"subprocess"!==r||(n.taskType=i.taskType||o.taskType||"none"),n}function buildGroups(e,t){const i=new Map;t.forEach(e=>i.set(e.id,e));const r=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?i.get(e.parent):void 0)||r).nodes.push(e)}),o}function layoutGroups(e,t,i,r){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:i,gapY:r,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,i=1/0,r=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),i=Math.min(i,e.top),r=Math.max(r,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:i,maxX:r,maxY:o}}(e.nodes)})}function compileBpmnDsl(e){const i=e.options||{},r=(e.nodes||[]).map(toWorkingNode),o=r.filter(e=>"pool"===e.dslKind),n=r.filter(e=>"lane"===e.dslKind),s=r.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=i.layout||"auto",l=function resolveLaneOwners(e,t){const i=new Map;return e.forEach(e=>{let r=e.parent;r||1!==t.length||(r=t[0].id),r&&i.set(e.id,r)}),i}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let p=[];"none"!==d&&(p=buildGroups(s,o.concat(n)),layoutGroups(p,a,Number(i.gapX)||90,Number(i.gapY)||60)),n.forEach(e=>{const t=p.filter(t=>t.owner===e)[0],i=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(i?i.maxY-i.minY:0),S))),e.explicitWidth||(e.width=Math.round(Math.max((i?i.maxX-i.minX:0)+E+56,T)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const i=t.reduce((e,t)=>Math.max(e,t.width),T);return e.explicitWidth||(e.width=i),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=N+t.reduce((e,t)=>e+t.height,0)))}const i=p.filter(t=>t.owner===e)[0],r=i?i.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(r?r.maxX-r.minX:0),T))),e.explicitHeight||(e.height=Math.round(Math.max((r?r.maxY-r.minY:0)+N+56,160)))});let c=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=c),c=Math.max(c,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const i=e.top+N,r=Math.max(e.height-N,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(r-o,0)/n.length:0;let a=i;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||S)),a=t.top+t.height})});let u=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=u,u=e.top+e.height+60))}),p.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const i=e.owner;let r=80,o=80;i&&(r=i.left+j,o=i.top+j,"pool"===i.dslKind?o+=N:r+=E),e.nodes.forEach(e=>{e.left=Math.round(r+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(e=>{const i={id:e.id,typeId:t.typeId,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};return void 0!==e.eventKind&&(i.eventKind=e.eventKind),void 0!==e.trigger&&(i.trigger=e.trigger),void 0!==e.gatewayType&&(i.gatewayType=e.gatewayType),void 0!==e.taskType&&(i.taskType=e.taskType),void 0!==e.fillColor&&(i.fillColor=e.fillColor),void 0!==e.strokeColor&&(i.strokeColor=e.strokeColor),i}),edges:a,layout:d,options:i}}function compileUmlDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),r=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(i,r.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});i.forEach(t=>{const i=e.get(t.id);i&&(t.left=i.left,t.top=i.top)})}return i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:i,edges:r,layout:o,options:t}}const A={width:160,height:64},M={width:500,height:200},V=56;function compileStatechartDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{const t=e.kind||"state",i="initial"===t||"final"===t,r="composite"===t?M:i?{width:24,height:24}:A;return{id:e.id,kind:t,title:e.title||e.name||(i?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height}}),r=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;i.forEach(t=>e.set(t.id,t));const o=i.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let i=e.get(t);for(;i&&i.parent&&e.has(i.parent);)i=e.get(i.parent);return i?i.id:t},i=r.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,i,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;i.filter(e=>"composite"===e.kind).forEach(e=>{const t=i.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let r=V,a=V,d=0,l=V;const p=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(r>V&&r+e.width>V+p&&(r=V,a=l+40),n.add(e.id),e.left=r,e.top=a,r+=e.width+40,d=Math.max(d,r),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+V),e.height=Math.max(e.height,l+V)}),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,r)=>{i.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=r,offsetChildren(e,t,r))})};i.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:i,edges:r,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},i=(e.nodes||[]).map((e,t)=>{const i=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:i.left,top:"number"==typeof e.top?e.top:i.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),r=new Map;i.forEach(e=>r.set(e.id,e));return{kind:"power",nodes:i,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(r.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const I={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},P=["terminator","process","decision","io"],L=["class","interface","enum"],C=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const i=e.links;return i&&i[t]||{}}function absolutePosition(e){let t=0,i=0,r=e;for(;r&&r.state&&"number"==typeof r.state.left;)t+=r.state.left||0,i+=r.state.top||0,r=r.parentNode;return{left:Math.round(t),top:Math.round(i)}}function parentIdOf(e){const t=e&&e.parentNode,i=t&&t.state?t.state.id:void 0;return"string"==typeof i&&i.length>0?i:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),i=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:i.left,top:i.top}}function toDsl(e,t={}){const i=e&&e.designer?e.designer:e,r=t.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const t=nodesOf(e)[0],i=t?String(stateOf(t).kind||""):"";return i.startsWith("bpmn")?"bpmn":L.indexOf(i)>=0?"uml":C.indexOf(i)>=0?"statechart":c.indexOf(i)>=0?"power":P.indexOf(i)>=0?"flowchart":void 0}(i);if(!r)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(r){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(i);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:I[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(i);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(i);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(i);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id})})}}(i);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:i.left,top:i.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,voltageLevel:textOf(t.voltageLevel)})})}}(i);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],i=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:i.left,top:i.top})}),relations:i.map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(i)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderDsl(e,t){const r=validateDsl(t);if(!r.valid)throw new Error(r.errors.join("\n"));return isGanttDsl(t)?renderGanttDsl(e,t):isPowerDsl(t)?renderPowerDsl(e,t):isStatechartDsl(t)?renderStatechartDsl(e,t):isUmlDsl(t)?renderUmlDsl(e,t):isBpmnDsl(t)?renderBpmnDsl(e,t):isFlowDsl(t)?renderFlowDsl(e,t):function renderErDsl(e,t){const r=compileDsl(t),o=r.options||{},n=(new i).init(e),s=new l(n);r.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,i){const r=new Map;return e.entities.forEach(e=>{r.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=r.get(e.sourceId),o=r.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],i=o.center[1]-t.center[1];Math.abs(e)>Math.abs(i)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=i>=0?"B":"T",s=i>=0?"T":"B")}return{...e,routeType:e.routeType||i||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,r,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===r.layout||"horizontal"===r.layout)&&new p({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,i){const r=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;r.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,p=e.canvasWidth||0,c=e.canvasHeight||0;if(!p||!c||d<=0||l<=0)return;const u=Number.isFinite(i)&&i>=0?i:40,h=Math.max(1,p-2*u),f=Math.max(1,c-2*u),m=Math.min(h/d,f/l,1),g=(p-d*m)/2-o*m,b=(c-l*m)/2-n*m;e.setViewport(m,g,b)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(e,t)}function renderGanttDsl(e,t){const o=compileGanttDsl(t),n=o.options||{},s=(new i).init(e),a=new r(s);return n.dayWidth&&a.setDayWidth(n.dayWidth),o.nodes.forEach(e=>{a.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),o.edges.forEach(e=>{a.createDependency(e)}),a.select(null),n.autoSchedule&&a.autoSchedule(),n.viewport?s.setViewport(n.viewport.scale,n.viewport.tx,n.viewport.ty):!1!==n.fitViewport&&a.fitViewport(n.fitViewportPadding),a.resetHistory(),withDsl({kind:"gantt",ice:s,designer:a})}function renderPowerDsl(e,t){const r=compilePowerDsl(t),n=r.options||{},s=(new i).init(e),a=new o(s);n.voltageColors&&a.setVoltageColors(n.voltageColors);const d=new Map;return r.nodes.forEach(e=>{const t=a.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),d.set(e.id,t)}),r.attachments.forEach(e=>{const t=d.get(e.deviceId),i=d.get(e.busId);t&&i&&a.attachToBus(t,i)}),r.edges.forEach(e=>{const t=d.get(e.sourceId),i=d.get(e.targetId);t&&i&&a.createLine({sourceId:t.state.id,targetId:i.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),a.select(null),a.applyTopology(),!1!==n.fitViewport&&a.fitViewport(n.fitViewportPadding),a.resetHistory(),withDsl({kind:"power",ice:s,designer:a})}function renderStatechartDsl(e,t){const r=compileStatechartDsl(t),o=r.options||{},s=(new i).init(e),a=new n(s);return r.nodes.forEach(e=>{a.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),r.edges.forEach(e=>{a.createTransition(e)}),a.select(null),o.viewport?s.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&a.fitViewport(o.fitViewportPadding),a.resetHistory(),withDsl({kind:"statechart",ice:s,designer:a})}function renderUmlDsl(e,t){const r=compileUmlDsl(t),o=r.options||{},n=(new i).init(e),a=new s(n);return r.nodes.forEach(e=>{a.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),r.edges.forEach(e=>{a.createRelation(e)}),a.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&a.fitViewport(o.fitViewportPadding),a.resetHistory(),withDsl({kind:"uml",ice:n,designer:a})}function renderBpmnDsl(e,t){const r=compileBpmnDsl(t),o=r.options||{},n=(new i).init(e),s=new a(n);return r.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),s.createNode(e.kind,t)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(e,t){const r=compileFlowDsl(t),o=r.options||{},n=(new i).init(e),s=new d(n);return r.nodes.forEach(e=>{s.createNode(e.kind,e)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}export{u as DSL_SCHEMA_VERSION,c as POWER_DSL_KINDS,compileBpmnDsl,compileDsl,compileFlowDsl,compileGanttDsl,compilePowerDsl,compileStatechartDsl,compileUmlDsl,isBpmnDsl,isFlowDsl,isGanttDsl,isPowerDsl,isStatechartDsl,isUmlDsl,layeredLayout,renderBpmnDsl,renderDsl,renderFlowDsl,renderGanttDsl,renderPowerDsl,renderStatechartDsl,renderUmlDsl,toDsl,validateBpmnDsl,validateDsl,validateFlowDsl,validateGanttDsl,validatePowerDsl,validateStatechartDsl,validateUmlDsl};
1
+ import{FLOW_NODE_KINDS as e,FlowNode as t,ICE as i,GanttDesigner as r,PowerDesigner as o,StatechartDesigner as n,UmlDesigner as s,BpmnDesigner as a,FlowDesigner as d,EntityDesigner as l,ICELayeredLayout as c}from"ice-entity-designer";const p={ROOT_NOT_OBJECT:"IED_DSL_ROOT_NOT_OBJECT",SCHEMA_VERSION_UNSUPPORTED:"IED_DSL_SCHEMA_VERSION_UNSUPPORTED",NOT_OBJECT:"IED_DSL_NOT_OBJECT",ID_INVALID:"IED_DSL_ID_INVALID",ID_DUPLICATED:"IED_DSL_ID_DUPLICATED",NODES_NOT_ARRAY:"IED_DSL_NODES_NOT_ARRAY",EDGES_NOT_ARRAY:"IED_DSL_EDGES_NOT_ARRAY",ENTITIES_NOT_ARRAY:"IED_DSL_ENTITIES_NOT_ARRAY",RELATIONS_NOT_ARRAY:"IED_DSL_RELATIONS_NOT_ARRAY",FIELDS_NOT_ARRAY:"IED_DSL_FIELDS_NOT_ARRAY",KIND_INVALID:"IED_DSL_KIND_INVALID",FIELD_TYPE:"IED_DSL_FIELD_TYPE",FIELD_ENUM:"IED_DSL_FIELD_ENUM",FIELD_FORMAT:"IED_DSL_FIELD_FORMAT",FIELD_RANGE:"IED_DSL_FIELD_RANGE",FIELD_NAME_INVALID:"IED_DSL_FIELD_NAME_INVALID",EDGE_ENDPOINT_INVALID:"IED_DSL_EDGE_ENDPOINT_INVALID",EDGE_ENDPOINT_UNKNOWN:"IED_DSL_EDGE_ENDPOINT_UNKNOWN",EDGE_SELF_LOOP:"IED_DSL_EDGE_SELF_LOOP",PARENT_INVALID:"IED_DSL_PARENT_INVALID",PARENT_UNKNOWN:"IED_DSL_PARENT_UNKNOWN",PARENT_SELF:"IED_DSL_PARENT_SELF",PARENT_KIND:"IED_DSL_PARENT_KIND",PARENT_NOT_ALLOWED:"IED_DSL_PARENT_NOT_ALLOWED",ATTACHED_TO_UNKNOWN:"IED_DSL_ATTACHED_TO_UNKNOWN",ATTACHED_TO_NOT_BUSBAR:"IED_DSL_ATTACHED_TO_NOT_BUSBAR"};function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const f=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const u=1,h=["terminator","process","decision","io"],g=["T","R","B","L","C"],m=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],N=["start","intermediate","end"],E=["none","message","timer","error","terminate"],y=["exclusive","parallel","inclusive","event"],D=["none","user","service","script","send","receive","manual"],b=["sequence","message","association"],O=["initial","final","state","composite"],w=["class","interface","enum"],_=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const t=new Set;e.entities.forEach((e,i)=>{const r=`entities[${i}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?t.has(e.id)?fail(p.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):t.add(e.id):fail(p.ID_INVALID,`${r}.id must be a non-empty string`,r),Array.isArray(e.fields)?e.fields.forEach((e,t)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||fail(p.FIELD_NAME_INVALID,`${r}.fields[${t}].name must be a non-empty string`,r)}):fail(p.FIELDS_NOT_ARRAY,`${r}.fields must be an array`,r)):fail(p.NOT_OBJECT,`${r} must be an object`,r)})}else fail(p.ENTITIES_NOT_ARRAY,"entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,t)=>{const i=`relations[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||fail(p.EDGE_ENDPOINT_INVALID,`${i}.source must be a non-empty string`,i),"string"==typeof e.target&&e.target.trim()||fail(p.EDGE_ENDPOINT_INVALID,`${i}.target must be a non-empty string`,i)):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.RELATIONS_NOT_ARRAY,"relations must be an array");return{valid:0===t.length,errors:t,diagnostics:i}}(e)}function validateBpmnDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set,o=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,t)=>{const i=`nodes[${t}]`;if(!e||"object"!=typeof e)return void fail(p.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(p.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):(r.add(e.id),o.set(e.id,e.kind||"task")):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===m.indexOf(e.kind)&&fail(p.KIND_INVALID,`${i}.kind must be one of ${m.join("/")}`,i),["left","top","width","height"].forEach(t=>{const r=e[t];void 0!==r&&"number"!=typeof r&&fail(p.FIELD_TYPE,`${i}.${t} must be a number when present`,i)});[["eventKind",N],["trigger",E],["gatewayType",y],["taskType",D]].forEach(([t,r])=>{const o=e[t];void 0!==o&&-1===r.indexOf(o)&&fail(p.FIELD_ENUM,`${i}.${t} must be one of ${r.join("/")}`,i)})}),e.nodes.forEach((e,t)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const i=`nodes[${t}]`;if("string"!=typeof e.parent||!e.parent.trim())return void fail(p.PARENT_INVALID,`${i}.parent must be a non-empty string when present`,i);if(!r.has(e.parent))return void fail(p.PARENT_UNKNOWN,`${i}.parent must reference an existing node id`,i);if(e.parent===e.id)return void fail(p.PARENT_SELF,`${i}.parent must not reference itself`,i);const n=o.get(e.parent);"pool"===e.kind?fail(p.PARENT_NOT_ALLOWED,`${i}.parent is not allowed on a pool (池是最外层容器)`,i):"lane"===e.kind&&"pool"!==n?fail(p.PARENT_KIND,`${i}.parent must reference a pool`,i):"pool"!==n&&"lane"!==n&&fail(p.PARENT_KIND,`${i}.parent must reference a pool or a lane`,i)})):fail(p.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;if(!e||"object"!=typeof e)return void fail(p.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.source&&e.source.trim()&&r.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i);const o=void 0!==e.type?e.type:e.flowType;void 0!==o&&-1===b.indexOf(o)&&fail(p.FIELD_ENUM,`${i}.type must be one of ${b.join("/")}`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(p.FIELD_TYPE,`${i}.label must be a string when present`,i),void 0!==e.condition&&"string"!=typeof e.condition&&fail(p.FIELD_TYPE,`${i}.condition must be a string when present`,i),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(p.FIELD_ENUM,`${i}.linkShape must be "visio" or "bezier" when present`,i)}):fail(p.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:i}}function validateFlowDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const i=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(p.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):r.add(e.id):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===h.indexOf(e.kind)&&fail(p.KIND_INVALID,`${i}.kind must be one of ${h.join("/")}`,i),["left","top","width","height"].forEach(t=>{const r=e[t];void 0!==r&&"number"!=typeof r&&fail(p.FIELD_TYPE,`${i}.${t} must be a number when present`,i)})):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&r.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(p.FIELD_TYPE,`${i}.label must be a string when present`,i),void 0!==e.sourcePort&&-1===g.indexOf(e.sourcePort)&&fail(p.FIELD_ENUM,`${i}.sourcePort must be one of ${g.join("/")}`,i),void 0!==e.targetPort&&-1===g.indexOf(e.targetPort)&&fail(p.FIELD_ENUM,`${i}.targetPort must be one of ${g.join("/")}`,i),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(p.FIELD_ENUM,`${i}.linkShape must be "visio" or "bezier" when present`,i)):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:i}}function validateUmlDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const i=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(p.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):r.add(e.id):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===w.indexOf(e.kind)&&fail(p.KIND_INVALID,`${i}.kind must be one of ${w.join("/")}`,i),["attributes","methods"].forEach(t=>{const r=e[t];void 0!==r&&(Array.isArray(r)&&!r.some(e=>"string"!=typeof e)||fail(p.FIELD_TYPE,`${i}.${t} must be an array of strings when present`,i))}),["left","top","width","height"].forEach(t=>{const r=e[t];void 0!==r&&"number"!=typeof r&&fail(p.FIELD_TYPE,`${i}.${t} must be a number when present`,i)})):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;if(!e||"object"!=typeof e)return void fail(p.NOT_OBJECT,`${i} must be an object`,i);"string"==typeof e.source&&e.source.trim()&&r.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i);const o=void 0!==e.type?e.type:e.relation;void 0!==o&&-1===_.indexOf(o)&&fail(p.FIELD_ENUM,`${i}.type must be one of ${_.join("/")}`,i),void 0!==e.label&&"string"!=typeof e.label&&fail(p.FIELD_TYPE,`${i}.label must be a string when present`,i)}):fail(p.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:i}}function validateStatechartDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set,o=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,t)=>{const i=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(p.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):(r.add(e.id),o.set(e.id,e.kind||"state")):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),void 0!==e.kind&&-1===O.indexOf(e.kind)&&fail(p.KIND_INVALID,`${i}.kind must be one of ${O.join("/")}`,i),["left","top","width","height"].forEach(t=>{const r=e[t];void 0!==r&&"number"!=typeof r&&fail(p.FIELD_TYPE,`${i}.${t} must be a number when present`,i)})):fail(p.NOT_OBJECT,`${i} must be an object`,i)}),e.nodes.forEach((e,t)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const i=`nodes[${t}]`;"string"==typeof e.parent&&e.parent.trim()&&r.has(e.parent)?e.parent!==e.id?"composite"!==o.get(e.parent)&&fail(p.PARENT_KIND,`${i}.parent must reference a composite state`,i):fail(p.PARENT_SELF,`${i}.parent must not reference itself`,i):fail(p.PARENT_UNKNOWN,`${i}.parent must reference an existing node id`,i)})):fail(p.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&r.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing node id`,i),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing node id`,i),["event","guard","action","label"].forEach(t=>{const r=e[t];void 0!==r&&"string"!=typeof r&&fail(p.FIELD_TYPE,`${i}.${t} must be a string when present`,i)})):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:i}}function validateGanttDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(p.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:i};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(p.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const r=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const i=`nodes[${t}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?r.has(e.id)?fail(p.ID_DUPLICATED,`${i}.id is duplicated: ${e.id}`,i):r.add(e.id):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||fail(p.FIELD_FORMAT,`${i}.start must be a "YYYY-MM-DD" string`,i),void 0===e.days||Number(e.days)>=1||fail(p.FIELD_RANGE,`${i}.days must be a number >= 1 when present`,i),void 0!==e.progress){const t=Number(e.progress);t>=0&&t<=1||fail(p.FIELD_RANGE,`${i}.progress must be between 0 and 1 when present`,i)}void 0===e.row||Number(e.row)>=0||fail(p.FIELD_RANGE,`${i}.row must be a number >= 0 when present`,i)}else fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&r.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source must reference an existing task id`,i),"string"==typeof e.target&&e.target.trim()&&r.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target must reference an existing task id`,i)):fail(p.NOT_OBJECT,`${i} must be an object`,i)}):fail(p.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:i}}function validatePowerDsl(e){const t=[],i=[],fail=(e,r,o)=>{t.push(r),i.push({severity:"error",code:e,message:r,path:o})},r=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||fail(p.NODES_NOT_ARRAY,"nodes must be an array");const o=new Set;return r.forEach((e,t)=>{const i=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?o.has(e.id)?fail(p.ID_DUPLICATED,`duplicated node id: ${e.id}`):o.add(e.id):fail(p.ID_INVALID,`${i}.id must be a non-empty string`,i),-1===f.indexOf(e.kind)&&fail(p.KIND_INVALID,`${i}.kind must be one of ${f.join(" / ")}`,i),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||fail(p.FIELD_FORMAT,`${i}.voltageLevel must look like "110kV"`,i)):fail(p.NOT_OBJECT,`${i} must be an object`,i)}),r.forEach((e,t)=>{if(!e||void 0===e.attachedTo)return;const i=r.find(t=>t&&t.id===e.attachedTo);i?"busbar"!==i.kind&&fail(p.ATTACHED_TO_NOT_BUSBAR,`nodes[${t}].attachedTo must point at a busbar: ${e.attachedTo} is ${i.kind}`):fail(p.ATTACHED_TO_UNKNOWN,`nodes[${t}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,t)=>{const i=`edges[${t}]`;e&&"object"==typeof e?(o.has(e.source)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.source references an unknown node: ${e.source}`,i),o.has(e.target)||fail(p.EDGE_ENDPOINT_UNKNOWN,`${i}.target references an unknown node: ${e.target}`,i),e.source===e.target&&fail(p.EDGE_SELF_LOOP,`${i} must not connect a node to itself`,i)):fail(p.NOT_OBJECT,`${i} must be an object`,i)}),{valid:0===t.length,errors:t,diagnostics:i}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,i={}){const r=Number(i.gapX)||90,o=Number(i.gapY)||90,n=void 0===i.originX?80:i.originX,s=void 0===i.originY?80:i.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,c=new Map;e.forEach(e=>{l.set(e.id,0),c.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),c.get(e.sourceId).push(e.targetId))});const p=new Map,f=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(p.set(e.id,0),f.push(e.id))}),f.length||(p.set(e[0].id,0),f.push(e[0].id));let u=e.length*e.length+e.length;for(;f.length&&u-- >0;){const e=f.shift(),t=p.get(e)||0;(c.get(e)||[]).forEach(e=>{const i=t+1;(void 0===p.get(e)?-1:p.get(e))<i&&(p.set(e,i),f.push(e))})}e.forEach(e=>{p.has(e.id)||p.set(e.id,0)});const h=new Map;e.forEach(e=>{const t=p.get(e.id)||0;h.has(t)||h.set(t,[]),h.get(t).push(e)});const g=[...h.keys()].sort((e,t)=>e-t);if("horizontal"===i.direction){const e=g.map(e=>Math.max(...h.get(e).map(e=>e.width)));let t=0;g.forEach((i,n)=>{const s=h.get(i);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(t+(e[n]-i.width)/2),top:Math.round(d)}),d+=i.height+o}),t+=e[n]+r})}else{const e=g.map(e=>Math.max(...h.get(e).map(e=>e.height)));let t=0;g.forEach((i,n)=>{const s=h.get(i);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*r)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(d),top:Math.round(t+(e[n]-i.height)/2)}),d+=i.width+r}),t+=e[n]+o})}const m=Math.min(...e.map(e=>a.get(e.id).left)),N=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-m,e.top+=s-N}),a}const T={terminator:{width:e.terminator.width,height:e.terminator.height,fill:e.terminator.fill,stroke:e.terminator.stroke},process:{width:e.process.width,height:e.process.height,fill:e.process.fill,stroke:e.process.stroke},decision:{width:e.decision.width,height:e.decision.height,fill:e.decision.fill,stroke:e.decision.stroke},io:{width:e.io.width,height:e.io.height,fill:e.io.fill,stroke:e.io.stroke}};function compileFlowDsl(e){const i=e.options||{},r=(e.nodes||[]).map(e=>{const i=function nodeKind$1(e){return e.kind&&T[e.kind]?e.kind:"process"}(e),r=T[i];return{id:e.id,typeId:t.typeId,kind:i,title:(o=e,o.title||o.name||o.id),left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor||r.fill,strokeColor:e.strokeColor||r.stroke};var o}),o=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=i.layout||"layered";return"none"!==n&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,i,r){const o=layeredLayout(e,t,{gapX:i,gapY:r});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(r,o,Number(i.gapX)||90,Number(i.gapY)||90)),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:r,edges:o,layout:n,options:i}}const I={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},v=Number(e.bpmnPool.bandSize)||32,A=Number(e.bpmnLane.bandSize)||32,k=Number(e.bpmnLane.height)||130,S=Number(e.bpmnPool.width)||900,L=28;function toWorkingNode(i){const r=i.kind||"task",o=function presetOf(t){return e[t]||e.bpmnTask}(I[r]||"bpmnTask"),n={id:i.id,typeId:t.typeId,kind:I[r]||"bpmnTask",title:i.title||i.name||i.id,left:"number"==typeof i.left?i.left:0,top:"number"==typeof i.top?i.top:0,width:"number"==typeof i.width?i.width:o.width,height:"number"==typeof i.height?i.height:o.height,fillColor:i.fillColor,strokeColor:i.strokeColor,dslKind:r,parent:i.parent,explicitLeft:"number"==typeof i.left,explicitTop:"number"==typeof i.top,explicitWidth:"number"==typeof i.width,explicitHeight:"number"==typeof i.height};return"event"===r&&(n.eventKind=i.eventKind||o.eventKind||"start",n.trigger=i.trigger||o.trigger||"none"),"gateway"===r&&(n.gatewayType=i.gatewayType||o.gatewayType||"exclusive"),"task"!==r&&"subprocess"!==r||(n.taskType=i.taskType||o.taskType||"none"),n}function buildGroups(e,t){const i=new Map;t.forEach(e=>i.set(e.id,e));const r=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?i.get(e.parent):void 0)||r).nodes.push(e)}),o}function layoutGroups(e,t,i,r){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:i,gapY:r,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,i=1/0,r=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),i=Math.min(i,e.top),r=Math.max(r,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:i,maxX:r,maxY:o}}(e.nodes)})}function compileBpmnDsl(e){const i=e.options||{},r=(e.nodes||[]).map(toWorkingNode),o=r.filter(e=>"pool"===e.dslKind),n=r.filter(e=>"lane"===e.dslKind),s=r.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=i.layout||"auto",l=function resolveLaneOwners(e,t){const i=new Map;return e.forEach(e=>{let r=e.parent;r||1!==t.length||(r=t[0].id),r&&i.set(e.id,r)}),i}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let c=[];"none"!==d&&(c=buildGroups(s,o.concat(n)),layoutGroups(c,a,Number(i.gapX)||90,Number(i.gapY)||60)),n.forEach(e=>{const t=c.filter(t=>t.owner===e)[0],i=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(i?i.maxY-i.minY:0),k))),e.explicitWidth||(e.width=Math.round(Math.max((i?i.maxX-i.minX:0)+A+56,S)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const i=t.reduce((e,t)=>Math.max(e,t.width),S);return e.explicitWidth||(e.width=i),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=v+t.reduce((e,t)=>e+t.height,0)))}const i=c.filter(t=>t.owner===e)[0],r=i?i.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(r?r.maxX-r.minX:0),S))),e.explicitHeight||(e.height=Math.round(Math.max((r?r.maxY-r.minY:0)+v+56,160)))});let p=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=p),p=Math.max(p,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const i=e.top+v,r=Math.max(e.height-v,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(r-o,0)/n.length:0;let a=i;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||k)),a=t.top+t.height})});let f=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=f,f=e.top+e.height+60))}),c.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const i=e.owner;let r=80,o=80;i&&(r=i.left+L,o=i.top+L,"pool"===i.dslKind?o+=v:r+=A),e.nodes.forEach(e=>{e.left=Math.round(r+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(e=>{const i={id:e.id,typeId:t.typeId,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};return void 0!==e.eventKind&&(i.eventKind=e.eventKind),void 0!==e.trigger&&(i.trigger=e.trigger),void 0!==e.gatewayType&&(i.gatewayType=e.gatewayType),void 0!==e.taskType&&(i.taskType=e.taskType),void 0!==e.fillColor&&(i.fillColor=e.fillColor),void 0!==e.strokeColor&&(i.strokeColor=e.strokeColor),i}),edges:a,layout:d,options:i}}function compileUmlDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),r=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(i,r.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});i.forEach(t=>{const i=e.get(t.id);i&&(t.left=i.left,t.top=i.top)})}return i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:i,edges:r,layout:o,options:t}}const x={width:160,height:64},$={width:500,height:200},P=56;function compileStatechartDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{const t=e.kind||"state",i="initial"===t||"final"===t,r="composite"===t?$:i?{width:24,height:24}:x;return{id:e.id,kind:t,title:e.title||e.name||(i?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height}}),r=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;i.forEach(t=>e.set(t.id,t));const o=i.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let i=e.get(t);for(;i&&i.parent&&e.has(i.parent);)i=e.get(i.parent);return i?i.id:t},i=r.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,i,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;i.filter(e=>"composite"===e.kind).forEach(e=>{const t=i.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let r=P,a=P,d=0,l=P;const c=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(r>P&&r+e.width>P+c&&(r=P,a=l+40),n.add(e.id),e.left=r,e.top=a,r+=e.width+40,d=Math.max(d,r),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+P),e.height=Math.max(e.height,l+P)}),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,r)=>{i.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=r,offsetChildren(e,t,r))})};i.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:i,edges:r,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},i=(e.nodes||[]).map((e,t)=>{const i=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:i.left,top:"number"==typeof e.top?e.top:i.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),r=new Map;i.forEach(e=>r.set(e.id,e));return{kind:"power",nodes:i,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(r.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const R={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},V=["terminator","process","decision","io"],M=["class","interface","enum"],C=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const i=e.links;return i&&i[t]||{}}function absolutePosition(e){let t=0,i=0,r=e;for(;r&&r.state&&"number"==typeof r.state.left;)t+=r.state.left||0,i+=r.state.top||0,r=r.parentNode;return{left:Math.round(t),top:Math.round(i)}}function parentIdOf(e){const t=e&&e.parentNode,i=t&&t.state?t.state.id:void 0;return"string"==typeof i&&i.length>0?i:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),i=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:i.left,top:i.top}}function toDsl(e,t={}){const i=e&&e.designer?e.designer:e,r=t.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const t=nodesOf(e)[0],i=t?String(stateOf(t).kind||""):"";return i.startsWith("bpmn")?"bpmn":M.indexOf(i)>=0?"uml":C.indexOf(i)>=0?"statechart":f.indexOf(i)>=0?"power":V.indexOf(i)>=0?"flowchart":void 0}(i);if(!r)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(r){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(i);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:R[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(i);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(i);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(i);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id})})}}(i);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:i.left,top:i.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,voltageLevel:textOf(t.voltageLevel)})})}}(i);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],i=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:i.left,top:i.top})}),relations:i.map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(i)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderDsl(e,t){const r=validateDsl(t);if(!r.valid)throw new Error(r.errors.join("\n"));return isGanttDsl(t)?renderGanttDsl(e,t):isPowerDsl(t)?renderPowerDsl(e,t):isStatechartDsl(t)?renderStatechartDsl(e,t):isUmlDsl(t)?renderUmlDsl(e,t):isBpmnDsl(t)?renderBpmnDsl(e,t):isFlowDsl(t)?renderFlowDsl(e,t):function renderErDsl(e,t){const r=compileDsl(t),o=r.options||{},n=(new i).init(e),s=new l(n);r.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,i){const r=new Map;return e.entities.forEach(e=>{r.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=r.get(e.sourceId),o=r.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],i=o.center[1]-t.center[1];Math.abs(e)>Math.abs(i)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=i>=0?"B":"T",s=i>=0?"T":"B")}return{...e,routeType:e.routeType||i||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,r,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===r.layout||"horizontal"===r.layout)&&new c({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,i){const r=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;r.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,c=e.canvasWidth||0,p=e.canvasHeight||0;if(!c||!p||d<=0||l<=0)return;const f=Number.isFinite(i)&&i>=0?i:40,u=Math.max(1,c-2*f),h=Math.max(1,p-2*f),g=Math.min(u/d,h/l,1),m=(c-d*g)/2-o*g,N=(p-l*g)/2-n*g;e.setViewport(g,m,N)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(e,t)}function renderGanttDsl(e,t){const o=compileGanttDsl(t),n=o.options||{},s=(new i).init(e),a=new r(s);return n.dayWidth&&a.setDayWidth(n.dayWidth),o.nodes.forEach(e=>{a.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),o.edges.forEach(e=>{a.createDependency(e)}),a.select(null),n.autoSchedule&&a.autoSchedule(),n.viewport?s.setViewport(n.viewport.scale,n.viewport.tx,n.viewport.ty):!1!==n.fitViewport&&a.fitViewport(n.fitViewportPadding),a.resetHistory(),withDsl({kind:"gantt",ice:s,designer:a})}function renderPowerDsl(e,t){const r=compilePowerDsl(t),n=r.options||{},s=(new i).init(e),a=new o(s);n.voltageColors&&a.setVoltageColors(n.voltageColors);const d=new Map;return r.nodes.forEach(e=>{const t=a.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),d.set(e.id,t)}),r.attachments.forEach(e=>{const t=d.get(e.deviceId),i=d.get(e.busId);t&&i&&a.attachToBus(t,i)}),r.edges.forEach(e=>{const t=d.get(e.sourceId),i=d.get(e.targetId);t&&i&&a.createLine({sourceId:t.state.id,targetId:i.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),a.select(null),a.applyTopology(),!1!==n.fitViewport&&a.fitViewport(n.fitViewportPadding),a.resetHistory(),withDsl({kind:"power",ice:s,designer:a})}function renderStatechartDsl(e,t){const r=compileStatechartDsl(t),o=r.options||{},s=(new i).init(e),a=new n(s);return r.nodes.forEach(e=>{a.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),r.edges.forEach(e=>{a.createTransition(e)}),a.select(null),o.viewport?s.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&a.fitViewport(o.fitViewportPadding),a.resetHistory(),withDsl({kind:"statechart",ice:s,designer:a})}function renderUmlDsl(e,t){const r=compileUmlDsl(t),o=r.options||{},n=(new i).init(e),a=new s(n);return r.nodes.forEach(e=>{a.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),r.edges.forEach(e=>{a.createRelation(e)}),a.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&a.fitViewport(o.fitViewportPadding),a.resetHistory(),withDsl({kind:"uml",ice:n,designer:a})}function renderBpmnDsl(e,t){const r=compileBpmnDsl(t),o=r.options||{},n=(new i).init(e),s=new a(n);return r.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),s.createNode(e.kind,t)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(e,t){const r=compileFlowDsl(t),o=r.options||{},n=(new i).init(e),s=new d(n);return r.nodes.forEach(e=>{s.createNode(e.kind,e)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}export{u as DSL_SCHEMA_VERSION,p as IED_DSL_CODES,f as POWER_DSL_KINDS,compileBpmnDsl,compileDsl,compileFlowDsl,compileGanttDsl,compilePowerDsl,compileStatechartDsl,compileUmlDsl,isBpmnDsl,isFlowDsl,isGanttDsl,isPowerDsl,isStatechartDsl,isUmlDsl,layeredLayout,renderBpmnDsl,renderDsl,renderFlowDsl,renderGanttDsl,renderPowerDsl,renderStatechartDsl,renderUmlDsl,toDsl,validateBpmnDsl,validateDsl,validateFlowDsl,validateGanttDsl,validatePowerDsl,validateStatechartDsl,validateUmlDsl};
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("ice-entity-designer")):"function"==typeof define&&define.amd?define(["exports","ice-entity-designer"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ICEDSL={},e.IED)}(this,function(e,t){"use strict";function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const i=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const r=["terminator","process","decision","io"],o=["T","R","B","L","C"],n=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],s=["start","intermediate","end"],a=["none","message","timer","error","terminate"],d=["exclusive","parallel","inclusive","event"],l=["none","user","service","script","send","receive","manual"],p=["sequence","message","association"],c=["initial","final","state","composite"],u=["class","interface","enum"],h=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const i=new Set;e.entities.forEach((e,r)=>{const o=`entities[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),Array.isArray(e.fields)?e.fields.forEach((e,i)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||t.push(`${o}.fields[${i}].name must be a non-empty string`)}):t.push(`${o}.fields must be an array`)):t.push(`${o} must be an object`)})}else t.push("entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,i)=>{const r=`relations[${i}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||t.push(`${r}.source must be a non-empty string`),"string"==typeof e.target&&e.target.trim()||t.push(`${r}.target must be a non-empty string`)):t.push(`${r} must be an object`)}):t.push("relations must be an array");return{valid:0===t.length,errors:t}}(e)}function validateBpmnDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set,r=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,o)=>{const p=`nodes[${o}]`;if(!e||"object"!=typeof e)return void t.push(`${p} must be an object`);"string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${p}.id is duplicated: ${e.id}`):(i.add(e.id),r.set(e.id,e.kind||"task")):t.push(`${p}.id must be a non-empty string`),void 0!==e.kind&&-1===n.indexOf(e.kind)&&t.push(`${p}.kind must be one of ${n.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${p}.${i} must be a number when present`)});[["eventKind",s],["trigger",a],["gatewayType",d],["taskType",l]].forEach(([i,r])=>{const o=e[i];void 0!==o&&-1===r.indexOf(o)&&t.push(`${p}.${i} must be one of ${r.join("/")}`)})}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;if("string"!=typeof e.parent||!e.parent.trim())return void t.push(`${n}.parent must be a non-empty string when present`);if(!i.has(e.parent))return void t.push(`${n}.parent must reference an existing node id`);if(e.parent===e.id)return void t.push(`${n}.parent must not reference itself`);const s=r.get(e.parent);"pool"===e.kind?t.push(`${n}.parent is not allowed on a pool (池是最外层容器)`):"lane"===e.kind&&"pool"!==s?t.push(`${n}.parent must reference a pool`):"pool"!==s&&"lane"!==s&&t.push(`${n}.parent must reference a pool or a lane`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.flowType;void 0!==n&&-1===p.indexOf(n)&&t.push(`${o}.type must be one of ${p.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`),void 0!==e.condition&&"string"!=typeof e.condition&&t.push(`${o}.condition must be a string when present`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${o}.linkShape must be "visio" or "bezier" when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateFlowDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,o)=>{const n=`nodes[${o}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===r.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${r.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${n}.${i} must be a number when present`)})):t.push(`${n} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const n=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${n}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${n}.target must reference an existing node id`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${n}.label must be a string when present`),void 0!==e.sourcePort&&-1===o.indexOf(e.sourcePort)&&t.push(`${n}.sourcePort must be one of ${o.join("/")}`),void 0!==e.targetPort&&-1===o.indexOf(e.targetPort)&&t.push(`${n}.targetPort must be one of ${o.join("/")}`),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&t.push(`${n}.linkShape must be "visio" or "bezier" when present`)):t.push(`${n} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateUmlDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),void 0!==e.kind&&-1===u.indexOf(e.kind)&&t.push(`${o}.kind must be one of ${u.join("/")}`),["attributes","methods"].forEach(i=>{const r=e[i];void 0!==r&&(Array.isArray(r)&&!r.some(e=>"string"!=typeof e)||t.push(`${o}.${i} must be an array of strings when present`))}),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${o}.${i} must be a number when present`)})):t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;if(!e||"object"!=typeof e)return void t.push(`${o} must be an object`);"string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`);const n=void 0!==e.type?e.type:e.relation;void 0!==n&&-1===h.indexOf(n)&&t.push(`${o}.type must be one of ${h.join("/")}`),void 0!==e.label&&"string"!=typeof e.label&&t.push(`${o}.label must be a string when present`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateStatechartDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set,r=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,o)=>{const n=`nodes[${o}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${n}.id is duplicated: ${e.id}`):(i.add(e.id),r.set(e.id,e.kind||"state")):t.push(`${n}.id must be a non-empty string`),void 0!==e.kind&&-1===c.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${c.join("/")}`),["left","top","width","height"].forEach(i=>{const r=e[i];void 0!==r&&"number"!=typeof r&&t.push(`${n}.${i} must be a number when present`)})):t.push(`${n} must be an object`)}),e.nodes.forEach((e,o)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const n=`nodes[${o}]`;"string"==typeof e.parent&&e.parent.trim()&&i.has(e.parent)?e.parent!==e.id?"composite"!==r.get(e.parent)&&t.push(`${n}.parent must reference a composite state`):t.push(`${n}.parent must not reference itself`):t.push(`${n}.parent must reference an existing node id`)})):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing node id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing node id`),["event","guard","action","label"].forEach(i=>{const r=e[i];void 0!==r&&"string"!=typeof r&&t.push(`${o}.${i} must be a string when present`)})):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validateGanttDsl(e){const t=[];if(!e||"object"!=typeof e||Array.isArray(e))return{valid:!1,errors:["DSL root must be an object"]};void 0!==e.schemaVersion&&1!==e.schemaVersion&&t.push(`Unsupported schemaVersion: ${e.schemaVersion}`);const i=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,r)=>{const o=`nodes[${r}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?i.has(e.id)?t.push(`${o}.id is duplicated: ${e.id}`):i.add(e.id):t.push(`${o}.id must be a non-empty string`),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||t.push(`${o}.start must be a "YYYY-MM-DD" string`),void 0===e.days||Number(e.days)>=1||t.push(`${o}.days must be a number >= 1 when present`),void 0!==e.progress){const i=Number(e.progress);i>=0&&i<=1||t.push(`${o}.progress must be between 0 and 1 when present`)}void 0===e.row||Number(e.row)>=0||t.push(`${o}.row must be a number >= 0 when present`)}else t.push(`${o} must be an object`)}):t.push("nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,r)=>{const o=`edges[${r}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&i.has(e.source)||t.push(`${o}.source must reference an existing task id`),"string"==typeof e.target&&e.target.trim()&&i.has(e.target)||t.push(`${o}.target must reference an existing task id`)):t.push(`${o} must be an object`)}):t.push("edges must be an array when present"),{valid:0===t.length,errors:t}}function validatePowerDsl(e){const t=[],r=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||t.push("nodes must be an array");const o=new Set;return r.forEach((e,r)=>{const n=`nodes[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?o.has(e.id)?t.push(`duplicated node id: ${e.id}`):o.add(e.id):t.push(`${n}.id must be a non-empty string`),-1===i.indexOf(e.kind)&&t.push(`${n}.kind must be one of ${i.join(" / ")}`),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||t.push(`${n}.voltageLevel must look like "110kV"`)):t.push(`${n} must be an object`)}),r.forEach((e,i)=>{if(!e||void 0===e.attachedTo)return;const o=r.find(t=>t&&t.id===e.attachedTo);o?"busbar"!==o.kind&&t.push(`nodes[${i}].attachedTo must point at a busbar: ${e.attachedTo} is ${o.kind}`):t.push(`nodes[${i}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,i)=>{const r=`edges[${i}]`;e&&"object"==typeof e?(o.has(e.source)||t.push(`${r}.source references an unknown node: ${e.source}`),o.has(e.target)||t.push(`${r}.target references an unknown node: ${e.target}`),e.source===e.target&&t.push(`${r} must not connect a node to itself`)):t.push(`${r} must be an object`)}),{valid:0===t.length,errors:t}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,i={}){const r=Number(i.gapX)||90,o=Number(i.gapY)||90,n=void 0===i.originX?80:i.originX,s=void 0===i.originY?80:i.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,p=new Map;e.forEach(e=>{l.set(e.id,0),p.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),p.get(e.sourceId).push(e.targetId))});const c=new Map,u=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(c.set(e.id,0),u.push(e.id))}),u.length||(c.set(e[0].id,0),u.push(e[0].id));let h=e.length*e.length+e.length;for(;u.length&&h-- >0;){const e=u.shift(),t=c.get(e)||0;(p.get(e)||[]).forEach(e=>{const i=t+1;(void 0===c.get(e)?-1:c.get(e))<i&&(c.set(e,i),u.push(e))})}e.forEach(e=>{c.has(e.id)||c.set(e.id,0)});const f=new Map;e.forEach(e=>{const t=c.get(e.id)||0;f.has(t)||f.set(t,[]),f.get(t).push(e)});const m=[...f.keys()].sort((e,t)=>e-t);if("horizontal"===i.direction){const e=m.map(e=>Math.max(...f.get(e).map(e=>e.width)));let t=0;m.forEach((i,n)=>{const s=f.get(i);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(t+(e[n]-i.width)/2),top:Math.round(d)}),d+=i.height+o}),t+=e[n]+r})}else{const e=m.map(e=>Math.max(...f.get(e).map(e=>e.height)));let t=0;m.forEach((i,n)=>{const s=f.get(i);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*r)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(d),top:Math.round(t+(e[n]-i.height)/2)}),d+=i.width+r}),t+=e[n]+o})}const g=Math.min(...e.map(e=>a.get(e.id).left)),y=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-g,e.top+=s-y}),a}const f={terminator:{width:t.FLOW_NODE_KINDS.terminator.width,height:t.FLOW_NODE_KINDS.terminator.height,fill:t.FLOW_NODE_KINDS.terminator.fill,stroke:t.FLOW_NODE_KINDS.terminator.stroke},process:{width:t.FLOW_NODE_KINDS.process.width,height:t.FLOW_NODE_KINDS.process.height,fill:t.FLOW_NODE_KINDS.process.fill,stroke:t.FLOW_NODE_KINDS.process.stroke},decision:{width:t.FLOW_NODE_KINDS.decision.width,height:t.FLOW_NODE_KINDS.decision.height,fill:t.FLOW_NODE_KINDS.decision.fill,stroke:t.FLOW_NODE_KINDS.decision.stroke},io:{width:t.FLOW_NODE_KINDS.io.width,height:t.FLOW_NODE_KINDS.io.height,fill:t.FLOW_NODE_KINDS.io.fill,stroke:t.FLOW_NODE_KINDS.io.stroke}};function compileFlowDsl(e){const i=e.options||{},r=(e.nodes||[]).map(e=>{const i=function nodeKind$1(e){return e.kind&&f[e.kind]?e.kind:"process"}(e),r=f[i];return{id:e.id,typeId:t.FlowNode.typeId,kind:i,title:(o=e,o.title||o.name||o.id),left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor||r.fill,strokeColor:e.strokeColor||r.stroke};var o}),o=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=i.layout||"layered";return"none"!==n&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,i,r){const o=layeredLayout(e,t,{gapX:i,gapY:r});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(r,o,Number(i.gapX)||90,Number(i.gapY)||90)),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:r,edges:o,layout:n,options:i}}const m={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},g=Number(t.FLOW_NODE_KINDS.bpmnPool.bandSize)||32,y=Number(t.FLOW_NODE_KINDS.bpmnLane.bandSize)||32,b=Number(t.FLOW_NODE_KINDS.bpmnLane.height)||130,w=Number(t.FLOW_NODE_KINDS.bpmnPool.width)||900,v=28;function toWorkingNode(e){const i=e.kind||"task",r=function presetOf(e){return t.FLOW_NODE_KINDS[e]||t.FLOW_NODE_KINDS.bpmnTask}(m[i]||"bpmnTask"),o={id:e.id,typeId:t.FlowNode.typeId,kind:m[i]||"bpmnTask",title:e.title||e.name||e.id,left:"number"==typeof e.left?e.left:0,top:"number"==typeof e.top?e.top:0,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor,strokeColor:e.strokeColor,dslKind:i,parent:e.parent,explicitLeft:"number"==typeof e.left,explicitTop:"number"==typeof e.top,explicitWidth:"number"==typeof e.width,explicitHeight:"number"==typeof e.height};return"event"===i&&(o.eventKind=e.eventKind||r.eventKind||"start",o.trigger=e.trigger||r.trigger||"none"),"gateway"===i&&(o.gatewayType=e.gatewayType||r.gatewayType||"exclusive"),"task"!==i&&"subprocess"!==i||(o.taskType=e.taskType||r.taskType||"none"),o}function buildGroups(e,t){const i=new Map;t.forEach(e=>i.set(e.id,e));const r=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?i.get(e.parent):void 0)||r).nodes.push(e)}),o}function layoutGroups(e,t,i,r){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:i,gapY:r,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,i=1/0,r=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),i=Math.min(i,e.top),r=Math.max(r,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:i,maxX:r,maxY:o}}(e.nodes)})}function compileBpmnDsl(e){const i=e.options||{},r=(e.nodes||[]).map(toWorkingNode),o=r.filter(e=>"pool"===e.dslKind),n=r.filter(e=>"lane"===e.dslKind),s=r.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=i.layout||"auto",l=function resolveLaneOwners(e,t){const i=new Map;return e.forEach(e=>{let r=e.parent;r||1!==t.length||(r=t[0].id),r&&i.set(e.id,r)}),i}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let p=[];"none"!==d&&(p=buildGroups(s,o.concat(n)),layoutGroups(p,a,Number(i.gapX)||90,Number(i.gapY)||60)),n.forEach(e=>{const t=p.filter(t=>t.owner===e)[0],i=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(i?i.maxY-i.minY:0),b))),e.explicitWidth||(e.width=Math.round(Math.max((i?i.maxX-i.minX:0)+y+56,w)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const i=t.reduce((e,t)=>Math.max(e,t.width),w);return e.explicitWidth||(e.width=i),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=g+t.reduce((e,t)=>e+t.height,0)))}const i=p.filter(t=>t.owner===e)[0],r=i?i.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(r?r.maxX-r.minX:0),w))),e.explicitHeight||(e.height=Math.round(Math.max((r?r.maxY-r.minY:0)+g+56,160)))});let c=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=c),c=Math.max(c,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const i=e.top+g,r=Math.max(e.height-g,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(r-o,0)/n.length:0;let a=i;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||b)),a=t.top+t.height})});let u=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=u,u=e.top+e.height+60))}),p.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const i=e.owner;let r=80,o=80;i&&(r=i.left+v,o=i.top+v,"pool"===i.dslKind?o+=g:r+=y),e.nodes.forEach(e=>{e.left=Math.round(r+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(e=>{const i={id:e.id,typeId:t.FlowNode.typeId,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};return void 0!==e.eventKind&&(i.eventKind=e.eventKind),void 0!==e.trigger&&(i.trigger=e.trigger),void 0!==e.gatewayType&&(i.gatewayType=e.gatewayType),void 0!==e.taskType&&(i.taskType=e.taskType),void 0!==e.fillColor&&(i.fillColor=e.fillColor),void 0!==e.strokeColor&&(i.strokeColor=e.strokeColor),i}),edges:a,layout:d,options:i}}function compileUmlDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),r=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(i,r.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});i.forEach(t=>{const i=e.get(t.id);i&&(t.left=i.left,t.top=i.top)})}return i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:i,edges:r,layout:o,options:t}}const D={width:160,height:64},O={width:500,height:200},k=56;function compileStatechartDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{const t=e.kind||"state",i="initial"===t||"final"===t,r="composite"===t?O:i?{width:24,height:24}:D;return{id:e.id,kind:t,title:e.title||e.name||(i?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height}}),r=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;i.forEach(t=>e.set(t.id,t));const o=i.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let i=e.get(t);for(;i&&i.parent&&e.has(i.parent);)i=e.get(i.parent);return i?i.id:t},i=r.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,i,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;i.filter(e=>"composite"===e.kind).forEach(e=>{const t=i.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let r=k,a=k,d=0,l=k;const p=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(r>k&&r+e.width>k+p&&(r=k,a=l+40),n.add(e.id),e.left=r,e.top=a,r+=e.width+40,d=Math.max(d,r),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+k),e.height=Math.max(e.height,l+k)}),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,r)=>{i.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=r,offsetChildren(e,t,r))})};i.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:i,edges:r,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},i=(e.nodes||[]).map((e,t)=>{const i=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:i.left,top:"number"==typeof e.top?e.top:i.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),r=new Map;i.forEach(e=>r.set(e.id,e));return{kind:"power",nodes:i,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(r.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const N={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},x=["terminator","process","decision","io"],$=["class","interface","enum"],E=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const i=e.links;return i&&i[t]||{}}function absolutePosition(e){let t=0,i=0,r=e;for(;r&&r.state&&"number"==typeof r.state.left;)t+=r.state.left||0,i+=r.state.top||0,r=r.parentNode;return{left:Math.round(t),top:Math.round(i)}}function parentIdOf(e){const t=e&&e.parentNode,i=t&&t.state?t.state.id:void 0;return"string"==typeof i&&i.length>0?i:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),i=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:i.left,top:i.top}}function toDsl(e,t={}){const r=e&&e.designer?e.designer:e,o=t.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const t=nodesOf(e)[0],r=t?String(stateOf(t).kind||""):"";return r.startsWith("bpmn")?"bpmn":$.indexOf(r)>=0?"uml":E.indexOf(r)>=0?"statechart":i.indexOf(r)>=0?"power":x.indexOf(r)>=0?"flowchart":void 0}(r);if(!o)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(o){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(r);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:N[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(r);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(r);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(r);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id})})}}(r);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:i.left,top:i.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,voltageLevel:textOf(t.voltageLevel)})})}}(r);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],i=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:i.left,top:i.top})}),relations:i.map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(r)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderGanttDsl(e,i){const r=compileGanttDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.GanttDesigner(n);return o.dayWidth&&s.setDayWidth(o.dayWidth),r.nodes.forEach(e=>{s.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),r.edges.forEach(e=>{s.createDependency(e)}),s.select(null),o.autoSchedule&&s.autoSchedule(),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"gantt",ice:n,designer:s})}function renderPowerDsl(e,i){const r=compilePowerDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.PowerDesigner(n);o.voltageColors&&s.setVoltageColors(o.voltageColors);const a=new Map;return r.nodes.forEach(e=>{const t=s.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),a.set(e.id,t)}),r.attachments.forEach(e=>{const t=a.get(e.deviceId),i=a.get(e.busId);t&&i&&s.attachToBus(t,i)}),r.edges.forEach(e=>{const t=a.get(e.sourceId),i=a.get(e.targetId);t&&i&&s.createLine({sourceId:t.state.id,targetId:i.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),s.select(null),s.applyTopology(),!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"power",ice:n,designer:s})}function renderStatechartDsl(e,i){const r=compileStatechartDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.StatechartDesigner(n);return r.nodes.forEach(e=>{s.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),r.edges.forEach(e=>{s.createTransition(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"statechart",ice:n,designer:s})}function renderUmlDsl(e,i){const r=compileUmlDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.UmlDesigner(n);return r.nodes.forEach(e=>{s.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),r.edges.forEach(e=>{s.createRelation(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"uml",ice:n,designer:s})}function renderBpmnDsl(e,i){const r=compileBpmnDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.BpmnDesigner(n);return r.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),s.createNode(e.kind,t)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(e,i){const r=compileFlowDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.FlowDesigner(n);return r.nodes.forEach(e=>{s.createNode(e.kind,e)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}e.DSL_SCHEMA_VERSION=1,e.POWER_DSL_KINDS=i,e.compileBpmnDsl=compileBpmnDsl,e.compileDsl=compileDsl,e.compileFlowDsl=compileFlowDsl,e.compileGanttDsl=compileGanttDsl,e.compilePowerDsl=compilePowerDsl,e.compileStatechartDsl=compileStatechartDsl,e.compileUmlDsl=compileUmlDsl,e.isBpmnDsl=isBpmnDsl,e.isFlowDsl=isFlowDsl,e.isGanttDsl=isGanttDsl,e.isPowerDsl=isPowerDsl,e.isStatechartDsl=isStatechartDsl,e.isUmlDsl=isUmlDsl,e.layeredLayout=layeredLayout,e.renderBpmnDsl=renderBpmnDsl,e.renderDsl=function renderDsl(e,i){const r=validateDsl(i);if(!r.valid)throw new Error(r.errors.join("\n"));return isGanttDsl(i)?renderGanttDsl(e,i):isPowerDsl(i)?renderPowerDsl(e,i):isStatechartDsl(i)?renderStatechartDsl(e,i):isUmlDsl(i)?renderUmlDsl(e,i):isBpmnDsl(i)?renderBpmnDsl(e,i):isFlowDsl(i)?renderFlowDsl(e,i):function renderErDsl(e,i){const r=compileDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.EntityDesigner(n);r.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,i){const r=new Map;return e.entities.forEach(e=>{r.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=r.get(e.sourceId),o=r.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],i=o.center[1]-t.center[1];Math.abs(e)>Math.abs(i)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=i>=0?"B":"T",s=i>=0?"T":"B")}return{...e,routeType:e.routeType||i||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,r,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===r.layout||"horizontal"===r.layout)&&new t.ICELayeredLayout({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,i){const r=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;r.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,p=e.canvasWidth||0,c=e.canvasHeight||0;if(!p||!c||d<=0||l<=0)return;const u=Number.isFinite(i)&&i>=0?i:40,h=Math.max(1,p-2*u),f=Math.max(1,c-2*u),m=Math.min(h/d,f/l,1),g=(p-d*m)/2-o*m,y=(c-l*m)/2-n*m;e.setViewport(m,g,y)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(e,i)},e.renderFlowDsl=renderFlowDsl,e.renderGanttDsl=renderGanttDsl,e.renderPowerDsl=renderPowerDsl,e.renderStatechartDsl=renderStatechartDsl,e.renderUmlDsl=renderUmlDsl,e.toDsl=toDsl,e.validateBpmnDsl=validateBpmnDsl,e.validateDsl=validateDsl,e.validateFlowDsl=validateFlowDsl,e.validateGanttDsl=validateGanttDsl,e.validatePowerDsl=validatePowerDsl,e.validateStatechartDsl=validateStatechartDsl,e.validateUmlDsl=validateUmlDsl});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("ice-entity-designer")):"function"==typeof define&&define.amd?define(["exports","ice-entity-designer"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ICEDSL={},e.IED)}(this,function(e,t){"use strict";const i={ROOT_NOT_OBJECT:"IED_DSL_ROOT_NOT_OBJECT",SCHEMA_VERSION_UNSUPPORTED:"IED_DSL_SCHEMA_VERSION_UNSUPPORTED",NOT_OBJECT:"IED_DSL_NOT_OBJECT",ID_INVALID:"IED_DSL_ID_INVALID",ID_DUPLICATED:"IED_DSL_ID_DUPLICATED",NODES_NOT_ARRAY:"IED_DSL_NODES_NOT_ARRAY",EDGES_NOT_ARRAY:"IED_DSL_EDGES_NOT_ARRAY",ENTITIES_NOT_ARRAY:"IED_DSL_ENTITIES_NOT_ARRAY",RELATIONS_NOT_ARRAY:"IED_DSL_RELATIONS_NOT_ARRAY",FIELDS_NOT_ARRAY:"IED_DSL_FIELDS_NOT_ARRAY",KIND_INVALID:"IED_DSL_KIND_INVALID",FIELD_TYPE:"IED_DSL_FIELD_TYPE",FIELD_ENUM:"IED_DSL_FIELD_ENUM",FIELD_FORMAT:"IED_DSL_FIELD_FORMAT",FIELD_RANGE:"IED_DSL_FIELD_RANGE",FIELD_NAME_INVALID:"IED_DSL_FIELD_NAME_INVALID",EDGE_ENDPOINT_INVALID:"IED_DSL_EDGE_ENDPOINT_INVALID",EDGE_ENDPOINT_UNKNOWN:"IED_DSL_EDGE_ENDPOINT_UNKNOWN",EDGE_SELF_LOOP:"IED_DSL_EDGE_SELF_LOOP",PARENT_INVALID:"IED_DSL_PARENT_INVALID",PARENT_UNKNOWN:"IED_DSL_PARENT_UNKNOWN",PARENT_SELF:"IED_DSL_PARENT_SELF",PARENT_KIND:"IED_DSL_PARENT_KIND",PARENT_NOT_ALLOWED:"IED_DSL_PARENT_NOT_ALLOWED",ATTACHED_TO_UNKNOWN:"IED_DSL_ATTACHED_TO_UNKNOWN",ATTACHED_TO_NOT_BUSBAR:"IED_DSL_ATTACHED_TO_NOT_BUSBAR"};function isFlowDsl(e){return!!e&&"object"==typeof e&&"flowchart"===e.kind}function isBpmnDsl(e){return!!e&&"object"==typeof e&&"bpmn"===e.kind}function isUmlDsl(e){return!!e&&"object"==typeof e&&"uml"===e.kind}function isStatechartDsl(e){return!!e&&"object"==typeof e&&"statechart"===e.kind}function isGanttDsl(e){return!!e&&"object"==typeof e&&"gantt"===e.kind}const r=["busbar","breaker","disconnector","loadSwitch","earthingSwitch","earth","currentTransformer","voltageTransformer","transformer","fuse","arrester","reactor","generator","motor","load","capacitor","arcSuppressionCoil","threeWindingTransformer","groundingTransformer","groundingResistor","cable","cableTermination","cubicle"];function isPowerDsl(e){return!!e&&"object"==typeof e&&"power"===e.kind}const o=["terminator","process","decision","io"],n=["T","R","B","L","C"],s=["pool","lane","task","event","gateway","subprocess","dataObject","annotation"],a=["start","intermediate","end"],d=["none","message","timer","error","terminate"],l=["exclusive","parallel","inclusive","event"],c=["none","user","service","script","send","receive","manual"],p=["sequence","message","association"],f=["initial","final","state","composite"],u=["class","interface","enum"],h=["inheritance","realization","association","aggregation","composition","dependency"];function validateDsl(e){return isGanttDsl(e)?validateGanttDsl(e):isPowerDsl(e)?validatePowerDsl(e):isStatechartDsl(e)?validateStatechartDsl(e):isUmlDsl(e)?validateUmlDsl(e):isBpmnDsl(e)?validateBpmnDsl(e):isFlowDsl(e)?validateFlowDsl(e):function validateErDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);if(Array.isArray(e.entities)){const t=new Set;e.entities.forEach((e,r)=>{const o=`entities[${r}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?t.has(e.id)?fail(i.ID_DUPLICATED,`${o}.id is duplicated: ${e.id}`,o):t.add(e.id):fail(i.ID_INVALID,`${o}.id must be a non-empty string`,o),Array.isArray(e.fields)?e.fields.forEach((e,t)=>{e&&"object"==typeof e&&"string"==typeof e.name&&e.name.trim()||fail(i.FIELD_NAME_INVALID,`${o}.fields[${t}].name must be a non-empty string`,o)}):fail(i.FIELDS_NOT_ARRAY,`${o}.fields must be an array`,o)):fail(i.NOT_OBJECT,`${o} must be an object`,o)})}else fail(i.ENTITIES_NOT_ARRAY,"entities must be an array");void 0===e.relations||Array.isArray(e.relations)?(e.relations||[]).forEach((e,t)=>{const r=`relations[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()||fail(i.EDGE_ENDPOINT_INVALID,`${r}.source must be a non-empty string`,r),"string"==typeof e.target&&e.target.trim()||fail(i.EDGE_ENDPOINT_INVALID,`${r}.target must be a non-empty string`,r)):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.RELATIONS_NOT_ARRAY,"relations must be an array");return{valid:0===t.length,errors:t,diagnostics:r}}(e)}function validateBpmnDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set,n=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,t)=>{const r=`nodes[${t}]`;if(!e||"object"!=typeof e)return void fail(i.NOT_OBJECT,`${r} must be an object`,r);"string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(i.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):(o.add(e.id),n.set(e.id,e.kind||"task")):fail(i.ID_INVALID,`${r}.id must be a non-empty string`,r),void 0!==e.kind&&-1===s.indexOf(e.kind)&&fail(i.KIND_INVALID,`${r}.kind must be one of ${s.join("/")}`,r),["left","top","width","height"].forEach(t=>{const o=e[t];void 0!==o&&"number"!=typeof o&&fail(i.FIELD_TYPE,`${r}.${t} must be a number when present`,r)});[["eventKind",a],["trigger",d],["gatewayType",l],["taskType",c]].forEach(([t,o])=>{const n=e[t];void 0!==n&&-1===o.indexOf(n)&&fail(i.FIELD_ENUM,`${r}.${t} must be one of ${o.join("/")}`,r)})}),e.nodes.forEach((e,t)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const r=`nodes[${t}]`;if("string"!=typeof e.parent||!e.parent.trim())return void fail(i.PARENT_INVALID,`${r}.parent must be a non-empty string when present`,r);if(!o.has(e.parent))return void fail(i.PARENT_UNKNOWN,`${r}.parent must reference an existing node id`,r);if(e.parent===e.id)return void fail(i.PARENT_SELF,`${r}.parent must not reference itself`,r);const s=n.get(e.parent);"pool"===e.kind?fail(i.PARENT_NOT_ALLOWED,`${r}.parent is not allowed on a pool (池是最外层容器)`,r):"lane"===e.kind&&"pool"!==s?fail(i.PARENT_KIND,`${r}.parent must reference a pool`,r):"pool"!==s&&"lane"!==s&&fail(i.PARENT_KIND,`${r}.parent must reference a pool or a lane`,r)})):fail(i.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;if(!e||"object"!=typeof e)return void fail(i.NOT_OBJECT,`${r} must be an object`,r);"string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source must reference an existing node id`,r),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target must reference an existing node id`,r);const n=void 0!==e.type?e.type:e.flowType;void 0!==n&&-1===p.indexOf(n)&&fail(i.FIELD_ENUM,`${r}.type must be one of ${p.join("/")}`,r),void 0!==e.label&&"string"!=typeof e.label&&fail(i.FIELD_TYPE,`${r}.label must be a string when present`,r),void 0!==e.condition&&"string"!=typeof e.condition&&fail(i.FIELD_TYPE,`${r}.condition must be a string when present`,r),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(i.FIELD_ENUM,`${r}.linkShape must be "visio" or "bezier" when present`,r)}):fail(i.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:r}}function validateFlowDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const s=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const r=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?s.has(e.id)?fail(i.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):s.add(e.id):fail(i.ID_INVALID,`${r}.id must be a non-empty string`,r),void 0!==e.kind&&-1===o.indexOf(e.kind)&&fail(i.KIND_INVALID,`${r}.kind must be one of ${o.join("/")}`,r),["left","top","width","height"].forEach(t=>{const o=e[t];void 0!==o&&"number"!=typeof o&&fail(i.FIELD_TYPE,`${r}.${t} must be a number when present`,r)})):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&s.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source must reference an existing node id`,r),"string"==typeof e.target&&e.target.trim()&&s.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target must reference an existing node id`,r),void 0!==e.label&&"string"!=typeof e.label&&fail(i.FIELD_TYPE,`${r}.label must be a string when present`,r),void 0!==e.sourcePort&&-1===n.indexOf(e.sourcePort)&&fail(i.FIELD_ENUM,`${r}.sourcePort must be one of ${n.join("/")}`,r),void 0!==e.targetPort&&-1===n.indexOf(e.targetPort)&&fail(i.FIELD_ENUM,`${r}.targetPort must be one of ${n.join("/")}`,r),void 0!==e.linkShape&&"visio"!==e.linkShape&&"bezier"!==e.linkShape&&fail(i.FIELD_ENUM,`${r}.linkShape must be "visio" or "bezier" when present`,r)):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:r}}function validateUmlDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const r=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(i.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):o.add(e.id):fail(i.ID_INVALID,`${r}.id must be a non-empty string`,r),void 0!==e.kind&&-1===u.indexOf(e.kind)&&fail(i.KIND_INVALID,`${r}.kind must be one of ${u.join("/")}`,r),["attributes","methods"].forEach(t=>{const o=e[t];void 0!==o&&(Array.isArray(o)&&!o.some(e=>"string"!=typeof e)||fail(i.FIELD_TYPE,`${r}.${t} must be an array of strings when present`,r))}),["left","top","width","height"].forEach(t=>{const o=e[t];void 0!==o&&"number"!=typeof o&&fail(i.FIELD_TYPE,`${r}.${t} must be a number when present`,r)})):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;if(!e||"object"!=typeof e)return void fail(i.NOT_OBJECT,`${r} must be an object`,r);"string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source must reference an existing node id`,r),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target must reference an existing node id`,r);const n=void 0!==e.type?e.type:e.relation;void 0!==n&&-1===h.indexOf(n)&&fail(i.FIELD_ENUM,`${r}.type must be one of ${h.join("/")}`,r),void 0!==e.label&&"string"!=typeof e.label&&fail(i.FIELD_TYPE,`${r}.label must be a string when present`,r)}):fail(i.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:r}}function validateStatechartDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set,n=new Map;return Array.isArray(e.nodes)?(e.nodes.forEach((e,t)=>{const r=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(i.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):(o.add(e.id),n.set(e.id,e.kind||"state")):fail(i.ID_INVALID,`${r}.id must be a non-empty string`,r),void 0!==e.kind&&-1===f.indexOf(e.kind)&&fail(i.KIND_INVALID,`${r}.kind must be one of ${f.join("/")}`,r),["left","top","width","height"].forEach(t=>{const o=e[t];void 0!==o&&"number"!=typeof o&&fail(i.FIELD_TYPE,`${r}.${t} must be a number when present`,r)})):fail(i.NOT_OBJECT,`${r} must be an object`,r)}),e.nodes.forEach((e,t)=>{if(!e||"object"!=typeof e||void 0===e.parent)return;const r=`nodes[${t}]`;"string"==typeof e.parent&&e.parent.trim()&&o.has(e.parent)?e.parent!==e.id?"composite"!==n.get(e.parent)&&fail(i.PARENT_KIND,`${r}.parent must reference a composite state`,r):fail(i.PARENT_SELF,`${r}.parent must not reference itself`,r):fail(i.PARENT_UNKNOWN,`${r}.parent must reference an existing node id`,r)})):fail(i.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source must reference an existing node id`,r),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target must reference an existing node id`,r),["event","guard","action","label"].forEach(t=>{const o=e[t];void 0!==o&&"string"!=typeof o&&fail(i.FIELD_TYPE,`${r}.${t} must be a string when present`,r)})):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:r}}function validateGanttDsl(e){const t=[],r=[],fail=(e,i,o)=>{t.push(i),r.push({severity:"error",code:e,message:i,path:o})};if(!e||"object"!=typeof e||Array.isArray(e))return fail(i.ROOT_NOT_OBJECT,"DSL root must be an object"),{valid:!1,errors:t,diagnostics:r};void 0!==e.schemaVersion&&1!==e.schemaVersion&&fail(i.SCHEMA_VERSION_UNSUPPORTED,`Unsupported schemaVersion: ${e.schemaVersion}`);const o=new Set;return Array.isArray(e.nodes)?e.nodes.forEach((e,t)=>{const r=`nodes[${t}]`;if(e&&"object"==typeof e){if("string"==typeof e.id&&e.id.trim()?o.has(e.id)?fail(i.ID_DUPLICATED,`${r}.id is duplicated: ${e.id}`,r):o.add(e.id):fail(i.ID_INVALID,`${r}.id must be a non-empty string`,r),"string"==typeof e.start&&/^\d{4}-\d{2}-\d{2}$/.test(e.start)||fail(i.FIELD_FORMAT,`${r}.start must be a "YYYY-MM-DD" string`,r),void 0===e.days||Number(e.days)>=1||fail(i.FIELD_RANGE,`${r}.days must be a number >= 1 when present`,r),void 0!==e.progress){const t=Number(e.progress);t>=0&&t<=1||fail(i.FIELD_RANGE,`${r}.progress must be between 0 and 1 when present`,r)}void 0===e.row||Number(e.row)>=0||fail(i.FIELD_RANGE,`${r}.row must be a number >= 0 when present`,r)}else fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.NODES_NOT_ARRAY,"nodes must be an array"),void 0===e.edges||Array.isArray(e.edges)?(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;e&&"object"==typeof e?("string"==typeof e.source&&e.source.trim()&&o.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source must reference an existing task id`,r),"string"==typeof e.target&&e.target.trim()&&o.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target must reference an existing task id`,r)):fail(i.NOT_OBJECT,`${r} must be an object`,r)}):fail(i.EDGES_NOT_ARRAY,"edges must be an array when present"),{valid:0===t.length,errors:t,diagnostics:r}}function validatePowerDsl(e){const t=[],o=[],fail=(e,i,r)=>{t.push(i),o.push({severity:"error",code:e,message:i,path:r})},n=Array.isArray(e.nodes)?e.nodes:[];Array.isArray(e.nodes)||fail(i.NODES_NOT_ARRAY,"nodes must be an array");const s=new Set;return n.forEach((e,t)=>{const o=`nodes[${t}]`;e&&"object"==typeof e?("string"==typeof e.id&&e.id?s.has(e.id)?fail(i.ID_DUPLICATED,`duplicated node id: ${e.id}`):s.add(e.id):fail(i.ID_INVALID,`${o}.id must be a non-empty string`,o),-1===r.indexOf(e.kind)&&fail(i.KIND_INVALID,`${o}.kind must be one of ${r.join(" / ")}`,o),void 0===e.voltageLevel||/^\d+(\.\d+)?kV$/.test(String(e.voltageLevel))||fail(i.FIELD_FORMAT,`${o}.voltageLevel must look like "110kV"`,o)):fail(i.NOT_OBJECT,`${o} must be an object`,o)}),n.forEach((e,t)=>{if(!e||void 0===e.attachedTo)return;const r=n.find(t=>t&&t.id===e.attachedTo);r?"busbar"!==r.kind&&fail(i.ATTACHED_TO_NOT_BUSBAR,`nodes[${t}].attachedTo must point at a busbar: ${e.attachedTo} is ${r.kind}`):fail(i.ATTACHED_TO_UNKNOWN,`nodes[${t}].attachedTo references an unknown node: ${e.attachedTo}`)}),(e.edges||[]).forEach((e,t)=>{const r=`edges[${t}]`;e&&"object"==typeof e?(s.has(e.source)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.source references an unknown node: ${e.source}`,r),s.has(e.target)||fail(i.EDGE_ENDPOINT_UNKNOWN,`${r}.target references an unknown node: ${e.target}`,r),e.source===e.target&&fail(i.EDGE_SELF_LOOP,`${r} must not connect a node to itself`,r)):fail(i.NOT_OBJECT,`${r} must be an object`,r)}),{valid:0===t.length,errors:t,diagnostics:o}}function entityName(e){return e.entityName||e.name||e.id}function relationType(e){return e.relationType||e.type||"one-to-many"}function compileDsl(e){if(isFlowDsl(e))throw new Error("compileDsl() 只处理 ER 文档;流程图文档请使用 compileFlowDsl()");if(!e||!Array.isArray(e.entities))throw new Error("ER 文档必须包含 entities 数组");return{entities:e.entities.map(e=>({id:e.id,entityName:entityName(e),fields:e.fields||[],left:e.left,top:e.top,width:e.width,height:e.height,style:e.style,headerStyle:e.headerStyle,fieldStyle:e.fieldStyle,dividerStyle:e.dividerStyle,draggable:e.draggable,interactive:e.interactive})),relations:(e.relations||[]).map((e,t)=>({id:e.id||`relation-${t}`,relationType:relationType(e),sourceId:e.source,targetId:e.target,sourceField:e.sourceField||"id",targetField:e.targetField||"id",nullable:e.nullable,onDelete:e.onDelete,onUpdate:e.onUpdate,joinTableName:e.joinTableName,fromKey:e.fromKey,toKey:e.toKey,sourceCardinality:e.sourceCardinality,targetCardinality:e.targetCardinality,label:e.label,style:e.style,arrow:e.arrow,linkShape:e.linkShape,routeType:e.routeType,routeOffset:e.routeOffset,curveType:e.curveType,lineDash:e.lineDash})),layout:e.layout,options:e.options}}function layeredLayout(e,t,i={}){const r=Number(i.gapX)||90,o=Number(i.gapY)||90,n=void 0===i.originX?80:i.originX,s=void 0===i.originY?80:i.originY,a=new Map;if(!e.length)return a;const d=new Map;e.forEach(e=>d.set(e.id,e));const l=new Map,c=new Map;e.forEach(e=>{l.set(e.id,0),c.set(e.id,[])}),t.forEach(e=>{d.has(e.sourceId)&&d.has(e.targetId)&&(l.set(e.targetId,(l.get(e.targetId)||0)+1),c.get(e.sourceId).push(e.targetId))});const p=new Map,f=[];e.forEach(e=>{0===(l.get(e.id)||0)&&(p.set(e.id,0),f.push(e.id))}),f.length||(p.set(e[0].id,0),f.push(e[0].id));let u=e.length*e.length+e.length;for(;f.length&&u-- >0;){const e=f.shift(),t=p.get(e)||0;(c.get(e)||[]).forEach(e=>{const i=t+1;(void 0===p.get(e)?-1:p.get(e))<i&&(p.set(e,i),f.push(e))})}e.forEach(e=>{p.has(e.id)||p.set(e.id,0)});const h=new Map;e.forEach(e=>{const t=p.get(e.id)||0;h.has(t)||h.set(t,[]),h.get(t).push(e)});const g=[...h.keys()].sort((e,t)=>e-t);if("horizontal"===i.direction){const e=g.map(e=>Math.max(...h.get(e).map(e=>e.width)));let t=0;g.forEach((i,n)=>{const s=h.get(i);let d=-(s.reduce((e,t)=>e+t.height,0)+Math.max(s.length-1,0)*o)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(t+(e[n]-i.width)/2),top:Math.round(d)}),d+=i.height+o}),t+=e[n]+r})}else{const e=g.map(e=>Math.max(...h.get(e).map(e=>e.height)));let t=0;g.forEach((i,n)=>{const s=h.get(i);let d=-(s.reduce((e,t)=>e+t.width,0)+Math.max(s.length-1,0)*r)/2;s.forEach(i=>{a.set(i.id,{left:Math.round(d),top:Math.round(t+(e[n]-i.height)/2)}),d+=i.width+r}),t+=e[n]+o})}const m=Math.min(...e.map(e=>a.get(e.id).left)),D=Math.min(...e.map(e=>a.get(e.id).top));return a.forEach(e=>{e.left+=n-m,e.top+=s-D}),a}const g={terminator:{width:t.FLOW_NODE_KINDS.terminator.width,height:t.FLOW_NODE_KINDS.terminator.height,fill:t.FLOW_NODE_KINDS.terminator.fill,stroke:t.FLOW_NODE_KINDS.terminator.stroke},process:{width:t.FLOW_NODE_KINDS.process.width,height:t.FLOW_NODE_KINDS.process.height,fill:t.FLOW_NODE_KINDS.process.fill,stroke:t.FLOW_NODE_KINDS.process.stroke},decision:{width:t.FLOW_NODE_KINDS.decision.width,height:t.FLOW_NODE_KINDS.decision.height,fill:t.FLOW_NODE_KINDS.decision.fill,stroke:t.FLOW_NODE_KINDS.decision.stroke},io:{width:t.FLOW_NODE_KINDS.io.width,height:t.FLOW_NODE_KINDS.io.height,fill:t.FLOW_NODE_KINDS.io.fill,stroke:t.FLOW_NODE_KINDS.io.stroke}};function compileFlowDsl(e){const i=e.options||{},r=(e.nodes||[]).map(e=>{const i=function nodeKind$1(e){return e.kind&&g[e.kind]?e.kind:"process"}(e),r=g[i];return{id:e.id,typeId:t.FlowNode.typeId,kind:i,title:(o=e,o.title||o.name||o.id),left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor||r.fill,strokeColor:e.strokeColor||r.stroke};var o}),o=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",label:e.label||"",linkShape:e.linkShape||"visio"})),n=i.layout||"layered";return"none"!==n&&r.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))&&(r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),function autoLayout(e,t,i,r){const o=layeredLayout(e,t,{gapX:i,gapY:r});e.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)})}(r,o,Number(i.gapX)||90,Number(i.gapY)||90)),r.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"flowchart",nodes:r,edges:o,layout:n,options:i}}const m={pool:"bpmnPool",lane:"bpmnLane",task:"bpmnTask",event:"bpmnEvent",gateway:"bpmnGateway",subprocess:"bpmnSubprocess",dataObject:"bpmnDataObject",annotation:"bpmnAnnotation"},D=Number(t.FLOW_NODE_KINDS.bpmnPool.bandSize)||32,N=Number(t.FLOW_NODE_KINDS.bpmnLane.bandSize)||32,E=Number(t.FLOW_NODE_KINDS.bpmnLane.height)||130,y=Number(t.FLOW_NODE_KINDS.bpmnPool.width)||900,O=28;function toWorkingNode(e){const i=e.kind||"task",r=function presetOf(e){return t.FLOW_NODE_KINDS[e]||t.FLOW_NODE_KINDS.bpmnTask}(m[i]||"bpmnTask"),o={id:e.id,typeId:t.FlowNode.typeId,kind:m[i]||"bpmnTask",title:e.title||e.name||e.id,left:"number"==typeof e.left?e.left:0,top:"number"==typeof e.top?e.top:0,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height,fillColor:e.fillColor,strokeColor:e.strokeColor,dslKind:i,parent:e.parent,explicitLeft:"number"==typeof e.left,explicitTop:"number"==typeof e.top,explicitWidth:"number"==typeof e.width,explicitHeight:"number"==typeof e.height};return"event"===i&&(o.eventKind=e.eventKind||r.eventKind||"start",o.trigger=e.trigger||r.trigger||"none"),"gateway"===i&&(o.gatewayType=e.gatewayType||r.gatewayType||"exclusive"),"task"!==i&&"subprocess"!==i||(o.taskType=e.taskType||r.taskType||"none"),o}function buildGroups(e,t){const i=new Map;t.forEach(e=>i.set(e.id,e));const r=1===t.length?t[0]:null,o=[];return e.forEach(e=>{(e=>{let t=o.filter(t=>t.owner===e)[0];return t||(t={owner:e,nodes:[],box:null,didLayout:!1},o.push(t)),t})((e.parent?i.get(e.parent):void 0)||r).nodes.push(e)}),o}function layoutGroups(e,t,i,r){e.forEach(e=>{if(e.nodes.some(e=>!e.explicitLeft||!e.explicitTop)){const o=layeredLayout(e.nodes,t,{gapX:i,gapY:r,originX:0,originY:0,direction:"horizontal"});e.nodes.forEach(e=>{const t=o.get(e.id);t&&(e.left=t.left,e.top=t.top)}),e.didLayout=!0}e.box=function unionBox(e){if(!e.length)return null;let t=1/0,i=1/0,r=-1/0,o=-1/0;return e.forEach(e=>{t=Math.min(t,e.left),i=Math.min(i,e.top),r=Math.max(r,e.left+e.width),o=Math.max(o,e.top+e.height)}),{minX:t,minY:i,maxX:r,maxY:o}}(e.nodes)})}function compileBpmnDsl(e){const i=e.options||{},r=(e.nodes||[]).map(toWorkingNode),o=r.filter(e=>"pool"===e.dslKind),n=r.filter(e=>"lane"===e.dslKind),s=r.filter(e=>!function isContainer(e){return"pool"===e.dslKind||"lane"===e.dslKind}(e)),a=(e.edges||[]).map((e,t)=>({id:e.id||`edge-${t}`,sourceId:e.source,targetId:e.target,flowType:e.type||e.flowType||"sequence",label:e.label||"",condition:e.condition||"",isDefault:!!e.isDefault,linkShape:e.linkShape||"visio"})),d=i.layout||"auto",l=function resolveLaneOwners(e,t){const i=new Map;return e.forEach(e=>{let r=e.parent;r||1!==t.length||(r=t[0].id),r&&i.set(e.id,r)}),i}(n,o),lanesOf=e=>n.filter(t=>l.get(t.id)===e);let c=[];"none"!==d&&(c=buildGroups(s,o.concat(n)),layoutGroups(c,a,Number(i.gapX)||90,Number(i.gapY)||60)),n.forEach(e=>{const t=c.filter(t=>t.owner===e)[0],i=t?t.box:null;e.explicitHeight||(e.height=Math.round(Math.max(56+(i?i.maxY-i.minY:0),E))),e.explicitWidth||(e.width=Math.round(Math.max((i?i.maxX-i.minX:0)+N+56,y)))}),o.forEach(e=>{const t=lanesOf(e.id);if(t.length){const i=t.reduce((e,t)=>Math.max(e,t.width),y);return e.explicitWidth||(e.width=i),e.explicitWidth&&t.forEach(t=>{t.explicitWidth||(t.width=e.width)}),void(e.explicitHeight||(e.height=D+t.reduce((e,t)=>e+t.height,0)))}const i=c.filter(t=>t.owner===e)[0],r=i?i.box:null;e.explicitWidth||(e.width=Math.round(Math.max(56+(r?r.maxX-r.minX:0),y))),e.explicitHeight||(e.height=Math.round(Math.max((r?r.maxY-r.minY:0)+D+56,160)))});let p=60;o.forEach(e=>{e.explicitLeft||(e.left=60),e.explicitTop||(e.top=p),p=Math.max(p,e.top+e.height+60)}),o.forEach(e=>{const t=lanesOf(e.id);if(!t.length)return;const i=e.top+D,r=Math.max(e.height-D,1),o=t.reduce((e,t)=>e+(t.explicitHeight?t.height:0),0),n=t.filter(e=>!e.explicitHeight),s=n.length?Math.max(r-o,0)/n.length:0;let a=i;t.forEach(t=>{t.explicitLeft||(t.left=e.left),t.explicitTop||(t.top=a),!t.explicitHeight&&e.explicitHeight&&(t.height=Math.round(s||E)),a=t.top+t.height})});let f=60;n.forEach(e=>{l.get(e.id)||(e.explicitLeft||(e.left=60),e.explicitTop||(e.top=f,f=e.top+e.height+60))}),c.forEach(e=>{const t=e.box;if(!t||!e.didLayout)return;const i=e.owner;let r=80,o=80;i&&(r=i.left+O,o=i.top+O,"pool"===i.dslKind?o+=D:r+=N),e.nodes.forEach(e=>{e.left=Math.round(r+(e.left-t.minX)),e.top=Math.round(o+(e.top-t.minY))})});return{kind:"bpmn",nodes:o.concat(n).concat(s).map(e=>{const i={id:e.id,typeId:t.FlowNode.typeId,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};return void 0!==e.eventKind&&(i.eventKind=e.eventKind),void 0!==e.trigger&&(i.trigger=e.trigger),void 0!==e.gatewayType&&(i.gatewayType=e.gatewayType),void 0!==e.taskType&&(i.taskType=e.taskType),void 0!==e.fillColor&&(i.fillColor=e.fillColor),void 0!==e.strokeColor&&(i.strokeColor=e.strokeColor),i}),edges:a,layout:d,options:i}}function compileUmlDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{return{id:e.id,kind:(t=e,t.kind||"class"),className:e.title||e.name||e.id,abstract:!!e.abstract,attributes:Array.isArray(e.attributes)?e.attributes.map(e=>String(e)):[],methods:Array.isArray(e.methods)?e.methods.map(e=>String(e)):[],left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:240,height:"number"==typeof e.height?e.height:120+24*(e.attributes?e.attributes.length:0)+24*(e.methods?e.methods.length:0)};var t}),r=(e.edges||[]).map((e,t)=>({id:e.id||`relation-${t}`,sourceId:e.source,targetId:e.target,relationKind:e.type||e.relation||"association",label:e.label||""})),o=t.layout||"layered";if("none"!==o&&i.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const e=layeredLayout(i,r.filter(e=>"inheritance"===e.relationKind||"realization"===e.relationKind).map(e=>({sourceId:e.targetId,targetId:e.sourceId})),{gapX:Number(t.gapX)||80,gapY:Number(t.gapY)||110,originX:80,originY:80,direction:"vertical"});i.forEach(t=>{const i=e.get(t.id);i&&(t.left=i.left,t.top=i.top)})}return i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)}),{kind:"uml",nodes:i,edges:r,layout:o,options:t}}const b={width:160,height:64},_={width:500,height:200},w=56;function compileStatechartDsl(e){const t=e.options||{},i=(e.nodes||[]).map(e=>{const t=e.kind||"state",i="initial"===t||"final"===t,r="composite"===t?_:i?{width:24,height:24}:b;return{id:e.id,kind:t,title:e.title||e.name||(i?"":e.id),parent:e.parent,left:"number"==typeof e.left?e.left:Number.NaN,top:"number"==typeof e.top?e.top:Number.NaN,width:"number"==typeof e.width?e.width:r.width,height:"number"==typeof e.height?e.height:r.height}}),r=(e.edges||[]).map((e,t)=>({id:e.id||`transition-${t}`,sourceId:e.source,targetId:e.target,event:e.event||"",guard:e.guard||"",action:e.action||"",label:e.label})),o=t.layout||"auto",n=new Set;if("none"!==o){const e=new Map;i.forEach(t=>e.set(t.id,t));const o=i.filter(t=>!(t.parent&&e.has(t.parent)));if(o.some(e=>Number.isNaN(e.left)||Number.isNaN(e.top))){const containerOf=t=>{let i=e.get(t);for(;i&&i.parent&&e.has(i.parent);)i=e.get(i.parent);return i?i.id:t},i=r.map(e=>({sourceId:containerOf(e.sourceId),targetId:containerOf(e.targetId)})).filter(e=>e.sourceId!==e.targetId),n=layeredLayout(o,i,{gapX:Number(t.gapX)||110,gapY:Number(t.gapY)||80,originX:80,originY:80,direction:"horizontal"});o.forEach(e=>{const t=n.get(e.id);t&&(e.left=t.left,e.top=t.top)})}let s=0;i.filter(e=>"composite"===e.kind).forEach(e=>{const t=i.filter(t=>t.parent===e.id);if(Number.isNaN(e.left)&&(e.left=80),Number.isNaN(e.top)){const t=Math.max(...o.filter(t=>t!==e&&!Number.isNaN(t.top)).map(e=>e.top+e.height),0);e.top=Math.max(t+60,80)+s,s+=e.height+60}if(!t.length)return;let r=w,a=w,d=0,l=w;const c=e.width-112;t.forEach(e=>{(Number.isNaN(e.left)||Number.isNaN(e.top))&&(r>w&&r+e.width>w+c&&(r=w,a=l+40),n.add(e.id),e.left=r,e.top=a,r+=e.width+40,d=Math.max(d,r),l=Math.max(l,a+e.height))}),e.width=Math.max(e.width,d+w),e.height=Math.max(e.height,l+w)}),i.forEach(e=>{Number.isNaN(e.left)&&(e.left=0),Number.isNaN(e.top)&&(e.top=0)});const offsetChildren=(e,t,r)=>{i.filter(t=>t.parent===e.id).forEach(e=>{n.has(e.id)&&(e.left+=t,e.top+=r,offsetChildren(e,t,r))})};i.filter(e=>"composite"===e.kind).forEach(e=>offsetChildren(e,e.left,e.top))}return{kind:"statechart",nodes:i,edges:r,layout:o,options:t}}function compileGanttDsl(e){const t=e.options||{};return{kind:"gantt",nodes:(e.nodes||[]).map((e,t)=>({id:e.id,title:e.title||e.name||e.id,start:String(e.start||""),days:"number"==typeof e.days?e.days:1,progress:"number"==typeof e.progress?e.progress:0,row:"number"==typeof e.row?e.row:t,resource:String(e.resource||"")})),edges:(e.edges||[]).map((e,t)=>({id:e.id||`dependency-${t}`,sourceId:e.source,targetId:e.target})),options:t}}function compilePowerDsl(e){const t=e.options||{},i=(e.nodes||[]).map((e,t)=>{const i=function defaultPlacement(e){return{left:120+e%6*200,top:120+160*Math.floor(e/6)}}(t);return{id:e.id,kind:e.kind,title:e.title||e.name||e.id,voltageLevel:String(e.voltageLevel||""),left:"number"==typeof e.left?e.left:i.left,top:"number"==typeof e.top?e.top:i.top,width:e.width,height:e.height,switchState:e.switchState,source:!!e.source}}),r=new Map;i.forEach(e=>r.set(e.id,e));return{kind:"power",nodes:i,edges:(e.edges||[]).map((e,t)=>({id:e.id||`conductor-${t}`,sourceId:e.source,targetId:e.target,sourcePort:e.sourcePort||"B",targetPort:e.targetPort||"T",voltageLevel:e.voltageLevel||(r.get(e.source)||{}).voltageLevel||""})),attachments:(e.nodes||[]).filter(e=>!!e.attachedTo).map(e=>({deviceId:e.id,busId:String(e.attachedTo)})),options:t}}const I={bpmnPool:"pool",bpmnLane:"lane",bpmnTask:"task",bpmnEvent:"event",bpmnGateway:"gateway",bpmnSubprocess:"subprocess",bpmnDataObject:"dataObject",bpmnAnnotation:"annotation"},T=["terminator","process","decision","io"],v=["class","interface","enum"],A=["initial","final","state","composite"];function stateOf(e){return e&&e.state||{}}function linkOf(e,t){const i=e.links;return i&&i[t]||{}}function absolutePosition(e){let t=0,i=0,r=e;for(;r&&r.state&&"number"==typeof r.state.left;)t+=r.state.left||0,i+=r.state.top||0,r=r.parentNode;return{left:Math.round(t),top:Math.round(i)}}function parentIdOf(e){const t=e&&e.parentNode,i=t&&t.state?t.state.id:void 0;return"string"==typeof i&&i.length>0?i:void 0}function numberOf(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function textOf(e){return"string"==typeof e&&e.length>0?e:void 0}function clean(e){const t={};return Object.keys(e).forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),t}function nodesOf(e){return e&&Array.isArray(e.nodes)?e.nodes:[]}function edgesOf(e){return e&&Array.isArray(e.edges)?e.edges:[]}function baseOf(e){const t=stateOf(e),i=absolutePosition(e);return{id:t.id,title:textOf(t.title),left:i.left,top:i.top}}function toDsl(e,t={}){const i=e&&e.designer?e.designer:e,o=t.kind||e&&e.kind||function detectKind(e){if(!e)return;if(Array.isArray(e.entities))return"entity";if(void 0!==e.originDate||void 0!==e.dayWidth)return"gantt";const t=nodesOf(e)[0],i=t?String(stateOf(t).kind||""):"";return i.startsWith("bpmn")?"bpmn":v.indexOf(i)>=0?"uml":A.indexOf(i)>=0?"statechart":r.indexOf(i)>=0?"power":T.indexOf(i)>=0?"flowchart":void 0}(i);if(!o)throw new Error("toDsl(): 无法推断文档类型(实例里没有可识别的图元)。请显式传入 kind:'flowchart' | 'bpmn' | 'uml' | 'statechart' | 'gantt' | 'power' | 'entity'。");switch(o){case"flowchart":return function exportFlow(e){return{schemaVersion:1,kind:"flowchart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:t.kind,width:numberOf(t.width),height:numberOf(t.height),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,label:textOf(t.label)||"",linkShape:textOf(t.linkShape)})})}}(i);case"bpmn":return function exportBpmn(e){return{schemaVersion:1,kind:"bpmn",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:I[t.kind]||"task",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height),eventKind:textOf(t.eventKind),trigger:textOf(t.trigger),gatewayType:textOf(t.gatewayType),taskType:textOf(t.taskType),fillColor:textOf(t.fillColor),strokeColor:textOf(t.strokeColor)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.flowType)||"sequence",label:textOf(t.label),condition:textOf(t.condition),isDefault:!0===t.isDefault||void 0,linkShape:textOf(t.linkShape)})})}}(i);case"uml":return function exportUml(e){return{schemaVersion:1,kind:"uml",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"class",title:textOf(t.className)||textOf(t.title),abstract:!0===t.abstract||void 0,attributes:Array.isArray(t.attributes)?t.attributes.map(e=>String(e)):[],methods:Array.isArray(t.methods)?t.methods.map(e=>String(e)):[],width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:textOf(t.relationKind)||"association",label:textOf(t.label)})})}}(i);case"statechart":return function exportStatechart(e){return{schemaVersion:1,kind:"statechart",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({...baseOf(e),kind:textOf(t.kind)||"state",parent:parentIdOf(e),width:numberOf(t.width),height:numberOf(t.height)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,event:textOf(t.event),guard:textOf(t.guard),action:textOf(t.action),label:textOf(t.label)})})}}(i);case"gantt":return function exportGantt(e){return{schemaVersion:1,kind:"gantt",nodes:nodesOf(e).map(e=>{const t=stateOf(e);return clean({id:t.id,title:textOf(t.title),start:textOf(t.start),days:numberOf(t.days),progress:numberOf(t.progress),row:numberOf(t.row),resource:textOf(t.resource)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id})})}}(i);case"power":return function exportPower(e){return{schemaVersion:1,kind:"power",nodes:nodesOf(e).map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,kind:t.kind,title:textOf(t.title)||textOf(t.name),voltageLevel:textOf(t.voltageLevel),left:i.left,top:i.top,width:numberOf(t.width),height:numberOf(t.height),switchState:textOf(t.switchState),source:!0===t.source||!0===t.energizedSource||void 0,attachedTo:textOf(t.attachedBusId)})}),edges:edgesOf(e).map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,sourcePort:i.position,targetPort:r.position,voltageLevel:textOf(t.voltageLevel)})})}}(i);default:return function exportEr(e){const t=e&&Array.isArray(e.entities)?e.entities:[],i=e&&Array.isArray(e.relations)?e.relations:[];return{schemaVersion:1,entities:t.map(e=>{const t=stateOf(e),i=absolutePosition(e);return clean({id:t.id,name:textOf(t.entityName),fields:Array.isArray(t.fields)?t.fields:[],left:i.left,top:i.top})}),relations:i.map(e=>{const t=stateOf(e),i=linkOf(t,"start"),r=linkOf(t,"end");return clean({id:t.id,source:i.id,target:r.id,type:t.relationType,sourceField:textOf(t.sourceField),targetField:textOf(t.targetField),label:textOf(t.label),onDelete:textOf(t.onDelete),onUpdate:textOf(t.onUpdate),joinTableName:textOf(t.joinTableName),nullable:"boolean"==typeof t.nullable?t.nullable:void 0,sourceCardinality:textOf(t.sourceCardinality),targetCardinality:textOf(t.targetCardinality),linkShape:textOf(t.linkShape)})})}}(i)}}function withDsl(e){return Object.assign(e,{toDsl:()=>toDsl(e)})}function renderGanttDsl(e,i){const r=compileGanttDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.GanttDesigner(n);return o.dayWidth&&s.setDayWidth(o.dayWidth),r.nodes.forEach(e=>{s.createTask({id:e.id,title:e.title,start:e.start,days:e.days,progress:e.progress,row:e.row,resource:e.resource})}),r.edges.forEach(e=>{s.createDependency(e)}),s.select(null),o.autoSchedule&&s.autoSchedule(),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"gantt",ice:n,designer:s})}function renderPowerDsl(e,i){const r=compilePowerDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.PowerDesigner(n);o.voltageColors&&s.setVoltageColors(o.voltageColors);const a=new Map;return r.nodes.forEach(e=>{const t=s.createSymbol(e.kind,{id:e.id,title:e.title,name:e.title,voltageLevel:e.voltageLevel,left:e.left,top:e.top,width:e.width,height:e.height,switchState:e.switchState});e.source&&t.setState({energizedSource:!0}),a.set(e.id,t)}),r.attachments.forEach(e=>{const t=a.get(e.deviceId),i=a.get(e.busId);t&&i&&s.attachToBus(t,i)}),r.edges.forEach(e=>{const t=a.get(e.sourceId),i=a.get(e.targetId);t&&i&&s.createLine({sourceId:t.state.id,targetId:i.state.id,sourcePort:e.sourcePort,targetPort:e.targetPort,voltageLevel:e.voltageLevel})}),s.select(null),s.applyTopology(),!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"power",ice:n,designer:s})}function renderStatechartDsl(e,i){const r=compileStatechartDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.StatechartDesigner(n);return r.nodes.forEach(e=>{s.createState({id:e.id,kind:e.kind,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height})}),r.edges.forEach(e=>{s.createTransition(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"statechart",ice:n,designer:s})}function renderUmlDsl(e,i){const r=compileUmlDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.UmlDesigner(n);return r.nodes.forEach(e=>{s.createClass({id:e.id,kind:e.kind,className:e.className,abstract:e.abstract,attributes:e.attributes,methods:e.methods,left:e.left,top:e.top,width:e.width})}),r.edges.forEach(e=>{s.createRelation(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"uml",ice:n,designer:s})}function renderBpmnDsl(e,i){const r=compileBpmnDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.BpmnDesigner(n);return r.nodes.forEach(e=>{const t={id:e.id,title:e.title,left:e.left,top:e.top,width:e.width,height:e.height};["eventKind","trigger","gatewayType","taskType","fillColor","strokeColor"].forEach(i=>{void 0!==e[i]&&(t[i]=e[i])}),s.createNode(e.kind,t)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"bpmn",ice:n,designer:s})}function renderFlowDsl(e,i){const r=compileFlowDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.FlowDesigner(n);return r.nodes.forEach(e=>{s.createNode(e.kind,e)}),r.edges.forEach(e=>{s.createEdge(e)}),s.select(null),o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):!1!==o.fitViewport&&s.fitViewport(o.fitViewportPadding),s.resetHistory(),withDsl({kind:"flowchart",ice:n,designer:s})}e.DSL_SCHEMA_VERSION=1,e.IED_DSL_CODES=i,e.POWER_DSL_KINDS=r,e.compileBpmnDsl=compileBpmnDsl,e.compileDsl=compileDsl,e.compileFlowDsl=compileFlowDsl,e.compileGanttDsl=compileGanttDsl,e.compilePowerDsl=compilePowerDsl,e.compileStatechartDsl=compileStatechartDsl,e.compileUmlDsl=compileUmlDsl,e.isBpmnDsl=isBpmnDsl,e.isFlowDsl=isFlowDsl,e.isGanttDsl=isGanttDsl,e.isPowerDsl=isPowerDsl,e.isStatechartDsl=isStatechartDsl,e.isUmlDsl=isUmlDsl,e.layeredLayout=layeredLayout,e.renderBpmnDsl=renderBpmnDsl,e.renderDsl=function renderDsl(e,i){const r=validateDsl(i);if(!r.valid)throw new Error(r.errors.join("\n"));return isGanttDsl(i)?renderGanttDsl(e,i):isPowerDsl(i)?renderPowerDsl(e,i):isStatechartDsl(i)?renderStatechartDsl(e,i):isUmlDsl(i)?renderUmlDsl(e,i):isBpmnDsl(i)?renderBpmnDsl(e,i):isFlowDsl(i)?renderFlowDsl(e,i):function renderErDsl(e,i){const r=compileDsl(i),o=r.options||{},n=(new t.ICE).init(e),s=new t.EntityDesigner(n);r.entities.forEach(e=>{s.createEntity(e)}),function positionLinks(e,t,i){const r=new Map;return e.entities.forEach(e=>{r.set(e.state.id,e.getMinBoundingBox(!0))}),t.relations.map(e=>{const t=r.get(e.sourceId),o=r.get(e.targetId);let n="R",s="L";if(t&&o){const e=o.center[0]-t.center[0],i=o.center[1]-t.center[1];Math.abs(e)>Math.abs(i)?(n=e>=0?"R":"L",s=e>=0?"L":"R"):(n=i>=0?"B":"T",s=i>=0?"T":"B")}return{...e,routeType:e.routeType||i||"orthogonal",linkShape:e.linkShape||"visio",links:{start:{id:e.sourceId,position:n},end:{id:e.targetId,position:s}}}})}(s,r,o.routeType).forEach(e=>{s.createRelation(e)}),("layered"===r.layout||"horizontal"===r.layout)&&new t.ICELayeredLayout({gapX:o.gapX||120,gapY:o.gapY||50}).layoutContainer(n);o.viewport?n.setViewport(o.viewport.scale,o.viewport.tx,o.viewport.ty):o.fitViewport&&function fitViewport(e,t,i){const r=t.entities||[];let o=1/0,n=1/0,s=-1/0,a=-1/0;r.forEach(e=>{const t=e.getMinBoundingBox(!0).getMinAndMaxPoint();o=Math.min(o,t.minX),n=Math.min(n,t.minY),s=Math.max(s,t.maxX),a=Math.max(a,t.maxY)});const d=s-o,l=a-n,c=e.canvasWidth||0,p=e.canvasHeight||0;if(!c||!p||d<=0||l<=0)return;const f=Number.isFinite(i)&&i>=0?i:40,u=Math.max(1,c-2*f),h=Math.max(1,p-2*f),g=Math.min(u/d,h/l,1),m=(c-d*g)/2-o*g,D=(p-l*g)/2-n*g;e.setViewport(g,m,D)}(n,s,o.fitViewportPadding);return withDsl({kind:"entity",ice:n,designer:s})}(e,i)},e.renderFlowDsl=renderFlowDsl,e.renderGanttDsl=renderGanttDsl,e.renderPowerDsl=renderPowerDsl,e.renderStatechartDsl=renderStatechartDsl,e.renderUmlDsl=renderUmlDsl,e.toDsl=toDsl,e.validateBpmnDsl=validateBpmnDsl,e.validateDsl=validateDsl,e.validateFlowDsl=validateFlowDsl,e.validateGanttDsl=validateGanttDsl,e.validatePowerDsl=validatePowerDsl,e.validateStatechartDsl=validateStatechartDsl,e.validateUmlDsl=validateUmlDsl});
@@ -191,9 +191,83 @@ export type DslBpmnDocument = {
191
191
  };
192
192
  /** 一份 DSL 文档:ER(默认)、流程图、BPMN、UML 或 状态机 */
193
193
  export type DslDocument = DslErDocument | DslFlowDocument | DslBpmnDocument | DslUmlDocument | DslStatechartDocument | DslGanttDocument;
194
+ /**
195
+ * 稳定诊断码。
196
+ *
197
+ * `errors: string[]` 是**给人读的英文句子**(保持原样,兼容既有调用方);
198
+ * `diagnostics` 是给**机器读的**:`code` 是合同(Agent / 工具据此分支、纠错、转述),
199
+ * `path` 指出位置。契约见 ice-render `docs/architecture/17-i18n-boundary.md`:
200
+ * 引擎/库不翻译文案,但必须给稳定 id,否则消费方只能匹配自然语言。
201
+ */
202
+ export declare const IED_DSL_CODES: {
203
+ /** 根节点不是对象 */
204
+ readonly ROOT_NOT_OBJECT: "IED_DSL_ROOT_NOT_OBJECT";
205
+ /** `schemaVersion` 不受支持 */
206
+ readonly SCHEMA_VERSION_UNSUPPORTED: "IED_DSL_SCHEMA_VERSION_UNSUPPORTED";
207
+ /** 节点/连线本身不是对象 */
208
+ readonly NOT_OBJECT: "IED_DSL_NOT_OBJECT";
209
+ /** `id` 缺失或不是非空字符串 */
210
+ readonly ID_INVALID: "IED_DSL_ID_INVALID";
211
+ /** `id` 重复 */
212
+ readonly ID_DUPLICATED: "IED_DSL_ID_DUPLICATED";
213
+ /** `nodes` 不是数组 */
214
+ readonly NODES_NOT_ARRAY: "IED_DSL_NODES_NOT_ARRAY";
215
+ /** `edges` 不是数组 */
216
+ readonly EDGES_NOT_ARRAY: "IED_DSL_EDGES_NOT_ARRAY";
217
+ /** `entities` 不是数组 */
218
+ readonly ENTITIES_NOT_ARRAY: "IED_DSL_ENTITIES_NOT_ARRAY";
219
+ /** `relations` 不是数组 */
220
+ readonly RELATIONS_NOT_ARRAY: "IED_DSL_RELATIONS_NOT_ARRAY";
221
+ /** `fields` 不是数组 */
222
+ readonly FIELDS_NOT_ARRAY: "IED_DSL_FIELDS_NOT_ARRAY";
223
+ /** `kind` / `type` 不在允许集合里 */
224
+ readonly KIND_INVALID: "IED_DSL_KIND_INVALID";
225
+ /** 字段类型不对(应为字符串 / 数字 / 字符串数组) */
226
+ readonly FIELD_TYPE: "IED_DSL_FIELD_TYPE";
227
+ /** 字段取值不在枚举集合里 */
228
+ readonly FIELD_ENUM: "IED_DSL_FIELD_ENUM";
229
+ /** 字段格式不对(日期、电压等级等) */
230
+ readonly FIELD_FORMAT: "IED_DSL_FIELD_FORMAT";
231
+ /** 字段取值越界(行号 / 天数 / 进度) */
232
+ readonly FIELD_RANGE: "IED_DSL_FIELD_RANGE";
233
+ /** 字段名(如 `fields[i].name`)非法 */
234
+ readonly FIELD_NAME_INVALID: "IED_DSL_FIELD_NAME_INVALID";
235
+ /** 连线端点不是非空字符串 */
236
+ readonly EDGE_ENDPOINT_INVALID: "IED_DSL_EDGE_ENDPOINT_INVALID";
237
+ /** 连线端点指向不存在的节点 */
238
+ readonly EDGE_ENDPOINT_UNKNOWN: "IED_DSL_EDGE_ENDPOINT_UNKNOWN";
239
+ /** 连线自环 */
240
+ readonly EDGE_SELF_LOOP: "IED_DSL_EDGE_SELF_LOOP";
241
+ /** `parent` 不是非空字符串 */
242
+ readonly PARENT_INVALID: "IED_DSL_PARENT_INVALID";
243
+ /** `parent` 指向不存在的节点 */
244
+ readonly PARENT_UNKNOWN: "IED_DSL_PARENT_UNKNOWN";
245
+ /** `parent` 指向自己 */
246
+ readonly PARENT_SELF: "IED_DSL_PARENT_SELF";
247
+ /** `parent` 指向了不允许的节点类型(池 / 泳道 / 复合状态…) */
248
+ readonly PARENT_KIND: "IED_DSL_PARENT_KIND";
249
+ /** 该节点不允许有 `parent`(如池) */
250
+ readonly PARENT_NOT_ALLOWED: "IED_DSL_PARENT_NOT_ALLOWED";
251
+ /** `attachedTo` 指向不存在的节点 */
252
+ readonly ATTACHED_TO_UNKNOWN: "IED_DSL_ATTACHED_TO_UNKNOWN";
253
+ /** `attachedTo` 指向的不是母线 */
254
+ readonly ATTACHED_TO_NOT_BUSBAR: "IED_DSL_ATTACHED_TO_NOT_BUSBAR";
255
+ };
256
+ export type IedDslDiagnostic = {
257
+ severity: 'error' | 'warning';
258
+ /** 稳定诊断码(见 {@link IED_DSL_CODES}) */
259
+ code: string;
260
+ /** 默认英文文案(给人看;机器请用 code) */
261
+ message: string;
262
+ /** 出问题的位置,如 `nodes[3].source` */
263
+ path?: string;
264
+ };
194
265
  export type DslValidationResult = {
195
266
  valid: boolean;
267
+ /** 英文错误句子(保持原样,兼容既有调用方) */
196
268
  errors: string[];
269
+ /** 稳定诊断(含 code / path):Agent 与工具用它做分支与纠错 */
270
+ diagnostics: IedDslDiagnostic[];
197
271
  };
198
272
  /** 运行时判别:带 kind: 'flowchart' 的按流程图文档处理 */
199
273
  export declare function isFlowDsl(dsl: any): dsl is DslFlowDocument;
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "ice-entity-designer-dsl",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "description": "A JSON-first DSL layer for AI agents to drive ice-entity-designer.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/ice-render/ice-entity-designer-dsl.git"
8
+ },
5
9
  "main": "dist/index.cjs",
6
10
  "module": "dist/index.mjs",
7
11
  "browser": "dist/index.umd.js",