@coral-viz/viz 0.2.3

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 (191) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +11 -0
  3. package/dist/compatibility/CompatibilityEdge.d.ts +106 -0
  4. package/dist/compatibility/CompatibilityEdge.d.ts.map +1 -0
  5. package/dist/compatibility/CompatibilityEdge.js +233 -0
  6. package/dist/compatibility/CompatibilityEdge.js.map +1 -0
  7. package/dist/compatibility/IncompatibilityTooltip.d.ts +44 -0
  8. package/dist/compatibility/IncompatibilityTooltip.d.ts.map +1 -0
  9. package/dist/compatibility/IncompatibilityTooltip.js +145 -0
  10. package/dist/compatibility/IncompatibilityTooltip.js.map +1 -0
  11. package/dist/compatibility/index.d.ts +10 -0
  12. package/dist/compatibility/index.d.ts.map +1 -0
  13. package/dist/compatibility/index.js +10 -0
  14. package/dist/compatibility/index.js.map +1 -0
  15. package/dist/compatibility/useEdgeCompatibility.d.ts +82 -0
  16. package/dist/compatibility/useEdgeCompatibility.d.ts.map +1 -0
  17. package/dist/compatibility/useEdgeCompatibility.js +170 -0
  18. package/dist/compatibility/useEdgeCompatibility.js.map +1 -0
  19. package/dist/compatibility/validateConnection.d.ts +56 -0
  20. package/dist/compatibility/validateConnection.d.ts.map +1 -0
  21. package/dist/compatibility/validateConnection.js +382 -0
  22. package/dist/compatibility/validateConnection.js.map +1 -0
  23. package/dist/components/EditContext.d.ts +45 -0
  24. package/dist/components/EditContext.d.ts.map +1 -0
  25. package/dist/components/EditContext.js +41 -0
  26. package/dist/components/EditContext.js.map +1 -0
  27. package/dist/components/ShapeRenderer.d.ts +35 -0
  28. package/dist/components/ShapeRenderer.d.ts.map +1 -0
  29. package/dist/components/ShapeRenderer.js +77 -0
  30. package/dist/components/ShapeRenderer.js.map +1 -0
  31. package/dist/components/SymbolNode.d.ts +53 -0
  32. package/dist/components/SymbolNode.d.ts.map +1 -0
  33. package/dist/components/SymbolNode.js +333 -0
  34. package/dist/components/SymbolNode.js.map +1 -0
  35. package/dist/components/index.d.ts +8 -0
  36. package/dist/components/index.d.ts.map +1 -0
  37. package/dist/components/index.js +10 -0
  38. package/dist/components/index.js.map +1 -0
  39. package/dist/components/nodes.d.ts +43 -0
  40. package/dist/components/nodes.d.ts.map +1 -0
  41. package/dist/components/nodes.js +111 -0
  42. package/dist/components/nodes.js.map +1 -0
  43. package/dist/editor/CoralEditor.d.ts +29 -0
  44. package/dist/editor/CoralEditor.d.ts.map +1 -0
  45. package/dist/editor/CoralEditor.js +112 -0
  46. package/dist/editor/CoralEditor.js.map +1 -0
  47. package/dist/editor/FileControls.d.ts +34 -0
  48. package/dist/editor/FileControls.d.ts.map +1 -0
  49. package/dist/editor/FileControls.js +139 -0
  50. package/dist/editor/FileControls.js.map +1 -0
  51. package/dist/editor/LayoutControls.d.ts +41 -0
  52. package/dist/editor/LayoutControls.d.ts.map +1 -0
  53. package/dist/editor/LayoutControls.js +124 -0
  54. package/dist/editor/LayoutControls.js.map +1 -0
  55. package/dist/editor/converter.d.ts +37 -0
  56. package/dist/editor/converter.d.ts.map +1 -0
  57. package/dist/editor/converter.js +256 -0
  58. package/dist/editor/converter.js.map +1 -0
  59. package/dist/editor/index.d.ts +8 -0
  60. package/dist/editor/index.d.ts.map +1 -0
  61. package/dist/editor/index.js +8 -0
  62. package/dist/editor/index.js.map +1 -0
  63. package/dist/file/deserialize.d.ts +15 -0
  64. package/dist/file/deserialize.d.ts.map +1 -0
  65. package/dist/file/deserialize.js +145 -0
  66. package/dist/file/deserialize.js.map +1 -0
  67. package/dist/file/index.d.ts +15 -0
  68. package/dist/file/index.d.ts.map +1 -0
  69. package/dist/file/index.js +20 -0
  70. package/dist/file/index.js.map +1 -0
  71. package/dist/file/migrate.d.ts +29 -0
  72. package/dist/file/migrate.d.ts.map +1 -0
  73. package/dist/file/migrate.js +103 -0
  74. package/dist/file/migrate.js.map +1 -0
  75. package/dist/file/schema.d.ts +385 -0
  76. package/dist/file/schema.d.ts.map +1 -0
  77. package/dist/file/schema.js +180 -0
  78. package/dist/file/schema.js.map +1 -0
  79. package/dist/file/serialize.d.ts +30 -0
  80. package/dist/file/serialize.d.ts.map +1 -0
  81. package/dist/file/serialize.js +218 -0
  82. package/dist/file/serialize.js.map +1 -0
  83. package/dist/file/validate.d.ts +21 -0
  84. package/dist/file/validate.d.ts.map +1 -0
  85. package/dist/file/validate.js +165 -0
  86. package/dist/file/validate.js.map +1 -0
  87. package/dist/index.d.ts +24 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +42 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/layout/elk.d.ts +77 -0
  92. package/dist/layout/elk.d.ts.map +1 -0
  93. package/dist/layout/elk.js +379 -0
  94. package/dist/layout/elk.js.map +1 -0
  95. package/dist/layout/index.d.ts +12 -0
  96. package/dist/layout/index.d.ts.map +1 -0
  97. package/dist/layout/index.js +12 -0
  98. package/dist/layout/index.js.map +1 -0
  99. package/dist/layout/nodeSizing.d.ts +65 -0
  100. package/dist/layout/nodeSizing.d.ts.map +1 -0
  101. package/dist/layout/nodeSizing.js +319 -0
  102. package/dist/layout/nodeSizing.js.map +1 -0
  103. package/dist/layout/positionStability.d.ts +73 -0
  104. package/dist/layout/positionStability.d.ts.map +1 -0
  105. package/dist/layout/positionStability.js +199 -0
  106. package/dist/layout/positionStability.js.map +1 -0
  107. package/dist/layout/useAxisConstrain.d.ts +20 -0
  108. package/dist/layout/useAxisConstrain.d.ts.map +1 -0
  109. package/dist/layout/useAxisConstrain.js +106 -0
  110. package/dist/layout/useAxisConstrain.js.map +1 -0
  111. package/dist/layout/useDiagramState.d.ts +92 -0
  112. package/dist/layout/useDiagramState.d.ts.map +1 -0
  113. package/dist/layout/useDiagramState.js +256 -0
  114. package/dist/layout/useDiagramState.js.map +1 -0
  115. package/dist/layout/useLayoutHistory.d.ts +53 -0
  116. package/dist/layout/useLayoutHistory.d.ts.map +1 -0
  117. package/dist/layout/useLayoutHistory.js +124 -0
  118. package/dist/layout/useLayoutHistory.js.map +1 -0
  119. package/dist/properties/NodePropertiesPanel.d.ts +47 -0
  120. package/dist/properties/NodePropertiesPanel.d.ts.map +1 -0
  121. package/dist/properties/NodePropertiesPanel.js +199 -0
  122. package/dist/properties/NodePropertiesPanel.js.map +1 -0
  123. package/dist/properties/index.d.ts +10 -0
  124. package/dist/properties/index.d.ts.map +1 -0
  125. package/dist/properties/index.js +10 -0
  126. package/dist/properties/index.js.map +1 -0
  127. package/dist/properties/propertyUtils.d.ts +60 -0
  128. package/dist/properties/propertyUtils.d.ts.map +1 -0
  129. package/dist/properties/propertyUtils.js +89 -0
  130. package/dist/properties/propertyUtils.js.map +1 -0
  131. package/dist/settings/FontSettingsForm.d.ts +28 -0
  132. package/dist/settings/FontSettingsForm.d.ts.map +1 -0
  133. package/dist/settings/FontSettingsForm.js +129 -0
  134. package/dist/settings/FontSettingsForm.js.map +1 -0
  135. package/dist/settings/LayoutSettingsForm.d.ts +37 -0
  136. package/dist/settings/LayoutSettingsForm.d.ts.map +1 -0
  137. package/dist/settings/LayoutSettingsForm.js +165 -0
  138. package/dist/settings/LayoutSettingsForm.js.map +1 -0
  139. package/dist/settings/SettingsPanel.d.ts +55 -0
  140. package/dist/settings/SettingsPanel.d.ts.map +1 -0
  141. package/dist/settings/SettingsPanel.js +84 -0
  142. package/dist/settings/SettingsPanel.js.map +1 -0
  143. package/dist/settings/index.d.ts +13 -0
  144. package/dist/settings/index.d.ts.map +1 -0
  145. package/dist/settings/index.js +13 -0
  146. package/dist/settings/index.js.map +1 -0
  147. package/dist/settings/useSettings.d.ts +51 -0
  148. package/dist/settings/useSettings.d.ts.map +1 -0
  149. package/dist/settings/useSettings.js +154 -0
  150. package/dist/settings/useSettings.js.map +1 -0
  151. package/dist/text-editor/SplitEditor.d.ts +72 -0
  152. package/dist/text-editor/SplitEditor.d.ts.map +1 -0
  153. package/dist/text-editor/SplitEditor.js +172 -0
  154. package/dist/text-editor/SplitEditor.js.map +1 -0
  155. package/dist/text-editor/TextEditor.d.ts +53 -0
  156. package/dist/text-editor/TextEditor.d.ts.map +1 -0
  157. package/dist/text-editor/TextEditor.js +181 -0
  158. package/dist/text-editor/TextEditor.js.map +1 -0
  159. package/dist/text-editor/hooks/useBidirectionalSync.d.ts +106 -0
  160. package/dist/text-editor/hooks/useBidirectionalSync.d.ts.map +1 -0
  161. package/dist/text-editor/hooks/useBidirectionalSync.js +151 -0
  162. package/dist/text-editor/hooks/useBidirectionalSync.js.map +1 -0
  163. package/dist/text-editor/index.d.ts +9 -0
  164. package/dist/text-editor/index.d.ts.map +1 -0
  165. package/dist/text-editor/index.js +11 -0
  166. package/dist/text-editor/index.js.map +1 -0
  167. package/dist/types.d.ts +242 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +5 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/waypoints/index.d.ts +8 -0
  172. package/dist/waypoints/index.d.ts.map +1 -0
  173. package/dist/waypoints/index.js +7 -0
  174. package/dist/waypoints/index.js.map +1 -0
  175. package/dist/waypoints/operations.d.ts +29 -0
  176. package/dist/waypoints/operations.d.ts.map +1 -0
  177. package/dist/waypoints/operations.js +85 -0
  178. package/dist/waypoints/operations.js.map +1 -0
  179. package/dist/waypoints/router.d.ts +23 -0
  180. package/dist/waypoints/router.d.ts.map +1 -0
  181. package/dist/waypoints/router.js +109 -0
  182. package/dist/waypoints/router.js.map +1 -0
  183. package/dist/waypoints/types.d.ts +15 -0
  184. package/dist/waypoints/types.d.ts.map +1 -0
  185. package/dist/waypoints/types.js +5 -0
  186. package/dist/waypoints/types.js.map +1 -0
  187. package/dist/waypoints/useWaypointManager.d.ts +38 -0
  188. package/dist/waypoints/useWaypointManager.d.ts.map +1 -0
  189. package/dist/waypoints/useWaypointManager.js +106 -0
  190. package/dist/waypoints/useWaypointManager.js.map +1 -0
  191. package/package.json +76 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * useEdgeCompatibility Hook (CORAL-REQ-010)
