@aetherwing/fcp-drawio 0.2.0
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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/adapter.d.ts +38 -0
- package/dist/adapter.js +259 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/elk-layout.d.ts +49 -0
- package/dist/layout/elk-layout.js +144 -0
- package/dist/layout/elk-layout.js.map +1 -0
- package/dist/lib/drawio-cli.d.ts +22 -0
- package/dist/lib/drawio-cli.js +88 -0
- package/dist/lib/drawio-cli.js.map +1 -0
- package/dist/lib/node-types.d.ts +22 -0
- package/dist/lib/node-types.js +174 -0
- package/dist/lib/node-types.js.map +1 -0
- package/dist/lib/stencils/aws.d.ts +2 -0
- package/dist/lib/stencils/aws.js +69 -0
- package/dist/lib/stencils/aws.js.map +1 -0
- package/dist/lib/stencils/azure.d.ts +2 -0
- package/dist/lib/stencils/azure.js +54 -0
- package/dist/lib/stencils/azure.js.map +1 -0
- package/dist/lib/stencils/cisco.d.ts +2 -0
- package/dist/lib/stencils/cisco.js +30 -0
- package/dist/lib/stencils/cisco.js.map +1 -0
- package/dist/lib/stencils/gcp.d.ts +2 -0
- package/dist/lib/stencils/gcp.js +38 -0
- package/dist/lib/stencils/gcp.js.map +1 -0
- package/dist/lib/stencils/ibm.d.ts +2 -0
- package/dist/lib/stencils/ibm.js +32 -0
- package/dist/lib/stencils/ibm.js.map +1 -0
- package/dist/lib/stencils/index.d.ts +10 -0
- package/dist/lib/stencils/index.js +33 -0
- package/dist/lib/stencils/index.js.map +1 -0
- package/dist/lib/stencils/k8s.d.ts +2 -0
- package/dist/lib/stencils/k8s.js +32 -0
- package/dist/lib/stencils/k8s.js.map +1 -0
- package/dist/lib/stencils/types.d.ts +14 -0
- package/dist/lib/stencils/types.js +2 -0
- package/dist/lib/stencils/types.js.map +1 -0
- package/dist/lib/themes.d.ts +8 -0
- package/dist/lib/themes.js +32 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/model/defaults.d.ts +3 -0
- package/dist/model/defaults.js +26 -0
- package/dist/model/defaults.js.map +1 -0
- package/dist/model/diagram-model.d.ts +110 -0
- package/dist/model/diagram-model.js +938 -0
- package/dist/model/diagram-model.js.map +1 -0
- package/dist/model/event-log.d.ts +30 -0
- package/dist/model/event-log.js +112 -0
- package/dist/model/event-log.js.map +1 -0
- package/dist/model/id.d.ts +9 -0
- package/dist/model/id.js +35 -0
- package/dist/model/id.js.map +1 -0
- package/dist/model/reference-registry.d.ts +33 -0
- package/dist/model/reference-registry.js +143 -0
- package/dist/model/reference-registry.js.map +1 -0
- package/dist/model/spatial.d.ts +20 -0
- package/dist/model/spatial.js +59 -0
- package/dist/model/spatial.js.map +1 -0
- package/dist/parser/parse-op.d.ts +18 -0
- package/dist/parser/parse-op.js +430 -0
- package/dist/parser/parse-op.js.map +1 -0
- package/dist/parser/resolve-ref.d.ts +27 -0
- package/dist/parser/resolve-ref.js +232 -0
- package/dist/parser/resolve-ref.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +6 -0
- package/dist/parser/tokenizer.js +7 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/serialization/connector-intelligence.d.ts +35 -0
- package/dist/serialization/connector-intelligence.js +336 -0
- package/dist/serialization/connector-intelligence.js.map +1 -0
- package/dist/serialization/deserialize.d.ts +6 -0
- package/dist/serialization/deserialize.js +511 -0
- package/dist/serialization/deserialize.js.map +1 -0
- package/dist/serialization/serialize.d.ts +15 -0
- package/dist/serialization/serialize.js +332 -0
- package/dist/serialization/serialize.js.map +1 -0
- package/dist/server/intent-layer.d.ts +48 -0
- package/dist/server/intent-layer.js +1322 -0
- package/dist/server/intent-layer.js.map +1 -0
- package/dist/server/mcp-server.d.ts +7 -0
- package/dist/server/mcp-server.js +26 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/model-map.d.ts +8 -0
- package/dist/server/model-map.js +240 -0
- package/dist/server/model-map.js.map +1 -0
- package/dist/server/query-handler.d.ts +19 -0
- package/dist/server/query-handler.js +148 -0
- package/dist/server/query-handler.js.map +1 -0
- package/dist/server/response-formatter.d.ts +56 -0
- package/dist/server/response-formatter.js +351 -0
- package/dist/server/response-formatter.js.map +1 -0
- package/dist/server/session-handler.d.ts +6 -0
- package/dist/server/session-handler.js +127 -0
- package/dist/server/session-handler.js.map +1 -0
- package/dist/types/index.d.ts +238 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/verb-specs.d.ts +6 -0
- package/dist/verb-specs.js +144 -0
- package/dist/verb-specs.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
import { inflateSync } from "node:zlib";
|
|
3
|
+
import { createDefaultStyle } from "../model/defaults.js";
|
|
4
|
+
import { getStencilPrefixes } from "../lib/stencils/index.js";
|
|
5
|
+
// ── XML parser configuration ────────────────────────────────
|
|
6
|
+
const parser = new XMLParser({
|
|
7
|
+
ignoreAttributes: false,
|
|
8
|
+
attributeNamePrefix: "@_",
|
|
9
|
+
allowBooleanAttributes: true,
|
|
10
|
+
parseAttributeValue: false, // keep all values as strings
|
|
11
|
+
});
|
|
12
|
+
// ── Compressed content handling ─────────────────────────────
|
|
13
|
+
function isCompressed(content) {
|
|
14
|
+
const trimmed = content.trim();
|
|
15
|
+
return trimmed.length > 0 && !trimmed.startsWith("<");
|
|
16
|
+
}
|
|
17
|
+
function decompressContent(encoded) {
|
|
18
|
+
const buffer = Buffer.from(encoded.trim(), "base64");
|
|
19
|
+
const inflated = inflateSync(buffer, { finishFlush: 2 }); // Z_SYNC_FLUSH
|
|
20
|
+
return decodeURIComponent(inflated.toString());
|
|
21
|
+
}
|
|
22
|
+
// ── Style string parsing ────────────────────────────────────
|
|
23
|
+
function parseStyleString(styleStr) {
|
|
24
|
+
const result = {};
|
|
25
|
+
if (!styleStr)
|
|
26
|
+
return result;
|
|
27
|
+
const parts = styleStr.split(";").filter((s) => s.length > 0);
|
|
28
|
+
for (const part of parts) {
|
|
29
|
+
const eqIdx = part.indexOf("=");
|
|
30
|
+
if (eqIdx === -1) {
|
|
31
|
+
// A bare token like "ellipse", "rhombus", "rounded", "triangle"
|
|
32
|
+
// Store as key with empty value to preserve it
|
|
33
|
+
result[part] = "";
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const key = part.substring(0, eqIdx);
|
|
37
|
+
const value = part.substring(eqIdx + 1);
|
|
38
|
+
result[key] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build a StyleSet from a parsed style map.
|
|
45
|
+
*/
|
|
46
|
+
function buildStyleSet(styleMap) {
|
|
47
|
+
const style = createDefaultStyle();
|
|
48
|
+
if (styleMap["fillColor"])
|
|
49
|
+
style.fillColor = styleMap["fillColor"];
|
|
50
|
+
if (styleMap["strokeColor"])
|
|
51
|
+
style.strokeColor = styleMap["strokeColor"];
|
|
52
|
+
if (styleMap["fontColor"])
|
|
53
|
+
style.fontColor = styleMap["fontColor"];
|
|
54
|
+
if (styleMap["fontSize"])
|
|
55
|
+
style.fontSize = parseInt(styleMap["fontSize"], 10);
|
|
56
|
+
if (styleMap["fontFamily"])
|
|
57
|
+
style.fontFamily = styleMap["fontFamily"];
|
|
58
|
+
if (styleMap["fontStyle"])
|
|
59
|
+
style.fontStyle = parseInt(styleMap["fontStyle"], 10);
|
|
60
|
+
if (styleMap["rounded"] === "1" || styleMap["rounded"] === "")
|
|
61
|
+
style.rounded = true;
|
|
62
|
+
if (styleMap["dashed"] === "1")
|
|
63
|
+
style.dashed = true;
|
|
64
|
+
if (styleMap["shadow"] === "1")
|
|
65
|
+
style.shadow = true;
|
|
66
|
+
if (styleMap["opacity"])
|
|
67
|
+
style.opacity = parseInt(styleMap["opacity"], 10);
|
|
68
|
+
if (styleMap["align"])
|
|
69
|
+
style.align = styleMap["align"];
|
|
70
|
+
if (styleMap["verticalAlign"])
|
|
71
|
+
style.verticalAlign = styleMap["verticalAlign"];
|
|
72
|
+
// Preserve unknown properties in the extensible bucket
|
|
73
|
+
const knownKeys = new Set([
|
|
74
|
+
"fillColor", "strokeColor", "fontColor", "fontSize", "fontFamily",
|
|
75
|
+
"fontStyle", "rounded", "dashed", "shadow", "opacity", "align", "verticalAlign",
|
|
76
|
+
// draw.io structural keys that are part of the base style, not extensible
|
|
77
|
+
"dashPattern",
|
|
78
|
+
"whiteSpace", "html", "aspect", "boundedLbl", "backgroundOutline",
|
|
79
|
+
"size", "perimeter", "fixedSize", "container", "connectable",
|
|
80
|
+
"collapsed",
|
|
81
|
+
]);
|
|
82
|
+
for (const [key, value] of Object.entries(styleMap)) {
|
|
83
|
+
if (!knownKeys.has(key) && !isBaseStyleToken(key)) {
|
|
84
|
+
style[key] = value;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return style;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build an EdgeStyleSet from a parsed style map.
|
|
91
|
+
*/
|
|
92
|
+
function buildEdgeStyleSet(styleMap) {
|
|
93
|
+
const base = buildStyleSet(styleMap);
|
|
94
|
+
const edgeStyle = {
|
|
95
|
+
...base,
|
|
96
|
+
edgeStyle: styleMap["edgeStyle"] || "orthogonalEdgeStyle",
|
|
97
|
+
curved: styleMap["curved"] === "1",
|
|
98
|
+
flowAnimation: styleMap["flowAnimation"] === "1",
|
|
99
|
+
dotted: styleMap["dashed"] === "1" && styleMap["dashPattern"] !== undefined,
|
|
100
|
+
};
|
|
101
|
+
// Copy strokeWidth as extensible if present
|
|
102
|
+
if (styleMap["strokeWidth"]) {
|
|
103
|
+
edgeStyle["strokeWidth"] = styleMap["strokeWidth"];
|
|
104
|
+
}
|
|
105
|
+
return edgeStyle;
|
|
106
|
+
}
|
|
107
|
+
// ── Shape type inference from style ─────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Tokens that are part of base styles and don't go into extensible bucket.
|
|
110
|
+
*/
|
|
111
|
+
function isBaseStyleToken(key) {
|
|
112
|
+
// Bare tokens from base styles (no '=' in original)
|
|
113
|
+
const bareTokens = new Set([
|
|
114
|
+
"ellipse", "rhombus", "triangle",
|
|
115
|
+
]);
|
|
116
|
+
return bareTokens.has(key);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Infer the ShapeType from a draw.io style string's parsed map.
|
|
120
|
+
* Uses NODE_TYPES definitions to reverse-match.
|
|
121
|
+
*/
|
|
122
|
+
function inferShapeType(styleMap) {
|
|
123
|
+
const shape = styleMap["shape"] || "";
|
|
124
|
+
// Direct shape mappings
|
|
125
|
+
if (shape === "cylinder3")
|
|
126
|
+
return "db";
|
|
127
|
+
if (shape === "hexagon")
|
|
128
|
+
return "api";
|
|
129
|
+
if (shape === "cloud")
|
|
130
|
+
return "cloud";
|
|
131
|
+
if (shape === "mxgraph.basic.person")
|
|
132
|
+
return "actor";
|
|
133
|
+
if (shape === "document")
|
|
134
|
+
return "doc";
|
|
135
|
+
if (shape === "parallelogram")
|
|
136
|
+
return "queue";
|
|
137
|
+
if (shape === "process")
|
|
138
|
+
return "process";
|
|
139
|
+
// Bare token checks
|
|
140
|
+
if ("rhombus" in styleMap)
|
|
141
|
+
return "decision";
|
|
142
|
+
if ("triangle" in styleMap)
|
|
143
|
+
return "triangle";
|
|
144
|
+
if ("ellipse" in styleMap && shape !== "cloud")
|
|
145
|
+
return "circle";
|
|
146
|
+
// rounded=1 without a specific shape → svc
|
|
147
|
+
if (styleMap["rounded"] === "1" || styleMap["rounded"] === "")
|
|
148
|
+
return "svc";
|
|
149
|
+
// Default fallback
|
|
150
|
+
return "box";
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Parse arrow type from draw.io style values.
|
|
154
|
+
*/
|
|
155
|
+
function parseArrowType(arrowValue, fillValue) {
|
|
156
|
+
if (!arrowValue || arrowValue === "classic")
|
|
157
|
+
return "arrow";
|
|
158
|
+
if (arrowValue === "open")
|
|
159
|
+
return "open-arrow";
|
|
160
|
+
if (arrowValue === "diamond")
|
|
161
|
+
return "diamond";
|
|
162
|
+
if (arrowValue === "oval")
|
|
163
|
+
return "circle";
|
|
164
|
+
if (arrowValue === "ERmany")
|
|
165
|
+
return "crow-foot";
|
|
166
|
+
if (arrowValue === "none")
|
|
167
|
+
return "none";
|
|
168
|
+
return "arrow";
|
|
169
|
+
}
|
|
170
|
+
function parseBounds(cell) {
|
|
171
|
+
const geom = cell.mxGeometry;
|
|
172
|
+
if (!geom)
|
|
173
|
+
return { x: 0, y: 0, width: 120, height: 60 };
|
|
174
|
+
return {
|
|
175
|
+
x: parseFloat(geom["@_x"] || "0"),
|
|
176
|
+
y: parseFloat(geom["@_y"] || "0"),
|
|
177
|
+
width: Math.max(parseFloat(geom["@_width"] || "120"), 20),
|
|
178
|
+
height: Math.max(parseFloat(geom["@_height"] || "60"), 20),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function parseWaypoints(cell) {
|
|
182
|
+
const geom = cell.mxGeometry;
|
|
183
|
+
if (!geom?.Array)
|
|
184
|
+
return [];
|
|
185
|
+
const arr = geom.Array;
|
|
186
|
+
if (arr["@_as"] !== "points")
|
|
187
|
+
return [];
|
|
188
|
+
const points = arr.mxPoint;
|
|
189
|
+
if (!points)
|
|
190
|
+
return [];
|
|
191
|
+
const pointList = Array.isArray(points) ? points : [points];
|
|
192
|
+
return pointList.map((p) => ({
|
|
193
|
+
x: parseFloat(p["@_x"] || "0"),
|
|
194
|
+
y: parseFloat(p["@_y"] || "0"),
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
function processCells(cells) {
|
|
198
|
+
const shapes = new Map();
|
|
199
|
+
const edges = new Map();
|
|
200
|
+
const groups = new Map();
|
|
201
|
+
const layers = [];
|
|
202
|
+
let defaultLayer = "1";
|
|
203
|
+
let layerOrder = 0;
|
|
204
|
+
// First pass: identify layers and the default layer
|
|
205
|
+
for (const cell of cells) {
|
|
206
|
+
const id = cell["@_id"] || "";
|
|
207
|
+
const parent = cell["@_parent"] || "";
|
|
208
|
+
if (id === "0") {
|
|
209
|
+
// Root cell — skip
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (id === "1" && parent === "0") {
|
|
213
|
+
// Default layer
|
|
214
|
+
defaultLayer = "1";
|
|
215
|
+
layers.push({
|
|
216
|
+
id: "1",
|
|
217
|
+
name: "Default",
|
|
218
|
+
visible: true,
|
|
219
|
+
locked: false,
|
|
220
|
+
order: layerOrder++,
|
|
221
|
+
});
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (parent === "0" && id !== "1") {
|
|
225
|
+
// Additional layer
|
|
226
|
+
const name = cell["@_value"] || `Layer-${id}`;
|
|
227
|
+
layers.push({
|
|
228
|
+
id,
|
|
229
|
+
name,
|
|
230
|
+
visible: true,
|
|
231
|
+
locked: false,
|
|
232
|
+
order: layerOrder++,
|
|
233
|
+
});
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// If no default layer was found, create one
|
|
238
|
+
if (layers.length === 0) {
|
|
239
|
+
layers.push({
|
|
240
|
+
id: "1",
|
|
241
|
+
name: "Default",
|
|
242
|
+
visible: true,
|
|
243
|
+
locked: false,
|
|
244
|
+
order: 0,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// Second pass: identify containers/groups
|
|
248
|
+
for (const cell of cells) {
|
|
249
|
+
const id = cell["@_id"] || "";
|
|
250
|
+
const parent = cell["@_parent"] || "";
|
|
251
|
+
if (id === "0" || parent === "0")
|
|
252
|
+
continue;
|
|
253
|
+
const isVertex = cell["@_vertex"] === "1";
|
|
254
|
+
const styleStr = cell["@_style"] || "";
|
|
255
|
+
const styleMap = parseStyleString(styleStr);
|
|
256
|
+
const isContainer = styleMap["container"] === "1" || cell["@_connectable"] === "0";
|
|
257
|
+
if (isVertex && isContainer) {
|
|
258
|
+
const bounds = parseBounds(cell);
|
|
259
|
+
const groupStyle = buildStyleSet(styleMap);
|
|
260
|
+
const collapsed = styleMap["collapsed"] === "1";
|
|
261
|
+
groups.set(id, {
|
|
262
|
+
id,
|
|
263
|
+
name: cell["@_value"] || "",
|
|
264
|
+
memberIds: new Set(),
|
|
265
|
+
isContainer: true,
|
|
266
|
+
collapsed,
|
|
267
|
+
bounds,
|
|
268
|
+
style: groupStyle,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Third pass: shapes and edges
|
|
273
|
+
const now = Date.now();
|
|
274
|
+
let seq = 1;
|
|
275
|
+
for (const cell of cells) {
|
|
276
|
+
const id = cell["@_id"] || "";
|
|
277
|
+
const parent = cell["@_parent"] || "";
|
|
278
|
+
if (id === "0" || parent === "0")
|
|
279
|
+
continue;
|
|
280
|
+
const isVertex = cell["@_vertex"] === "1";
|
|
281
|
+
const isEdge = cell["@_edge"] === "1";
|
|
282
|
+
const styleStr = cell["@_style"] || "";
|
|
283
|
+
const styleMap = parseStyleString(styleStr);
|
|
284
|
+
// Skip containers — already processed
|
|
285
|
+
if (isVertex && (styleMap["container"] === "1" || cell["@_connectable"] === "0"))
|
|
286
|
+
continue;
|
|
287
|
+
if (isVertex) {
|
|
288
|
+
const bounds = parseBounds(cell);
|
|
289
|
+
const shapeStyle = buildStyleSet(styleMap);
|
|
290
|
+
const shapeType = inferShapeType(styleMap);
|
|
291
|
+
// Determine if parent is a group or a layer
|
|
292
|
+
const parentGroup = groups.has(parent) ? parent : null;
|
|
293
|
+
const layer = parentGroup
|
|
294
|
+
? findLayerForGroup(parent, groups, cells, defaultLayer)
|
|
295
|
+
: parent;
|
|
296
|
+
// Track group membership
|
|
297
|
+
if (parentGroup && groups.has(parentGroup)) {
|
|
298
|
+
groups.get(parentGroup).memberIds.add(id);
|
|
299
|
+
}
|
|
300
|
+
// Convert container-relative coords back to absolute for the model
|
|
301
|
+
if (parentGroup) {
|
|
302
|
+
const group = groups.get(parentGroup);
|
|
303
|
+
if (group) {
|
|
304
|
+
bounds.x += group.bounds.x;
|
|
305
|
+
bounds.y += group.bounds.y;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Detect stencil style: if the raw style contains a known stencil prefix,
|
|
309
|
+
// preserve the full style string as baseStyleOverride for round-trip fidelity
|
|
310
|
+
let baseStyleOverride;
|
|
311
|
+
if (styleStr) {
|
|
312
|
+
const stencilPrefixes = getStencilPrefixes();
|
|
313
|
+
for (const [prefix] of stencilPrefixes) {
|
|
314
|
+
if (styleStr.includes(prefix)) {
|
|
315
|
+
baseStyleOverride = styleStr;
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
shapes.set(id, {
|
|
321
|
+
id,
|
|
322
|
+
label: cell["@_value"] || "",
|
|
323
|
+
type: shapeType,
|
|
324
|
+
bounds,
|
|
325
|
+
style: shapeStyle,
|
|
326
|
+
parentGroup,
|
|
327
|
+
layer: layer || defaultLayer,
|
|
328
|
+
metadata: {},
|
|
329
|
+
baseStyleOverride,
|
|
330
|
+
createdAt: seq,
|
|
331
|
+
modifiedAt: seq++,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
if (isEdge) {
|
|
335
|
+
const edgeStyle = buildEdgeStyleSet(styleMap);
|
|
336
|
+
const waypoints = parseWaypoints(cell);
|
|
337
|
+
const targetArrow = parseArrowType(styleMap["endArrow"], styleMap["endFill"]);
|
|
338
|
+
const sourceArrow = parseArrowType(styleMap["startArrow"], styleMap["startFill"]);
|
|
339
|
+
edges.set(id, {
|
|
340
|
+
id,
|
|
341
|
+
sourceId: cell["@_source"] || "",
|
|
342
|
+
targetId: cell["@_target"] || "",
|
|
343
|
+
label: cell["@_value"] || null,
|
|
344
|
+
style: edgeStyle,
|
|
345
|
+
waypoints,
|
|
346
|
+
sourceArrow,
|
|
347
|
+
targetArrow,
|
|
348
|
+
createdAt: seq,
|
|
349
|
+
modifiedAt: seq++,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return { shapes, edges, groups, layers, defaultLayer };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Walk upward from a group to find which layer it belongs to.
|
|
357
|
+
*/
|
|
358
|
+
function findLayerForGroup(groupId, groups, cells, defaultLayer) {
|
|
359
|
+
// Look up the cell for this group to find its parent
|
|
360
|
+
for (const cell of cells) {
|
|
361
|
+
if (cell["@_id"] === groupId) {
|
|
362
|
+
const parent = cell["@_parent"] || "";
|
|
363
|
+
// If parent is a layer (parent of "0"), return it
|
|
364
|
+
// Check if parent is another group
|
|
365
|
+
if (groups.has(parent)) {
|
|
366
|
+
return findLayerForGroup(parent, groups, cells, defaultLayer);
|
|
367
|
+
}
|
|
368
|
+
return parent || defaultLayer;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return defaultLayer;
|
|
372
|
+
}
|
|
373
|
+
// ── Main deserialization ────────────────────────────────────
|
|
374
|
+
/**
|
|
375
|
+
* Deserialize a draw.io XML string into a Diagram object.
|
|
376
|
+
* Handles both compressed (base64/deflate) and uncompressed content.
|
|
377
|
+
*/
|
|
378
|
+
export function deserializeDiagram(xml) {
|
|
379
|
+
const parsed = parser.parse(xml);
|
|
380
|
+
// Extract mxfile attributes
|
|
381
|
+
const mxfile = parsed.mxfile;
|
|
382
|
+
if (!mxfile) {
|
|
383
|
+
throw new Error("Invalid draw.io XML: missing <mxfile> element");
|
|
384
|
+
}
|
|
385
|
+
const metadata = {
|
|
386
|
+
host: mxfile["@_host"] || "fcp-drawio",
|
|
387
|
+
modified: mxfile["@_modified"] || new Date().toISOString(),
|
|
388
|
+
version: mxfile["@_version"] || "0.2.0",
|
|
389
|
+
};
|
|
390
|
+
// Extract fcp-meta (custom types/themes/stencil packs)
|
|
391
|
+
let customTypes = new Map();
|
|
392
|
+
let customThemes = new Map();
|
|
393
|
+
let loadedStencilPacks = new Set();
|
|
394
|
+
const fcpMetaRaw = mxfile["@_fcp-meta"];
|
|
395
|
+
if (fcpMetaRaw) {
|
|
396
|
+
try {
|
|
397
|
+
const fcpMeta = JSON.parse(fcpMetaRaw);
|
|
398
|
+
if (fcpMeta.customTypes) {
|
|
399
|
+
customTypes = new Map(Object.entries(fcpMeta.customTypes));
|
|
400
|
+
}
|
|
401
|
+
if (fcpMeta.customThemes) {
|
|
402
|
+
customThemes = new Map(Object.entries(fcpMeta.customThemes));
|
|
403
|
+
}
|
|
404
|
+
if (Array.isArray(fcpMeta.loadedStencilPacks)) {
|
|
405
|
+
loadedStencilPacks = new Set(fcpMeta.loadedStencilPacks);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Silently ignore malformed fcp-meta
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Extract diagram elements (one per page)
|
|
413
|
+
let diagramElements = mxfile.diagram;
|
|
414
|
+
if (!diagramElements) {
|
|
415
|
+
throw new Error("Invalid draw.io XML: no <diagram> elements found");
|
|
416
|
+
}
|
|
417
|
+
if (!Array.isArray(diagramElements)) {
|
|
418
|
+
diagramElements = [diagramElements];
|
|
419
|
+
}
|
|
420
|
+
const pages = [];
|
|
421
|
+
for (const diag of diagramElements) {
|
|
422
|
+
const pageId = diag["@_id"] || crypto.randomUUID();
|
|
423
|
+
const pageName = diag["@_name"] || "Page-1";
|
|
424
|
+
// Get mxGraphModel — might be inline XML or compressed content
|
|
425
|
+
let graphModel = diag.mxGraphModel;
|
|
426
|
+
if (!graphModel) {
|
|
427
|
+
// Check for compressed/text content
|
|
428
|
+
const textContent = diag["#text"] || (typeof diag === "string" ? diag : "");
|
|
429
|
+
if (textContent && isCompressed(String(textContent))) {
|
|
430
|
+
const decompressed = decompressContent(String(textContent));
|
|
431
|
+
const innerParsed = parser.parse(decompressed);
|
|
432
|
+
graphModel = innerParsed.mxGraphModel;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (!graphModel) {
|
|
436
|
+
// Create empty page if no model found
|
|
437
|
+
pages.push({
|
|
438
|
+
id: pageId,
|
|
439
|
+
name: pageName,
|
|
440
|
+
shapes: new Map(),
|
|
441
|
+
edges: new Map(),
|
|
442
|
+
groups: new Map(),
|
|
443
|
+
layers: [{ id: "1", name: "Default", visible: true, locked: false, order: 0 }],
|
|
444
|
+
defaultLayer: "1",
|
|
445
|
+
});
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
// Extract cells from root
|
|
449
|
+
const root = graphModel.root;
|
|
450
|
+
if (!root) {
|
|
451
|
+
pages.push({
|
|
452
|
+
id: pageId,
|
|
453
|
+
name: pageName,
|
|
454
|
+
shapes: new Map(),
|
|
455
|
+
edges: new Map(),
|
|
456
|
+
groups: new Map(),
|
|
457
|
+
layers: [{ id: "1", name: "Default", visible: true, locked: false, order: 0 }],
|
|
458
|
+
defaultLayer: "1",
|
|
459
|
+
});
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
// Get mxCell elements
|
|
463
|
+
let rawCells = [];
|
|
464
|
+
if (root.mxCell) {
|
|
465
|
+
rawCells = Array.isArray(root.mxCell) ? root.mxCell : [root.mxCell];
|
|
466
|
+
}
|
|
467
|
+
const { shapes, edges, groups, layers, defaultLayer } = processCells(rawCells);
|
|
468
|
+
// Read flowDirection from diagram element if present
|
|
469
|
+
const rawFlowDir = diag["@_flowDirection"];
|
|
470
|
+
const validFlowDirs = new Set(["TB", "LR", "BT", "RL"]);
|
|
471
|
+
const flowDirection = rawFlowDir && validFlowDirs.has(rawFlowDir)
|
|
472
|
+
? rawFlowDir
|
|
473
|
+
: undefined;
|
|
474
|
+
// Validate: remove edges referencing non-existent shapes
|
|
475
|
+
for (const [edgeId, edge] of edges) {
|
|
476
|
+
if (!shapes.has(edge.sourceId) || !shapes.has(edge.targetId)) {
|
|
477
|
+
edges.delete(edgeId);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// Validate: remove group members that don't exist
|
|
481
|
+
for (const [, group] of groups) {
|
|
482
|
+
for (const memberId of group.memberIds) {
|
|
483
|
+
if (!shapes.has(memberId)) {
|
|
484
|
+
group.memberIds.delete(memberId);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
pages.push({
|
|
489
|
+
id: pageId,
|
|
490
|
+
name: pageName,
|
|
491
|
+
shapes,
|
|
492
|
+
edges,
|
|
493
|
+
groups,
|
|
494
|
+
layers,
|
|
495
|
+
defaultLayer,
|
|
496
|
+
flowDirection,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
return {
|
|
500
|
+
id: crypto.randomUUID(),
|
|
501
|
+
title: pages[0]?.name || "Untitled",
|
|
502
|
+
filePath: null,
|
|
503
|
+
pages,
|
|
504
|
+
activePage: pages[0]?.id || "",
|
|
505
|
+
customTypes,
|
|
506
|
+
customThemes,
|
|
507
|
+
loadedStencilPacks,
|
|
508
|
+
metadata,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=deserialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../src/serialization/deserialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Diagram, Shape, Edge } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build a draw.io style string for a shape.
|
|
4
|
+
* Pattern: baseStyleFromNodeType;fillColor=#xxx;strokeColor=#xxx;fontSize=12;...
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildShapeStyleString(shape: Shape): string;
|
|
7
|
+
/**
|
|
8
|
+
* Build a draw.io style string for an edge.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildEdgeStyleString(edge: Edge): string;
|
|
11
|
+
/**
|
|
12
|
+
* Serialize a Diagram to draw.io XML (mxfile format).
|
|
13
|
+
* Always writes uncompressed XML — no base64/deflate encoding.
|
|
14
|
+
*/
|
|
15
|
+
export declare function serializeDiagram(diagram: Diagram): string;
|