@swiftlysingh/excalidraw-cli 1.0.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/cli.d.ts +8 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +152 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/factory/connection-factory.d.ts +16 -0
  8. package/dist/factory/connection-factory.d.ts.map +1 -0
  9. package/dist/factory/connection-factory.js +91 -0
  10. package/dist/factory/connection-factory.js.map +1 -0
  11. package/dist/factory/element-factory.d.ts +16 -0
  12. package/dist/factory/element-factory.d.ts.map +1 -0
  13. package/dist/factory/element-factory.js +78 -0
  14. package/dist/factory/element-factory.js.map +1 -0
  15. package/dist/factory/index.d.ts +8 -0
  16. package/dist/factory/index.d.ts.map +1 -0
  17. package/dist/factory/index.js +8 -0
  18. package/dist/factory/index.js.map +1 -0
  19. package/dist/factory/node-factory.d.ts +24 -0
  20. package/dist/factory/node-factory.d.ts.map +1 -0
  21. package/dist/factory/node-factory.js +85 -0
  22. package/dist/factory/node-factory.js.map +1 -0
  23. package/dist/factory/text-factory.d.ts +42 -0
  24. package/dist/factory/text-factory.d.ts.map +1 -0
  25. package/dist/factory/text-factory.js +148 -0
  26. package/dist/factory/text-factory.js.map +1 -0
  27. package/dist/generator/excalidraw-generator.d.ts +17 -0
  28. package/dist/generator/excalidraw-generator.d.ts.map +1 -0
  29. package/dist/generator/excalidraw-generator.js +91 -0
  30. package/dist/generator/excalidraw-generator.js.map +1 -0
  31. package/dist/generator/index.d.ts +5 -0
  32. package/dist/generator/index.d.ts.map +1 -0
  33. package/dist/generator/index.js +5 -0
  34. package/dist/generator/index.js.map +1 -0
  35. package/dist/index.d.ts +23 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +36 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layout/arrow-router.d.ts +48 -0
  40. package/dist/layout/arrow-router.d.ts.map +1 -0
  41. package/dist/layout/arrow-router.js +103 -0
  42. package/dist/layout/arrow-router.js.map +1 -0
  43. package/dist/layout/elk-layout.d.ts +11 -0
  44. package/dist/layout/elk-layout.d.ts.map +1 -0
  45. package/dist/layout/elk-layout.js +179 -0
  46. package/dist/layout/elk-layout.js.map +1 -0
  47. package/dist/layout/index.d.ts +6 -0
  48. package/dist/layout/index.d.ts.map +1 -0
  49. package/dist/layout/index.js +6 -0
  50. package/dist/layout/index.js.map +1 -0
  51. package/dist/parser/dsl-parser.d.ts +21 -0
  52. package/dist/parser/dsl-parser.d.ts.map +1 -0
  53. package/dist/parser/dsl-parser.js +249 -0
  54. package/dist/parser/dsl-parser.js.map +1 -0
  55. package/dist/parser/index.d.ts +6 -0
  56. package/dist/parser/index.d.ts.map +1 -0
  57. package/dist/parser/index.js +6 -0
  58. package/dist/parser/index.js.map +1 -0
  59. package/dist/parser/json-parser.d.ts +16 -0
  60. package/dist/parser/json-parser.d.ts.map +1 -0
  61. package/dist/parser/json-parser.js +76 -0
  62. package/dist/parser/json-parser.js.map +1 -0
  63. package/dist/types/dsl.d.ts +127 -0
  64. package/dist/types/dsl.d.ts.map +1 -0
  65. package/dist/types/dsl.js +14 -0
  66. package/dist/types/dsl.js.map +1 -0
  67. package/dist/types/excalidraw.d.ts +171 -0
  68. package/dist/types/excalidraw.d.ts.map +1 -0
  69. package/dist/types/excalidraw.js +36 -0
  70. package/dist/types/excalidraw.js.map +1 -0
  71. package/dist/types/index.d.ts +6 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +6 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/package.json +53 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Arrow Router