3
+ *
4
+ * React hook for managing edge compatibility state and providing
5
+ * validation functions for the visual editor.
6
+ */
7
+ import type { CoralNode, CoralEdge, EdgeCompatibility, EdgeCompatibilityStatus, ConnectionValidation, NodeConnectionInfo } from '../types.js';
8
+ /**
9
+ * Options for the useEdgeCompatibility hook (CoralNode/CoralEdge mode)
10
+ */
11
+ export interface UseEdgeCompatibilityOptionsNodes {
12
+ /** Current nodes in the diagram */
13
+ nodes: CoralNode[];
14
+ /** Current edges in the diagram */
15
+ edges: CoralEdge[];
16
+ /** Notation ID for validation rules */
17
+ notationId: string;
18
+ }
19
+ /**
20
+ * Options for the useEdgeCompatibility hook (context mode)
21
+ * Use this when you have pre-built node info and edge arrays
22
+ */
23
+ export interface UseEdgeCompatibilityOptionsContext {
24
+ /** Notation ID for validation rules */
25
+ notationId: string;
26
+ /** Pre-built node connection info map */
27
+ nodeInfo: Map<string, NodeConnectionInfo>;
28
+ /** Pre-built existing edges array (with IDs for lookup) */
29
+ existingEdges: Array<{
30
+ id: string;
31
+ source: string;
32
+ target: string;
33
+ sourcePort?: string;
34
+ targetPort?: string;
35
+ }>;
36
+ }
37
+ /**
38
+ * Options for the useEdgeCompatibility hook
39
+ */
40
+ export type UseEdgeCompatibilityOptions = UseEdgeCompatibilityOptionsNodes | UseEdgeCompatibilityOptionsContext;
41
+ /**
42
+ * Result from the useEdgeCompatibility hook
43
+ */
44
+ export interface UseEdgeCompatibilityResult {
45
+ /** Compatibility info for all edges */
46
+ edgeCompatibility: EdgeCompatibility[];
47
+ /** Check if a proposed connection is valid */
48
+ checkConnection: (sourceId: string, targetId: string, sourcePort?: string, targetPort?: string) => ConnectionValidation;
49
+ /** Get list of incompatible edge IDs */
50
+ getIncompatibleEdgeIds: () => string[];
51
+ /** Get list of edges with warnings */
52
+ getWarningEdgeIds: () => string[];
53
+ /** Get status for a specific edge */
54
+ getEdgeStatus: (edgeId: string) => EdgeCompatibilityStatus | undefined;
55
+ /** Get validation result for a specific edge */
56
+ getEdgeValidation: (edgeId: string) => ConnectionValidation | undefined;
57
+ }
58
+ /**
59
+ * Hook for managing edge compatibility in the visual editor
60
+ *
61
+ * @example
62
+ * ```tsx
63
+ * const { edgeCompatibility, checkConnection, getIncompatibleEdgeIds } = useEdgeCompatibility({
64
+ * nodes,
65
+ * edges,
66
+ * notationId: 'flowchart',
67
+ * });
68
+ *
69
+ * // Style incompatible edges
70
+ * const styledEdges = edges.map(edge => ({
71
+ * ...edge,
72
+ * style: getIncompatibleEdgeIds().includes(edge.id)
73
+ * ? { stroke: '#f59e0b' } // warning color
74
+ * : undefined,
75
+ * }));
76
+ *
77
+ * // Validate during drag
78
+ * const isValid = checkConnection(sourceId, targetId);
79
+ * ```
80
+ */
81
+ export declare function useEdgeCompatibility(options: UseEdgeCompatibilityOptions): UseEdgeCompatibilityResult;
82
+ //# sourceMappingURL=useEdgeCompatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEdgeCompatibility.d.ts","sourceRoot":"","sources":["../../src/compatibility/useEdgeCompatibility.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,mCAAmC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,mCAAmC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,kCAAkC;IACjD,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1C,2DAA2D;IAC3D,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChH;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,gCAAgC,GAAG,kCAAkC,CAAC;AAShH;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC,8CAA8C;IAC9C,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,oBAAoB,CAAC;IACxH,wCAAwC;IACxC,sBAAsB,EAAE,MAAM,MAAM,EAAE,CAAC;IACvC,sCAAsC;IACtC,iBAAiB,EAAE,MAAM,MAAM,EAAE,CAAC;IAClC,qCAAqC;IACrC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,uBAAuB,GAAG,SAAS,CAAC;IACvE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,oBAAoB,GAAG,SAAS,CAAC;CACzE;AAyCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,0BAA0B,CAgI5B"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * useEdgeCompatibility Hook (CORAL-REQ-010)
3
+ *
4
+ * React hook for managing edge compatibility state and providing
5
+ * validation functions for the visual editor.
6
+ */
7
+ import { useMemo, useCallback } from 'react';
8
+ import { getEdgeCompatibility, validateConnection } from './validateConnection.js';
9
+ /**
10
+ * Check if options are in context mode
11
+ */
12
+ function isContextMode(options) {
13
+ return 'nodeInfo' in options && 'existingEdges' in options;
14
+ }
15
+ /**
16
+ * Extract symbol ID and variant from CoralNode
17
+ */
18
+ function extractNodeInfo(node) {
19
+ const data = node.data;
20
+ return {
21
+ id: node.id,
22
+ symbolId: data.symbolId || data.nodeType || 'unknown',
23
+ variant: data.properties?.variant,
24
+ };
25
+ }
26
+ /**
27
+ * Build validation context from nodes and edges
28
+ */
29
+ function buildContext(nodes, edges, notationId) {
30
+ const nodeInfo = new Map();
31
+ nodes.forEach((node) => {
32
+ nodeInfo.set(node.id, extractNodeInfo(node));
33
+ });
34
+ const existingEdges = edges.map((edge) => ({
35
+ source: edge.source,
36
+ target: edge.target,
37
+ sourcePort: edge.sourceHandle || undefined,
38
+ targetPort: edge.targetHandle || undefined,
39
+ }));
40
+ return {
41
+ notationId,
42
+ nodeInfo,
43
+ existingEdges,
44
+ };
45
+ }
46
+ /**
47
+ * Hook for managing edge compatibility in the visual editor
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * const { edgeCompatibility, checkConnection, getIncompatibleEdgeIds } = useEdgeCompatibility({
52
+ * nodes,
53
+ * edges,
54
+ * notationId: 'flowchart',
55
+ * });
56
+ *
57
+ * // Style incompatible edges
58
+ * const styledEdges = edges.map(edge => ({
59
+ * ...edge,
60
+ * style: getIncompatibleEdgeIds().includes(edge.id)
61
+ * ? { stroke: '#f59e0b' } // warning color
62
+ * : undefined,
63
+ * }));
64
+ *
65
+ * // Validate during drag
66
+ * const isValid = checkConnection(sourceId, targetId);
67
+ * ```
68
+ */
69
+ export function useEdgeCompatibility(options) {
70
+ // Build context for validation - supports both modes
71
+ const context = useMemo(() => {
72
+ if (isContextMode(options)) {
73
+ // Context mode: use pre-built nodeInfo and existingEdges
74
+ // Strip IDs from existingEdges since the validation context doesn't use them
75
+ return {
76
+ notationId: options.notationId,
77
+ nodeInfo: options.nodeInfo,
78
+ existingEdges: options.existingEdges.map((e) => ({
79
+ source: e.source,
80
+ target: e.target,
81
+ sourcePort: e.sourcePort,
82
+ targetPort: e.targetPort,
83
+ })),
84
+ };
85
+ }
86
+ else {
87
+ // Nodes mode: build context from CoralNode/CoralEdge arrays
88
+ return buildContext(options.nodes, options.edges, options.notationId);
89
+ }
90
+ }, [options]);
91
+ // Get edges for validation - differs based on mode
92
+ const edgesForValidation = useMemo(() => {
93
+ if (isContextMode(options)) {
94
+ // In context mode, use the provided edges with IDs
95
+ return options.existingEdges.map((e) => ({
96
+ id: e.id,
97
+ source: e.source,
98
+ target: e.target,
99
+ sourcePort: e.sourcePort,
100
+ targetPort: e.targetPort,
101
+ }));
102
+ }
103
+ else {
104
+ return options.edges.map((edge) => ({
105
+ id: edge.id,
106
+ source: edge.source,
107
+ target: edge.target,
108
+ sourcePort: edge.sourceHandle || undefined,
109
+ targetPort: edge.targetHandle || undefined,
110
+ }));
111
+ }
112
+ }, [options]);
113
+ // Compute compatibility for all edges
114
+ const edgeCompatibility = useMemo(() => {
115
+ return getEdgeCompatibility(edgesForValidation, context);
116
+ }, [edgesForValidation, context]);
117
+ // Build a map for quick lookup
118
+ const compatibilityMap = useMemo(() => {
119
+ const map = new Map();
120
+ edgeCompatibility.forEach((ec) => map.set(ec.edgeId, ec));
121
+ return map;
122
+ }, [edgeCompatibility]);
123
+ // Check a proposed connection (for drag validation).
124
+ const checkConnection = useCallback((sourceId, targetId, sourcePort, targetPort) => {
125
+ const exists = context.existingEdges.some((e) => e.source === sourceId && e.target === targetId);
126
+ if (exists) {
127
+ return {
128
+ valid: false,
129
+ hasWarning: false,
130
+ reason: 'constraint-violation',
131
+ message: 'This connection already exists',
132
+ };
133
+ }
134
+ return validateConnection({
135
+ sourceNodeId: sourceId,
136
+ targetNodeId: targetId,
137
+ sourcePortId: sourcePort,
138
+ targetPortId: targetPort,
139
+ }, context);
140
+ }, [context]);
141
+ // Get list of incompatible edge IDs
142
+ const getIncompatibleEdgeIds = useCallback(() => {
143
+ return edgeCompatibility
144
+ .filter((ec) => ec.status === 'incompatible')
145
+ .map((ec) => ec.edgeId);
146
+ }, [edgeCompatibility]);
147
+ // Get list of edges with warnings
148
+ const getWarningEdgeIds = useCallback(() => {
149
+ return edgeCompatibility
150
+ .filter((ec) => ec.status === 'warning')
151
+ .map((ec) => ec.edgeId);
152
+ }, [edgeCompatibility]);
153
+ // Get status for a specific edge
154
+ const getEdgeStatus = useCallback((edgeId) => {
155
+ return compatibilityMap.get(edgeId)?.status;
156
+ }, [compatibilityMap]);
157
+ // Get validation result for a specific edge
158
+ const getEdgeValidation = useCallback((edgeId) => {
159
+ return compatibilityMap.get(edgeId)?.validation;
160
+ }, [compatibilityMap]);
161
+ return {
162
+ edgeCompatibility,
163
+ checkConnection,
164
+ getIncompatibleEdgeIds,
165
+ getWarningEdgeIds,
166
+ getEdgeStatus,
167
+ getEdgeValidation,
168
+ };
169
+ }
170
+ //# sourceMappingURL=useEdgeCompatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEdgeCompatibility.js","sourceRoot":"","sources":["../../src/compatibility/useEdgeCompatibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Connection Validation Utilities (CORAL-REQ-010)
3
+ *
4
+ * Validates connections against notation rules and provides
5
+ * compatibility information for visual feedback.
6
+ */
7
+ import type { ConnectionInfo, ConnectionValidation, ConnectionValidationContext, EdgeCompatibility } from '../types.js';
8
+ /**
9
+ * Check if port directions are compatible
10
+ *
11
+ * @param sourceDirection - Direction of source port (in/out/inout)
12
+ * @param targetDirection - Direction of target port (in/out/inout)
13
+ */
14
+ export declare function checkPortDirection(sourceDirection: 'in' | 'out' | 'inout', targetDirection: 'in' | 'out' | 'inout'): ConnectionValidation;
15
+ /**
16
+ * Check if adding a connection would exceed max connections
17
+ *
18
+ * @param nodeId - Node ID to check
19
+ * @param portId - Port ID (optional)
20
+ * @param maxConnections - Maximum allowed connections (undefined = unlimited)
21
+ * @param existingEdges - Current edges in the diagram
22
+ * @param checkAs - Check as 'source' (outgoing) or 'target' (incoming)
23
+ */
24
+ export declare function checkMaxConnections(nodeId: string, portId: string | undefined, maxConnections: number | undefined, existingEdges: Array<{
25
+ source: string;
26
+ target: string;
27
+ sourcePort?: string;
28
+ targetPort?: string;
29
+ }>, checkAs: 'source' | 'target'): ConnectionValidation;
30
+ /**
31
+ * Validate a connection against notation rules
32
+ *
33
+ * @param connection - The connection to validate
34
+ * @param context - Validation context with notation and node info
35
+ * @returns Validation result with compatibility status and message
36
+ */
37
+ export declare function validateConnection(connection: ConnectionInfo, context: ConnectionValidationContext): ConnectionValidation;
38
+ /**
39
+ * Get compatibility status for multiple edges
40
+ *
41
+ * When validating existing edges, we exclude the edge being validated from
42
+ * the existingEdges count. This prevents false positives where an edge at
43
+ * the maxConnections limit would fail validation because it counts itself.
44
+ *
45
+ * @param edges - Edges to check
46
+ * @param context - Validation context
47
+ * @returns Array of edge compatibility info
48
+ */
49
+ export declare function getEdgeCompatibility(edges: Array<{
50
+ id: string;
51
+ source: string;
52
+ target: string;
53
+ sourcePort?: string;
54
+ targetPort?: string;
55
+ }>, context: ConnectionValidationContext): EdgeCompatibility[];
56
+ //# sourceMappingURL=validateConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateConnection.d.ts","sourceRoot":"","sources":["../../src/compatibility/validateConnection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AASrB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,EACvC,eAAe,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,GACtC,oBAAoB,CAsBtB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,aAAa,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAClG,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAC3B,oBAAoB,CAgCtB;AA0PD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CA2EtB;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACtG,OAAO,EAAE,2BAA2B,GACnC,iBAAiB,EAAE,CAsCrB"}