@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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/adapter.d.ts +38 -0
  4. package/dist/adapter.js +259 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/layout/elk-layout.d.ts +49 -0
  10. package/dist/layout/elk-layout.js +144 -0
  11. package/dist/layout/elk-layout.js.map +1 -0
  12. package/dist/lib/drawio-cli.d.ts +22 -0
  13. package/dist/lib/drawio-cli.js +88 -0
  14. package/dist/lib/drawio-cli.js.map +1 -0
  15. package/dist/lib/node-types.d.ts +22 -0
  16. package/dist/lib/node-types.js +174 -0
  17. package/dist/lib/node-types.js.map +1 -0
  18. package/dist/lib/stencils/aws.d.ts +2 -0
  19. package/dist/lib/stencils/aws.js +69 -0
  20. package/dist/lib/stencils/aws.js.map +1 -0
  21. package/dist/lib/stencils/azure.d.ts +2 -0
  22. package/dist/lib/stencils/azure.js +54 -0
  23. package/dist/lib/stencils/azure.js.map +1 -0
  24. package/dist/lib/stencils/cisco.d.ts +2 -0
  25. package/dist/lib/stencils/cisco.js +30 -0
  26. package/dist/lib/stencils/cisco.js.map +1 -0
  27. package/dist/lib/stencils/gcp.d.ts +2 -0
  28. package/dist/lib/stencils/gcp.js +38 -0
  29. package/dist/lib/stencils/gcp.js.map +1 -0
  30. package/dist/lib/stencils/ibm.d.ts +2 -0
  31. package/dist/lib/stencils/ibm.js +32 -0
  32. package/dist/lib/stencils/ibm.js.map +1 -0
  33. package/dist/lib/stencils/index.d.ts +10 -0
  34. package/dist/lib/stencils/index.js +33 -0
  35. package/dist/lib/stencils/index.js.map +1 -0
  36. package/dist/lib/stencils/k8s.d.ts +2 -0
  37. package/dist/lib/stencils/k8s.js +32 -0
  38. package/dist/lib/stencils/k8s.js.map +1 -0
  39. package/dist/lib/stencils/types.d.ts +14 -0
  40. package/dist/lib/stencils/types.js +2 -0
  41. package/dist/lib/stencils/types.js.map +1 -0
  42. package/dist/lib/themes.d.ts +8 -0
  43. package/dist/lib/themes.js +32 -0
  44. package/dist/lib/themes.js.map +1 -0
  45. package/dist/model/defaults.d.ts +3 -0
  46. package/dist/model/defaults.js +26 -0
  47. package/dist/model/defaults.js.map +1 -0
  48. package/dist/model/diagram-model.d.ts +110 -0
  49. package/dist/model/diagram-model.js +938 -0
  50. package/dist/model/diagram-model.js.map +1 -0
  51. package/dist/model/event-log.d.ts +30 -0
  52. package/dist/model/event-log.js +112 -0
  53. package/dist/model/event-log.js.map +1 -0
  54. package/dist/model/id.d.ts +9 -0
  55. package/dist/model/id.js +35 -0
  56. package/dist/model/id.js.map +1 -0
  57. package/dist/model/reference-registry.d.ts +33 -0
  58. package/dist/model/reference-registry.js +143 -0
  59. package/dist/model/reference-registry.js.map +1 -0
  60. package/dist/model/spatial.d.ts +20 -0
  61. package/dist/model/spatial.js +59 -0
  62. package/dist/model/spatial.js.map +1 -0
  63. package/dist/parser/parse-op.d.ts +18 -0
  64. package/dist/parser/parse-op.js +430 -0
  65. package/dist/parser/parse-op.js.map +1 -0
  66. package/dist/parser/resolve-ref.d.ts +27 -0
  67. package/dist/parser/resolve-ref.js +232 -0
  68. package/dist/parser/resolve-ref.js.map +1 -0
  69. package/dist/parser/tokenizer.d.ts +6 -0
  70. package/dist/parser/tokenizer.js +7 -0
  71. package/dist/parser/tokenizer.js.map +1 -0
  72. package/dist/serialization/connector-intelligence.d.ts +35 -0
  73. package/dist/serialization/connector-intelligence.js +336 -0
  74. package/dist/serialization/connector-intelligence.js.map +1 -0
  75. package/dist/serialization/deserialize.d.ts +6 -0
  76. package/dist/serialization/deserialize.js +511 -0
  77. package/dist/serialization/deserialize.js.map +1 -0
  78. package/dist/serialization/serialize.d.ts +15 -0
  79. package/dist/serialization/serialize.js +332 -0
  80. package/dist/serialization/serialize.js.map +1 -0
  81. package/dist/server/intent-layer.d.ts +48 -0
  82. package/dist/server/intent-layer.js +1322 -0
  83. package/dist/server/intent-layer.js.map +1 -0
  84. package/dist/server/mcp-server.d.ts +7 -0
  85. package/dist/server/mcp-server.js +26 -0
  86. package/dist/server/mcp-server.js.map +1 -0
  87. package/dist/server/model-map.d.ts +8 -0
  88. package/dist/server/model-map.js +240 -0
  89. package/dist/server/model-map.js.map +1 -0
  90. package/dist/server/query-handler.d.ts +19 -0
  91. package/dist/server/query-handler.js +148 -0
  92. package/dist/server/query-handler.js.map +1 -0
  93. package/dist/server/response-formatter.d.ts +56 -0
  94. package/dist/server/response-formatter.js +351 -0
  95. package/dist/server/response-formatter.js.map +1 -0
  96. package/dist/server/session-handler.d.ts +6 -0
  97. package/dist/server/session-handler.js +127 -0
  98. package/dist/server/session-handler.js.map +1 -0
  99. package/dist/types/index.d.ts +238 -0
  100. package/dist/types/index.js +3 -0
  101. package/dist/types/index.js.map +1 -0
  102. package/dist/verb-specs.d.ts +6 -0
  103. package/dist/verb-specs.js +144 -0
  104. package/dist/verb-specs.js.map +1 -0
  105. package/package.json +39 -0
@@ -0,0 +1,6 @@
1
+ import type { Diagram } from "../types/index.js";
2
+ /**
3
+ * Deserialize a draw.io XML string into a Diagram object.
4
+ * Handles both compressed (base64/deflate) and uncompressed content.
5
+ */
6
+ export declare function deserializeDiagram(xml: string): Diagram;
@@ -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;