3
+ *
4
+ * Calculates binding points for arrows connecting to shapes.
5
+ */
6
+ /**
7
+ * Calculate the binding point for an arrow endpoint on a node.
8
+ * Returns normalized coordinates [0-1] relative to the node.
9
+ */
10
+ export function calculateBindingPoint(node, arrowPoint) {
11
+ // Calculate relative position
12
+ const relX = (arrowPoint.x - node.x) / node.width;
13
+ const relY = (arrowPoint.y - node.y) / node.height;
14
+ // Clamp to valid range [0, 1]
15
+ const fixedX = Math.max(0, Math.min(1, relX));
16
+ const fixedY = Math.max(0, Math.min(1, relY));
17
+ return {
18
+ elementId: node.id,
19
+ mode: 'orbit',
20
+ fixedPoint: [fixedX, fixedY],
21
+ };
22
+ }
23
+ /**
24
+ * Find the best connection point on a node's edge for an arrow
25
+ * coming from a given direction.
26
+ */
27
+ export function findEdgeConnectionPoint(node, fromPoint) {
28
+ const centerX = node.x + node.width / 2;
29
+ const centerY = node.y + node.height / 2;
30
+ // Calculate angle from center to fromPoint
31
+ const dx = fromPoint.x - centerX;
32
+ const dy = fromPoint.y - centerY;
33
+ const angle = Math.atan2(dy, dx);
34
+ // Determine which edge to connect to based on angle
35
+ // Top: -3π/4 to -π/4
36
+ // Right: -π/4 to π/4
37
+ // Bottom: π/4 to 3π/4
38
+ // Left: 3π/4 to -3π/4 (wrapping)
39
+ let x;
40
+ let y;
41
+ let relX;
42
+ let relY;
43
+ if (angle >= -Math.PI / 4 && angle < Math.PI / 4) {
44
+ // Connect to right edge
45
+ x = node.x + node.width;
46
+ y = centerY;
47
+ relX = 1;
48
+ relY = 0.5;
49
+ }
50
+ else if (angle >= Math.PI / 4 && angle < (3 * Math.PI) / 4) {
51
+ // Connect to bottom edge
52
+ x = centerX;
53
+ y = node.y + node.height;
54
+ relX = 0.5;
55
+ relY = 1;
56
+ }
57
+ else if (angle >= (-3 * Math.PI) / 4 && angle < -Math.PI / 4) {
58
+ // Connect to top edge
59
+ x = centerX;
60
+ y = node.y;
61
+ relX = 0.5;
62
+ relY = 0;
63
+ }
64
+ else {
65
+ // Connect to left edge
66
+ x = node.x;
67
+ y = centerY;
68
+ relX = 0;
69
+ relY = 0.5;
70
+ }
71
+ return {
72
+ x,
73
+ y,
74
+ binding: {
75
+ elementId: node.id,
76
+ mode: 'orbit',
77
+ fixedPoint: [relX, relY],
78
+ },
79
+ };
80
+ }
81
+ /**
82
+ * Calculate arrow binding for a source node (where arrow starts)
83
+ */
84
+ export function calculateStartBinding(sourceNode, targetNode) {
85
+ const targetCenter = {
86
+ x: targetNode.x + targetNode.width / 2,
87
+ y: targetNode.y + targetNode.height / 2,
88
+ };
89
+ const result = findEdgeConnectionPoint(sourceNode, targetCenter);
90
+ return { point: { x: result.x, y: result.y }, binding: result.binding };
91
+ }
92
+ /**
93
+ * Calculate arrow binding for a target node (where arrow ends)
94
+ */
95
+ export function calculateEndBinding(sourceNode, targetNode) {
96
+ const sourceCenter = {
97
+ x: sourceNode.x + sourceNode.width / 2,
98
+ y: sourceNode.y + sourceNode.height / 2,
99
+ };
100
+ const result = findEdgeConnectionPoint(targetNode, sourceCenter);
101
+ return { point: { x: result.x, y: result.y }, binding: result.binding };
102
+ }
103
+ //# sourceMappingURL=arrow-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-router.js","sourceRoot":"","sources":["../../src/layout/arrow-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ELK.js Layout Engine
3
+ *
4
+ * Uses ELK (Eclipse Layout Kernel) for automatic graph layout.
5
+ */
6
+ import type { FlowchartGraph, LayoutedGraph } from '../types/dsl.js';
7
+ /**
8
+ * Layout a flowchart graph using ELK
9
+ */
10
+ export declare function layoutGraph(graph: FlowchartGraph): Promise<LayoutedGraph>;
11
+ //# sourceMappingURL=elk-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk-layout.d.ts","sourceRoot":"","sources":["../../src/layout/elk-layout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAKd,MAAM,iBAAiB,CAAC;AAkFzB;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyI/E"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * ELK.js Layout Engine
3
+ *
4
+ * Uses ELK (Eclipse Layout Kernel) for automatic graph layout.
5
+ */
6
+ import _ELK from 'elkjs/lib/elk.bundled.js';
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const ELK = _ELK;
9
+ /**
10
+ * Calculate node dimensions based on label and type
11
+ */
12
+ function calculateNodeDimensions(node) {
13
+ const lines = node.label.split('\n');
14
+ const maxLineLength = Math.max(...lines.map((l) => l.length));
15
+ const lineCount = lines.length;
16
+ // Base character width (approximate)
17
+ const charWidth = 10;
18
+ const lineHeight = 25;
19
+ const paddingX = 40;
20
+ const paddingY = 30;
21
+ let width = maxLineLength * charWidth + paddingX;
22
+ let height = lineCount * lineHeight + paddingY;
23
+ // Minimum dimensions based on node type
24
+ const minDimensions = {
25
+ rectangle: { width: 100, height: 60 },
26
+ diamond: { width: 120, height: 80 },
27
+ ellipse: { width: 100, height: 60 },
28
+ database: { width: 100, height: 70 },
29
+ };
30
+ const min = minDimensions[node.type] || minDimensions.rectangle;
31
+ width = Math.max(width, min.width);
32
+ height = Math.max(height, min.height);
33
+ // Diamonds need extra space for the rotated shape
34
+ if (node.type === 'diamond') {
35
+ width = Math.max(width * 1.4, 140);
36
+ height = Math.max(height * 1.4, 100);
37
+ }
38
+ return { width, height };
39
+ }
40
+ /**
41
+ * Convert flow direction to ELK direction
42
+ */
43
+ function getElkDirection(direction) {
44
+ const mapping = {
45
+ TB: 'DOWN',
46
+ BT: 'UP',
47
+ LR: 'RIGHT',
48
+ RL: 'LEFT',
49
+ };
50
+ return mapping[direction] || 'DOWN';
51
+ }
52
+ /**
53
+ * Layout a flowchart graph using ELK
54
+ */
55
+ export async function layoutGraph(graph) {
56
+ const elk = new ELK();
57
+ // Build ELK graph
58
+ const elkGraph = {
59
+ id: 'root',
60
+ layoutOptions: {
61
+ 'elk.algorithm': 'layered',
62
+ 'elk.direction': getElkDirection(graph.options.direction),
63
+ 'elk.spacing.nodeNode': String(graph.options.nodeSpacing),
64
+ 'elk.layered.spacing.baseValue': String(graph.options.rankSpacing),
65
+ 'elk.layered.spacing.edgeNodeBetweenLayers': String(graph.options.nodeSpacing),
66
+ 'elk.edgeRouting': 'ORTHOGONAL',
67
+ 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',
68
+ 'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',
69
+ },
70
+ children: graph.nodes.map((node) => {
71
+ const dims = calculateNodeDimensions(node);
72
+ return {
73
+ id: node.id,
74
+ width: dims.width,
75
+ height: dims.height,
76
+ labels: [{ text: node.label }],
77
+ };
78
+ }),
79
+ edges: graph.edges.map((edge) => ({
80
+ id: edge.id,
81
+ sources: [edge.source],
82
+ targets: [edge.target],
83
+ labels: edge.label ? [{ text: edge.label }] : undefined,
84
+ })),
85
+ };
86
+ // Run ELK layout
87
+ const layoutResult = await elk.layout(elkGraph);
88
+ // Build node map for lookups
89
+ const nodeMap = new Map();
90
+ for (const node of graph.nodes) {
91
+ nodeMap.set(node.id, node);
92
+ }
93
+ // Extract layouted nodes
94
+ const layoutedNodes = [];
95
+ const elkNodeMap = new Map();
96
+ for (const elkNode of layoutResult.children || []) {
97
+ elkNodeMap.set(elkNode.id, elkNode);
98
+ const originalNode = nodeMap.get(elkNode.id);
99
+ if (originalNode) {
100
+ layoutedNodes.push({
101
+ ...originalNode,
102
+ x: (elkNode.x || 0) + graph.options.padding,
103
+ y: (elkNode.y || 0) + graph.options.padding,
104
+ width: elkNode.width || 100,
105
+ height: elkNode.height || 60,
106
+ });
107
+ }
108
+ }
109
+ // Extract layouted edges
110
+ const layoutedEdges = [];
111
+ for (const elkEdge of layoutResult.edges || []) {
112
+ const originalEdge = graph.edges.find((e) => e.id === elkEdge.id);
113
+ if (!originalEdge)
114
+ continue;
115
+ const section = elkEdge.sections?.[0];
116
+ let points = [];
117
+ let sourcePoint = { x: 0, y: 0 };
118
+ let targetPoint = { x: 0, y: 0 };
119
+ if (section) {
120
+ sourcePoint = {
121
+ x: section.startPoint.x + graph.options.padding,
122
+ y: section.startPoint.y + graph.options.padding,
123
+ };
124
+ targetPoint = {
125
+ x: section.endPoint.x + graph.options.padding,
126
+ y: section.endPoint.y + graph.options.padding,
127
+ };
128
+ // Build points array (relative to start point for Excalidraw)
129
+ points = [[0, 0]];
130
+ if (section.bendPoints) {
131
+ for (const bend of section.bendPoints) {
132
+ points.push([
133
+ bend.x + graph.options.padding - sourcePoint.x,
134
+ bend.y + graph.options.padding - sourcePoint.y,
135
+ ]);
136
+ }
137
+ }
138
+ points.push([targetPoint.x - sourcePoint.x, targetPoint.y - sourcePoint.y]);
139
+ }
140
+ else {
141
+ // Fallback: calculate direct line between node centers
142
+ const sourceElk = elkNodeMap.get(originalEdge.source);
143
+ const targetElk = elkNodeMap.get(originalEdge.target);
144
+ if (sourceElk && targetElk) {
145
+ const sx = (sourceElk.x || 0) + (sourceElk.width || 0) / 2 + graph.options.padding;
146
+ const sy = (sourceElk.y || 0) + (sourceElk.height || 0) / 2 + graph.options.padding;
147
+ const tx = (targetElk.x || 0) + (targetElk.width || 0) / 2 + graph.options.padding;
148
+ const ty = (targetElk.y || 0) + (targetElk.height || 0) / 2 + graph.options.padding;
149
+ sourcePoint = { x: sx, y: sy };
150
+ targetPoint = { x: tx, y: ty };
151
+ points = [
152
+ [0, 0],
153
+ [tx - sx, ty - sy],
154
+ ];
155
+ }
156
+ }
157
+ layoutedEdges.push({
158
+ ...originalEdge,
159
+ points,
160
+ sourcePoint,
161
+ targetPoint,
162
+ });
163
+ }
164
+ // Calculate total dimensions
165
+ let maxX = 0;
166
+ let maxY = 0;
167
+ for (const node of layoutedNodes) {
168
+ maxX = Math.max(maxX, node.x + node.width);
169
+ maxY = Math.max(maxY, node.y + node.height);
170
+ }
171
+ return {
172
+ nodes: layoutedNodes,
173
+ edges: layoutedEdges,
174
+ options: graph.options,
175
+ width: maxX + graph.options.padding,
176
+ height: maxY + graph.options.padding,
177
+ };
178
+ }
179
+ //# sourceMappingURL=elk-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk-layout.js","sourceRoot":"","sources":["../../src/layout/elk-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Layout module exports
3
+ */
4
+ export { layoutGraph } from './elk-layout.js';
5
+ export { calculateBindingPoint, calculateStartBinding, calculateEndBinding, findEdgeConnectionPoint, } from './arrow-router.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Layout module exports
3
+ */
4
+ export { layoutGraph } from './elk-layout.js';
5
+ export { calculateBindingPoint, calculateStartBinding, calculateEndBinding, findEdgeConnectionPoint, } from './arrow-router.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * DSL Parser for Flowchart Syntax
3
+ *
4
+ * Syntax:
5
+ * [Label] - Rectangle (process step)
6
+ * {Label} - Diamond (decision)
7
+ * (Label) - Ellipse (start/end)
8
+ * [[Label]] - Database
9
+ * A -> B - Connection
10
+ * A -> "label" -> B - Labeled connection
11
+ * A --> B - Dashed connection
12
+ * @direction TB - Set flow direction (TB, BT, LR, RL)
13
+ * @spacing N - Set node spacing
14
+ */
15
+ import type { FlowchartGraph } from '../types/dsl.js';
16
+ /**
17
+ * Parse tokens into a FlowchartGraph
18
+ */
19
+ export declare function parseDSL(input: string): FlowchartGraph;
20
+ export { DEFAULT_LAYOUT_OPTIONS } from '../types/dsl.js';
21
+ //# sourceMappingURL=dsl-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl-parser.d.ts","sourceRoot":"","sources":["../../src/parser/dsl-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,iBAAiB,CAAC;AA0JzB;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAiGtD;AAGD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * DSL Parser for Flowchart Syntax
3
+ *
4
+ * Syntax:
5
+ * [Label] - Rectangle (process step)
6
+ * {Label} - Diamond (decision)
7
+ * (Label) - Ellipse (start/end)
8
+ * [[Label]] - Database
9
+ * A -> B - Connection
10
+ * A -> "label" -> B - Labeled connection
11
+ * A --> B - Dashed connection
12
+ * @direction TB - Set flow direction (TB, BT, LR, RL)
13
+ * @spacing N - Set node spacing
14
+ */
15
+ import { nanoid } from 'nanoid';
16
+ import { DEFAULT_LAYOUT_OPTIONS } from '../types/dsl.js';
17
+ /**
18
+ * Tokenize DSL input into tokens
19
+ */
20
+ function tokenize(input) {
21
+ const tokens = [];
22
+ let i = 0;
23
+ const len = input.length;
24
+ while (i < len) {
25
+ // Skip whitespace (except newlines)
26
+ if (input[i] === ' ' || input[i] === '\t') {
27
+ i++;
28
+ continue;
29
+ }
30
+ // Newline
31
+ if (input[i] === '\n') {
32
+ tokens.push({ type: 'newline', value: '\n' });
33
+ i++;
34
+ continue;
35
+ }
36
+ // Comment (skip rest of line)
37
+ if (input[i] === '#') {
38
+ while (i < len && input[i] !== '\n')
39
+ i++;
40
+ continue;
41
+ }
42
+ // Directive (@direction, @spacing)
43
+ if (input[i] === '@') {
44
+ let directive = '';
45
+ i++; // skip @
46
+ while (i < len && /[a-zA-Z0-9]/.test(input[i])) {
47
+ directive += input[i];
48
+ i++;
49
+ }
50
+ // Get directive value
51
+ while (i < len && (input[i] === ' ' || input[i] === '\t'))
52
+ i++;
53
+ let value = '';
54
+ while (i < len && input[i] !== '\n' && input[i] !== '#') {
55
+ value += input[i];
56
+ i++;
57
+ }
58
+ tokens.push({ type: 'directive', value: `${directive} ${value.trim()}` });
59
+ continue;
60
+ }
61
+ // Database [[Label]]
62
+ if (input[i] === '[' && input[i + 1] === '[') {
63
+ i += 2;
64
+ let label = '';
65
+ while (i < len && !(input[i] === ']' && input[i + 1] === ']')) {
66
+ label += input[i];
67
+ i++;
68
+ }
69
+ i += 2; // skip ]]
70
+ tokens.push({ type: 'node', value: label.trim(), nodeType: 'database' });
71
+ continue;
72
+ }
73
+ // Rectangle [Label]
74
+ if (input[i] === '[') {
75
+ i++;
76
+ let label = '';
77
+ let depth = 1;
78
+ while (i < len && depth > 0) {
79
+ if (input[i] === '[')
80
+ depth++;
81
+ else if (input[i] === ']')
82
+ depth--;
83
+ if (depth > 0)
84
+ label += input[i];
85
+ i++;
86
+ }
87
+ tokens.push({ type: 'node', value: label.trim(), nodeType: 'rectangle' });
88
+ continue;
89
+ }
90
+ // Diamond {Label}
91
+ if (input[i] === '{') {
92
+ i++;
93
+ let label = '';
94
+ let depth = 1;
95
+ while (i < len && depth > 0) {
96
+ if (input[i] === '{')
97
+ depth++;
98
+ else if (input[i] === '}')
99
+ depth--;
100
+ if (depth > 0)
101
+ label += input[i];
102
+ i++;
103
+ }
104
+ tokens.push({ type: 'node', value: label.trim(), nodeType: 'diamond' });
105
+ continue;
106
+ }
107
+ // Ellipse (Label)
108
+ if (input[i] === '(') {
109
+ i++;
110
+ let label = '';
111
+ let depth = 1;
112
+ while (i < len && depth > 0) {
113
+ if (input[i] === '(')
114
+ depth++;
115
+ else if (input[i] === ')')
116
+ depth--;
117
+ if (depth > 0)
118
+ label += input[i];
119
+ i++;
120
+ }
121
+ tokens.push({ type: 'node', value: label.trim(), nodeType: 'ellipse' });
122
+ continue;
123
+ }
124
+ // Dashed arrow -->
125
+ if (input[i] === '-' && input[i + 1] === '-' && input[i + 2] === '>') {
126
+ tokens.push({ type: 'arrow', value: '-->', dashed: true });
127
+ i += 3;
128
+ continue;
129
+ }
130
+ // Arrow ->
131
+ if (input[i] === '-' && input[i + 1] === '>') {
132
+ tokens.push({ type: 'arrow', value: '->' });
133
+ i += 2;
134
+ continue;
135
+ }
136
+ // Quoted label "text"
137
+ if (input[i] === '"') {
138
+ i++;
139
+ let label = '';
140
+ while (i < len && input[i] !== '"') {
141
+ if (input[i] === '\\' && i + 1 < len) {
142
+ i++;
143
+ label += input[i];
144
+ }
145
+ else {
146
+ label += input[i];
147
+ }
148
+ i++;
149
+ }
150
+ i++; // skip closing "
151
+ tokens.push({ type: 'label', value: label });
152
+ continue;
153
+ }
154
+ // Skip unknown characters
155
+ i++;
156
+ }
157
+ return tokens;
158
+ }
159
+ /**
160
+ * Parse tokens into a FlowchartGraph
161
+ */
162
+ export function parseDSL(input) {
163
+ const tokens = tokenize(input);
164
+ const nodes = new Map();
165
+ const edges = [];
166
+ const options = { ...DEFAULT_LAYOUT_OPTIONS };
167
+ // Helper to get or create node by label
168
+ function getOrCreateNode(label, type) {
169
+ // Use label as key for deduplication
170
+ const key = `${type}:${label}`;
171
+ if (!nodes.has(key)) {
172
+ nodes.set(key, {
173
+ id: nanoid(10),
174
+ type,
175
+ label,
176
+ });
177
+ }
178
+ return nodes.get(key);
179
+ }
180
+ let i = 0;
181
+ let lastNode = null;
182
+ let pendingLabel = null;
183
+ let pendingDashed = false;
184
+ while (i < tokens.length) {
185
+ const token = tokens[i];
186
+ if (token.type === 'newline') {
187
+ lastNode = null;
188
+ pendingLabel = null;
189
+ pendingDashed = false;
190
+ i++;
191
+ continue;
192
+ }
193
+ if (token.type === 'directive') {
194
+ const [directive, ...valueParts] = token.value.split(' ');
195
+ const value = valueParts.join(' ');
196
+ if (directive === 'direction') {
197
+ const dir = value.toUpperCase();
198
+ if (dir === 'TB' || dir === 'BT' || dir === 'LR' || dir === 'RL') {
199
+ options.direction = dir;
200
+ }
201
+ }
202
+ else if (directive === 'spacing') {
203
+ const spacing = parseInt(value, 10);
204
+ if (!isNaN(spacing)) {
205
+ options.nodeSpacing = spacing;
206
+ }
207
+ }
208
+ i++;
209
+ continue;
210
+ }
211
+ if (token.type === 'node') {
212
+ const node = getOrCreateNode(token.value, token.nodeType);
213
+ if (lastNode) {
214
+ // Create edge from lastNode to this node
215
+ edges.push({
216
+ id: nanoid(10),
217
+ source: lastNode.id,
218
+ target: node.id,
219
+ label: pendingLabel || undefined,
220
+ style: pendingDashed ? { strokeStyle: 'dashed' } : undefined,
221
+ });
222
+ pendingLabel = null;
223
+ pendingDashed = false;
224
+ }
225
+ lastNode = node;
226
+ i++;
227
+ continue;
228
+ }
229
+ if (token.type === 'arrow') {
230
+ pendingDashed = token.dashed || false;
231
+ i++;
232
+ continue;
233
+ }
234
+ if (token.type === 'label') {
235
+ pendingLabel = token.value;
236
+ i++;
237
+ continue;
238
+ }
239
+ i++;
240
+ }
241
+ return {
242
+ nodes: Array.from(nodes.values()),
243
+ edges,
244
+ options,
245
+ };
246
+ }
247
+ // Re-export DEFAULT_LAYOUT_OPTIONS
248
+ export { DEFAULT_LAYOUT_OPTIONS } from '../types/dsl.js';
249
+ //# sourceMappingURL=dsl-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl-parser.js","sourceRoot":"","sources":["../../src/parser/dsl-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parser module exports
3
+ */
4
+ export { parseDSL } from './dsl-parser.js';
5
+ export { parseJSON, parseJSONString } from './json-parser.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parser module exports
3
+ */
4
+ export { parseDSL } from './dsl-parser.js';
5
+ export { parseJSON, parseJSONString } from './json-parser.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}