@shumoku/core 0.1.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/dist/icons/build-icons.d.ts +6 -0
- package/dist/icons/build-icons.d.ts.map +1 -0
- package/dist/icons/build-icons.js +163 -0
- package/dist/icons/build-icons.js.map +1 -0
- package/dist/icons/generated-icons.d.ts +32 -0
- package/dist/icons/generated-icons.d.ts.map +1 -0
- package/dist/icons/generated-icons.js +88 -0
- package/dist/icons/generated-icons.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/hierarchical.d.ts +73 -0
- package/dist/layout/hierarchical.d.ts.map +1 -0
- package/dist/layout/hierarchical.js +1320 -0
- package/dist/layout/hierarchical.js.map +1 -0
- package/dist/layout/index.d.ts +6 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +5 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/types.d.ts +381 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +61 -0
- package/dist/models/types.js.map +1 -0
- package/dist/renderer/components/index.d.ts +8 -0
- package/dist/renderer/components/index.d.ts.map +1 -0
- package/dist/renderer/components/index.js +8 -0
- package/dist/renderer/components/index.js.map +1 -0
- package/dist/renderer/components/link-renderer.d.ts +11 -0
- package/dist/renderer/components/link-renderer.d.ts.map +1 -0
- package/dist/renderer/components/link-renderer.js +340 -0
- package/dist/renderer/components/link-renderer.js.map +1 -0
- package/dist/renderer/components/node-renderer.d.ts +14 -0
- package/dist/renderer/components/node-renderer.d.ts.map +1 -0
- package/dist/renderer/components/node-renderer.js +242 -0
- package/dist/renderer/components/node-renderer.js.map +1 -0
- package/dist/renderer/components/port-renderer.d.ts +8 -0
- package/dist/renderer/components/port-renderer.d.ts.map +1 -0
- package/dist/renderer/components/port-renderer.js +85 -0
- package/dist/renderer/components/port-renderer.js.map +1 -0
- package/dist/renderer/components/subgraph-renderer.d.ts +13 -0
- package/dist/renderer/components/subgraph-renderer.d.ts.map +1 -0
- package/dist/renderer/components/subgraph-renderer.js +85 -0
- package/dist/renderer/components/subgraph-renderer.js.map +1 -0
- package/dist/renderer/icon-registry/index.d.ts +6 -0
- package/dist/renderer/icon-registry/index.d.ts.map +1 -0
- package/dist/renderer/icon-registry/index.js +5 -0
- package/dist/renderer/icon-registry/index.js.map +1 -0
- package/dist/renderer/icon-registry/registry.d.ts +25 -0
- package/dist/renderer/icon-registry/registry.d.ts.map +1 -0
- package/dist/renderer/icon-registry/registry.js +85 -0
- package/dist/renderer/icon-registry/registry.js.map +1 -0
- package/dist/renderer/icon-registry/types.d.ts +44 -0
- package/dist/renderer/icon-registry/types.d.ts.map +1 -0
- package/dist/renderer/icon-registry/types.js +5 -0
- package/dist/renderer/icon-registry/types.js.map +1 -0
- package/dist/renderer/index.d.ts +6 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +5 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/render-model/builder.d.ts +43 -0
- package/dist/renderer/render-model/builder.d.ts.map +1 -0
- package/dist/renderer/render-model/builder.js +646 -0
- package/dist/renderer/render-model/builder.js.map +1 -0
- package/dist/renderer/render-model/index.d.ts +6 -0
- package/dist/renderer/render-model/index.d.ts.map +1 -0
- package/dist/renderer/render-model/index.js +5 -0
- package/dist/renderer/render-model/index.js.map +1 -0
- package/dist/renderer/render-model/types.d.ts +216 -0
- package/dist/renderer/render-model/types.d.ts.map +1 -0
- package/dist/renderer/render-model/types.js +6 -0
- package/dist/renderer/render-model/types.js.map +1 -0
- package/dist/renderer/renderer-types.d.ts +55 -0
- package/dist/renderer/renderer-types.d.ts.map +1 -0
- package/dist/renderer/renderer-types.js +5 -0
- package/dist/renderer/renderer-types.js.map +1 -0
- package/dist/renderer/svg-builder.d.ts +152 -0
- package/dist/renderer/svg-builder.d.ts.map +1 -0
- package/dist/renderer/svg-builder.js +176 -0
- package/dist/renderer/svg-builder.js.map +1 -0
- package/dist/renderer/svg-dom/builders/defs.d.ts +10 -0
- package/dist/renderer/svg-dom/builders/defs.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/defs.js +82 -0
- package/dist/renderer/svg-dom/builders/defs.js.map +1 -0
- package/dist/renderer/svg-dom/builders/index.d.ts +9 -0
- package/dist/renderer/svg-dom/builders/index.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/index.js +9 -0
- package/dist/renderer/svg-dom/builders/index.js.map +1 -0
- package/dist/renderer/svg-dom/builders/link.d.ts +18 -0
- package/dist/renderer/svg-dom/builders/link.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/link.js +188 -0
- package/dist/renderer/svg-dom/builders/link.js.map +1 -0
- package/dist/renderer/svg-dom/builders/node.d.ts +15 -0
- package/dist/renderer/svg-dom/builders/node.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/node.js +262 -0
- package/dist/renderer/svg-dom/builders/node.js.map +1 -0
- package/dist/renderer/svg-dom/builders/subgraph.d.ts +14 -0
- package/dist/renderer/svg-dom/builders/subgraph.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/subgraph.js +63 -0
- package/dist/renderer/svg-dom/builders/subgraph.js.map +1 -0
- package/dist/renderer/svg-dom/builders/utils.d.ts +40 -0
- package/dist/renderer/svg-dom/builders/utils.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/utils.js +79 -0
- package/dist/renderer/svg-dom/builders/utils.js.map +1 -0
- package/dist/renderer/svg-dom/index.d.ts +9 -0
- package/dist/renderer/svg-dom/index.d.ts.map +1 -0
- package/dist/renderer/svg-dom/index.js +7 -0
- package/dist/renderer/svg-dom/index.js.map +1 -0
- package/dist/renderer/svg-dom/interaction.d.ts +69 -0
- package/dist/renderer/svg-dom/interaction.d.ts.map +1 -0
- package/dist/renderer/svg-dom/interaction.js +296 -0
- package/dist/renderer/svg-dom/interaction.js.map +1 -0
- package/dist/renderer/svg-dom/renderer.d.ts +47 -0
- package/dist/renderer/svg-dom/renderer.d.ts.map +1 -0
- package/dist/renderer/svg-dom/renderer.js +188 -0
- package/dist/renderer/svg-dom/renderer.js.map +1 -0
- package/dist/renderer/svg-string/builders/defs.d.ts +10 -0
- package/dist/renderer/svg-string/builders/defs.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/defs.js +43 -0
- package/dist/renderer/svg-string/builders/defs.js.map +1 -0
- package/dist/renderer/svg-string/builders/link.d.ts +10 -0
- package/dist/renderer/svg-string/builders/link.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/link.js +149 -0
- package/dist/renderer/svg-string/builders/link.js.map +1 -0
- package/dist/renderer/svg-string/builders/node.d.ts +10 -0
- package/dist/renderer/svg-string/builders/node.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/node.js +134 -0
- package/dist/renderer/svg-string/builders/node.js.map +1 -0
- package/dist/renderer/svg-string/builders/subgraph.d.ts +10 -0
- package/dist/renderer/svg-string/builders/subgraph.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/subgraph.js +59 -0
- package/dist/renderer/svg-string/builders/subgraph.js.map +1 -0
- package/dist/renderer/svg-string/index.d.ts +5 -0
- package/dist/renderer/svg-string/index.d.ts.map +1 -0
- package/dist/renderer/svg-string/index.js +5 -0
- package/dist/renderer/svg-string/index.js.map +1 -0
- package/dist/renderer/svg-string/renderer.d.ts +17 -0
- package/dist/renderer/svg-string/renderer.d.ts.map +1 -0
- package/dist/renderer/svg-string/renderer.js +53 -0
- package/dist/renderer/svg-string/renderer.js.map +1 -0
- package/dist/renderer/svg.d.ts +105 -0
- package/dist/renderer/svg.d.ts.map +1 -0
- package/dist/renderer/svg.js +804 -0
- package/dist/renderer/svg.js.map +1 -0
- package/dist/renderer/text-measurer/browser-measurer.d.ts +25 -0
- package/dist/renderer/text-measurer/browser-measurer.d.ts.map +1 -0
- package/dist/renderer/text-measurer/browser-measurer.js +85 -0
- package/dist/renderer/text-measurer/browser-measurer.js.map +1 -0
- package/dist/renderer/text-measurer/fallback-measurer.d.ts +22 -0
- package/dist/renderer/text-measurer/fallback-measurer.d.ts.map +1 -0
- package/dist/renderer/text-measurer/fallback-measurer.js +113 -0
- package/dist/renderer/text-measurer/fallback-measurer.js.map +1 -0
- package/dist/renderer/text-measurer/index.d.ts +13 -0
- package/dist/renderer/text-measurer/index.d.ts.map +1 -0
- package/dist/renderer/text-measurer/index.js +35 -0
- package/dist/renderer/text-measurer/index.js.map +1 -0
- package/dist/renderer/text-measurer/types.d.ts +30 -0
- package/dist/renderer/text-measurer/types.d.ts.map +1 -0
- package/dist/renderer/text-measurer/types.js +5 -0
- package/dist/renderer/text-measurer/types.js.map +1 -0
- package/dist/renderer/theme.d.ts +29 -0
- package/dist/renderer/theme.d.ts.map +1 -0
- package/dist/renderer/theme.js +80 -0
- package/dist/renderer/theme.js.map +1 -0
- package/dist/themes/dark.d.ts +6 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +96 -0
- package/dist/themes/dark.js.map +1 -0
- package/dist/themes/index.d.ts +13 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +15 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/modern.d.ts +6 -0
- package/dist/themes/modern.d.ts.map +1 -0
- package/dist/themes/modern.js +164 -0
- package/dist/themes/modern.js.map +1 -0
- package/dist/themes/types.d.ts +234 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +5 -0
- package/dist/themes/types.js.map +1 -0
- package/dist/themes/utils.d.ts +21 -0
- package/dist/themes/utils.d.ts.map +1 -0
- package/dist/themes/utils.js +124 -0
- package/dist/themes/utils.js.map +1 -0
- package/package.json +92 -0
- package/src/icons/build-icons.ts +189 -0
- package/src/icons/default/access-point.svg +3 -0
- package/src/icons/default/cloud.svg +3 -0
- package/src/icons/default/database.svg +3 -0
- package/src/icons/default/firewall.svg +4 -0
- package/src/icons/default/generic.svg +3 -0
- package/src/icons/default/internet.svg +3 -0
- package/src/icons/default/l2-switch.svg +3 -0
- package/src/icons/default/l3-switch.svg +3 -0
- package/src/icons/default/load-balancer.svg +3 -0
- package/src/icons/default/router.svg +3 -0
- package/src/icons/default/server.svg +3 -0
- package/src/icons/default/vpn.svg +3 -0
- package/src/icons/generated-icons.ts +111 -0
- package/src/icons/index.ts +1 -0
- package/src/index.ts +21 -0
- package/src/layout/hierarchical.ts +1543 -0
- package/src/layout/index.ts +6 -0
- package/src/models/index.ts +5 -0
- package/src/models/types.ts +528 -0
- package/src/renderer/index.ts +6 -0
- package/src/renderer/svg.ts +997 -0
- package/src/themes/dark.ts +110 -0
- package/src/themes/index.ts +24 -0
- package/src/themes/modern.ts +186 -0
- package/src/themes/types.ts +262 -0
- package/src/themes/utils.ts +143 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shumoku Data Models
|
|
3
|
+
* Network diagram support with Mermaid-like syntax
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// ============================================
|
|
7
|
+
// Node Types
|
|
8
|
+
// ============================================
|
|
9
|
+
|
|
10
|
+
export type NodeShape =
|
|
11
|
+
| 'rect' // Rectangle [text]
|
|
12
|
+
| 'rounded' // Rounded rectangle (text)
|
|
13
|
+
| 'circle' // Circle ((text))
|
|
14
|
+
| 'diamond' // Diamond {text}
|
|
15
|
+
| 'hexagon' // Hexagon {{text}}
|
|
16
|
+
| 'cylinder' // Database cylinder [(text)]
|
|
17
|
+
| 'stadium' // Stadium/pill shape ([text])
|
|
18
|
+
| 'trapezoid' // Trapezoid [/text/]
|
|
19
|
+
|
|
20
|
+
export interface NodeStyle {
|
|
21
|
+
fill?: string
|
|
22
|
+
stroke?: string
|
|
23
|
+
strokeWidth?: number
|
|
24
|
+
strokeDasharray?: string
|
|
25
|
+
textColor?: string
|
|
26
|
+
fontSize?: number
|
|
27
|
+
fontWeight?: 'normal' | 'bold'
|
|
28
|
+
opacity?: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface Node {
|
|
32
|
+
id: string
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Display label - can be single line or multiple lines
|
|
36
|
+
* Supports basic HTML: <b>, <i>, <br/>
|
|
37
|
+
*/
|
|
38
|
+
label: string | string[]
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Node shape
|
|
42
|
+
*/
|
|
43
|
+
shape: NodeShape
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Device type (for default styling/icons)
|
|
47
|
+
*/
|
|
48
|
+
type?: DeviceType
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parent subgraph ID
|
|
52
|
+
*/
|
|
53
|
+
parent?: string
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Rank/layer for horizontal alignment
|
|
57
|
+
* Nodes with the same rank value will be placed on the same horizontal level
|
|
58
|
+
*/
|
|
59
|
+
rank?: number | string
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Custom style
|
|
63
|
+
*/
|
|
64
|
+
style?: NodeStyle
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Additional metadata
|
|
68
|
+
*/
|
|
69
|
+
metadata?: Record<string, unknown>
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Vendor name for vendor-specific icons (e.g., 'aws', 'azure', 'gcp', 'yamaha')
|
|
73
|
+
*/
|
|
74
|
+
vendor?: string
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Service name within the vendor (e.g., 'ec2', 'vpc', 'lambda')
|
|
78
|
+
* Used for cloud providers like AWS
|
|
79
|
+
*/
|
|
80
|
+
service?: string
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Model name for hardware vendors (e.g., 'rtx3510', 'ex4400')
|
|
84
|
+
* Alternative to service for equipment vendors
|
|
85
|
+
*/
|
|
86
|
+
model?: string
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resource type within the service (e.g., 'instance', 'nat-gateway')
|
|
90
|
+
*/
|
|
91
|
+
resource?: string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ============================================
|
|
95
|
+
// Link Types
|
|
96
|
+
// ============================================
|
|
97
|
+
|
|
98
|
+
export type LinkType =
|
|
99
|
+
| 'solid' // Normal line -->
|
|
100
|
+
| 'dashed' // Dashed line -.->
|
|
101
|
+
| 'thick' // Thick line ==>
|
|
102
|
+
| 'double' // Double line o==o
|
|
103
|
+
| 'invisible' // No line (for layout only)
|
|
104
|
+
|
|
105
|
+
export type ArrowType =
|
|
106
|
+
| 'none' // No arrow ---
|
|
107
|
+
| 'forward' // Arrow at target -->
|
|
108
|
+
| 'back' // Arrow at source <--
|
|
109
|
+
| 'both' // Arrows at both <-->
|
|
110
|
+
|
|
111
|
+
export interface LinkStyle {
|
|
112
|
+
stroke?: string
|
|
113
|
+
strokeWidth?: number
|
|
114
|
+
strokeDasharray?: string
|
|
115
|
+
opacity?: number
|
|
116
|
+
/** Minimum length for this link (controls node spacing for HA pairs) */
|
|
117
|
+
minLength?: number
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Link endpoint with optional port/IP details
|
|
122
|
+
*/
|
|
123
|
+
export interface LinkEndpoint {
|
|
124
|
+
node: string
|
|
125
|
+
port?: string
|
|
126
|
+
ip?: string // e.g., "10.57.0.1/30"
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Link bandwidth/speed type
|
|
131
|
+
* Controls line thickness for visual distinction
|
|
132
|
+
*/
|
|
133
|
+
export type LinkBandwidth = '1G' | '10G' | '25G' | '40G' | '100G'
|
|
134
|
+
|
|
135
|
+
export interface Link {
|
|
136
|
+
id?: string
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Source endpoint - can be simple node ID or detailed endpoint
|
|
140
|
+
*/
|
|
141
|
+
from: string | LinkEndpoint
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Target endpoint - can be simple node ID or detailed endpoint
|
|
145
|
+
*/
|
|
146
|
+
to: string | LinkEndpoint
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Link label - can be multiple lines (displayed at center)
|
|
150
|
+
*/
|
|
151
|
+
label?: string | string[]
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Link type
|
|
155
|
+
*/
|
|
156
|
+
type?: LinkType
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Arrow direction
|
|
160
|
+
*/
|
|
161
|
+
arrow?: ArrowType
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Bandwidth/speed - affects line thickness
|
|
165
|
+
* 1G: thin, 10G: normal, 25G: medium, 40G: thick, 100G: extra thick
|
|
166
|
+
*/
|
|
167
|
+
bandwidth?: LinkBandwidth
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Redundancy/clustering type - nodes connected with this will be placed on the same layer
|
|
171
|
+
* ha: High Availability (VRRP, HSRP, GLBP, keepalive)
|
|
172
|
+
* vc: Virtual Chassis (Juniper)
|
|
173
|
+
* vss: Virtual Switching System (Cisco)
|
|
174
|
+
* vpc: Virtual Port Channel (Cisco Nexus)
|
|
175
|
+
* mlag: Multi-Chassis Link Aggregation
|
|
176
|
+
* stack: Stacking
|
|
177
|
+
*/
|
|
178
|
+
redundancy?: 'ha' | 'vc' | 'vss' | 'vpc' | 'mlag' | 'stack'
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* VLANs carried on this link
|
|
182
|
+
* Single VLAN for access ports, multiple for trunk ports
|
|
183
|
+
*/
|
|
184
|
+
vlan?: number[]
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Custom style
|
|
188
|
+
*/
|
|
189
|
+
style?: LinkStyle
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Helper to get node ID from endpoint
|
|
194
|
+
*/
|
|
195
|
+
export function getNodeId(endpoint: string | LinkEndpoint): string {
|
|
196
|
+
return typeof endpoint === 'string' ? endpoint : endpoint.node
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ============================================
|
|
200
|
+
// Subgraph Types
|
|
201
|
+
// ============================================
|
|
202
|
+
|
|
203
|
+
export type LayoutDirection = 'TB' | 'BT' | 'LR' | 'RL'
|
|
204
|
+
|
|
205
|
+
export interface SubgraphStyle {
|
|
206
|
+
fill?: string
|
|
207
|
+
stroke?: string
|
|
208
|
+
strokeWidth?: number
|
|
209
|
+
strokeDasharray?: string
|
|
210
|
+
labelPosition?: 'top' | 'bottom' | 'left' | 'right'
|
|
211
|
+
labelFontSize?: number
|
|
212
|
+
/** Padding inside this subgraph (like CSS padding) */
|
|
213
|
+
padding?: number
|
|
214
|
+
/** Horizontal spacing between nodes in this subgraph */
|
|
215
|
+
nodeSpacing?: number
|
|
216
|
+
/** Vertical spacing between layers in this subgraph */
|
|
217
|
+
rankSpacing?: number
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface Subgraph {
|
|
221
|
+
id: string
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Display label
|
|
225
|
+
*/
|
|
226
|
+
label: string
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Child subgraph IDs
|
|
230
|
+
*/
|
|
231
|
+
children?: string[]
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Parent subgraph ID (for nested subgraphs)
|
|
235
|
+
*/
|
|
236
|
+
parent?: string
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Layout direction within this subgraph
|
|
240
|
+
*/
|
|
241
|
+
direction?: LayoutDirection
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Custom style
|
|
245
|
+
*/
|
|
246
|
+
style?: SubgraphStyle
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Vendor name for vendor-specific icons (e.g., 'aws', 'azure', 'gcp', 'yamaha')
|
|
250
|
+
*/
|
|
251
|
+
vendor?: string
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Service name within the vendor (e.g., 'ec2', 'vpc', 'lambda')
|
|
255
|
+
* Used for cloud providers like AWS
|
|
256
|
+
*/
|
|
257
|
+
service?: string
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Model name for hardware vendors (e.g., 'rtx3510', 'ex4400')
|
|
261
|
+
* Alternative to service for equipment vendors
|
|
262
|
+
*/
|
|
263
|
+
model?: string
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Resource type within the service (e.g., 'instance', 'nat-gateway')
|
|
267
|
+
*/
|
|
268
|
+
resource?: string
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ============================================
|
|
272
|
+
// Canvas/Sheet Size Types
|
|
273
|
+
// ============================================
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Standard paper size presets
|
|
277
|
+
*/
|
|
278
|
+
export type PaperSize =
|
|
279
|
+
| 'A0' | 'A1' | 'A2' | 'A3' | 'A4'
|
|
280
|
+
| 'B0' | 'B1' | 'B2' | 'B3' | 'B4'
|
|
281
|
+
| 'letter' | 'legal' | 'tabloid'
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Paper orientation
|
|
285
|
+
*/
|
|
286
|
+
export type PaperOrientation = 'portrait' | 'landscape'
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Paper size dimensions in mm
|
|
290
|
+
*/
|
|
291
|
+
export const PAPER_SIZES: Record<PaperSize, { width: number; height: number }> = {
|
|
292
|
+
'A0': { width: 841, height: 1189 },
|
|
293
|
+
'A1': { width: 594, height: 841 },
|
|
294
|
+
'A2': { width: 420, height: 594 },
|
|
295
|
+
'A3': { width: 297, height: 420 },
|
|
296
|
+
'A4': { width: 210, height: 297 },
|
|
297
|
+
'B0': { width: 1000, height: 1414 },
|
|
298
|
+
'B1': { width: 707, height: 1000 },
|
|
299
|
+
'B2': { width: 500, height: 707 },
|
|
300
|
+
'B3': { width: 353, height: 500 },
|
|
301
|
+
'B4': { width: 250, height: 353 },
|
|
302
|
+
'letter': { width: 216, height: 279 },
|
|
303
|
+
'legal': { width: 216, height: 356 },
|
|
304
|
+
'tabloid': { width: 279, height: 432 },
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Canvas/sheet size settings
|
|
309
|
+
*/
|
|
310
|
+
export interface CanvasSettings {
|
|
311
|
+
/**
|
|
312
|
+
* Paper size preset (A0, A1, A2, A3, A4, etc.)
|
|
313
|
+
*/
|
|
314
|
+
preset?: PaperSize
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Paper orientation (portrait or landscape)
|
|
318
|
+
* Only used with preset
|
|
319
|
+
*/
|
|
320
|
+
orientation?: PaperOrientation
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Custom width in pixels
|
|
324
|
+
* Takes precedence over preset
|
|
325
|
+
*/
|
|
326
|
+
width?: number
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Custom height in pixels
|
|
330
|
+
* Takes precedence over preset
|
|
331
|
+
*/
|
|
332
|
+
height?: number
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* DPI for print output (default: 96 for screen, 300 for print)
|
|
336
|
+
*/
|
|
337
|
+
dpi?: number
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Fit content to canvas with padding
|
|
341
|
+
* If true, scales content to fit within canvas
|
|
342
|
+
*/
|
|
343
|
+
fit?: boolean
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Padding around content when fit is true (in pixels)
|
|
347
|
+
*/
|
|
348
|
+
padding?: number
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Convert paper size to pixels at given DPI
|
|
353
|
+
*/
|
|
354
|
+
export function paperSizeToPixels(
|
|
355
|
+
size: PaperSize,
|
|
356
|
+
orientation: PaperOrientation = 'portrait',
|
|
357
|
+
dpi: number = 96
|
|
358
|
+
): { width: number; height: number } {
|
|
359
|
+
const dimensions = PAPER_SIZES[size]
|
|
360
|
+
const mmToInch = 1 / 25.4
|
|
361
|
+
|
|
362
|
+
let width = Math.round(dimensions.width * mmToInch * dpi)
|
|
363
|
+
let height = Math.round(dimensions.height * mmToInch * dpi)
|
|
364
|
+
|
|
365
|
+
if (orientation === 'landscape') {
|
|
366
|
+
;[width, height] = [height, width]
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return { width, height }
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// ============================================
|
|
373
|
+
// Graph Types
|
|
374
|
+
// ============================================
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Theme type for diagram appearance
|
|
378
|
+
*/
|
|
379
|
+
export type ThemeType = 'light' | 'dark'
|
|
380
|
+
|
|
381
|
+
export interface GraphSettings {
|
|
382
|
+
/**
|
|
383
|
+
* Default layout direction
|
|
384
|
+
*/
|
|
385
|
+
direction?: LayoutDirection
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Theme for diagram appearance (light or dark)
|
|
389
|
+
*/
|
|
390
|
+
theme?: ThemeType
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Node spacing
|
|
394
|
+
*/
|
|
395
|
+
nodeSpacing?: number
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Rank spacing (between layers)
|
|
399
|
+
*/
|
|
400
|
+
rankSpacing?: number
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Subgraph padding
|
|
404
|
+
*/
|
|
405
|
+
subgraphPadding?: number
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Canvas/sheet size settings
|
|
409
|
+
*/
|
|
410
|
+
canvas?: CanvasSettings
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export interface NetworkGraph {
|
|
414
|
+
version: string
|
|
415
|
+
name?: string
|
|
416
|
+
description?: string
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* All nodes (flat list)
|
|
420
|
+
*/
|
|
421
|
+
nodes: Node[]
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* All links
|
|
425
|
+
*/
|
|
426
|
+
links: Link[]
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Subgraph definitions
|
|
430
|
+
*/
|
|
431
|
+
subgraphs?: Subgraph[]
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Global settings
|
|
435
|
+
*/
|
|
436
|
+
settings?: GraphSettings
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// ============================================
|
|
440
|
+
// Device Types (for default styling)
|
|
441
|
+
// ============================================
|
|
442
|
+
|
|
443
|
+
export enum DeviceType {
|
|
444
|
+
Router = 'router',
|
|
445
|
+
L3Switch = 'l3-switch',
|
|
446
|
+
L2Switch = 'l2-switch',
|
|
447
|
+
Firewall = 'firewall',
|
|
448
|
+
LoadBalancer = 'load-balancer',
|
|
449
|
+
Server = 'server',
|
|
450
|
+
AccessPoint = 'access-point',
|
|
451
|
+
Cloud = 'cloud',
|
|
452
|
+
Internet = 'internet',
|
|
453
|
+
VPN = 'vpn',
|
|
454
|
+
Database = 'database',
|
|
455
|
+
Generic = 'generic',
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ============================================
|
|
459
|
+
// Layout Result Types
|
|
460
|
+
// ============================================
|
|
461
|
+
|
|
462
|
+
export interface Position {
|
|
463
|
+
x: number
|
|
464
|
+
y: number
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export interface Size {
|
|
468
|
+
width: number
|
|
469
|
+
height: number
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export interface Bounds {
|
|
473
|
+
x: number
|
|
474
|
+
y: number
|
|
475
|
+
width: number
|
|
476
|
+
height: number
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Port position on a node edge
|
|
481
|
+
*/
|
|
482
|
+
export interface LayoutPort {
|
|
483
|
+
id: string
|
|
484
|
+
/** Port name (e.g., "eth0", "Gi0/1") */
|
|
485
|
+
label: string
|
|
486
|
+
/** Position relative to node center */
|
|
487
|
+
position: Position
|
|
488
|
+
/** Port box size */
|
|
489
|
+
size: Size
|
|
490
|
+
/** Which side of the node (for rendering) */
|
|
491
|
+
side: 'top' | 'bottom' | 'left' | 'right'
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export interface LayoutNode {
|
|
495
|
+
id: string
|
|
496
|
+
position: Position
|
|
497
|
+
size: Size
|
|
498
|
+
node: Node
|
|
499
|
+
/** Ports on this node */
|
|
500
|
+
ports?: Map<string, LayoutPort>
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export interface LayoutLink {
|
|
504
|
+
id: string
|
|
505
|
+
from: string // Node ID
|
|
506
|
+
to: string // Node ID
|
|
507
|
+
fromEndpoint: LinkEndpoint // Full endpoint info
|
|
508
|
+
toEndpoint: LinkEndpoint // Full endpoint info
|
|
509
|
+
points: Position[]
|
|
510
|
+
link: Link
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
export interface LayoutSubgraph {
|
|
514
|
+
id: string
|
|
515
|
+
bounds: Bounds
|
|
516
|
+
subgraph: Subgraph
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export interface LayoutResult {
|
|
520
|
+
nodes: Map<string, LayoutNode>
|
|
521
|
+
links: Map<string, LayoutLink>
|
|
522
|
+
subgraphs: Map<string, LayoutSubgraph>
|
|
523
|
+
bounds: Bounds
|
|
524
|
+
metadata?: {
|
|
525
|
+
algorithm: string
|
|
526
|
+
duration: number
|
|
527
|
+
}
|
|
528
|
+
}
|