@@ -11,7 +11,9 @@ import { drawMermaid, drawMermaidPng } from "./graph_mermaid.js";
11
11
12
12
const MAX_DATA_DISPLAY_NAME_LENGTH = 42 ;
13
13
14
- export function nodeDataStr ( node : Node ) : string {
14
+ export { Node , Edge } ;
15
+
16
+ function nodeDataStr ( node : Node ) : string {
15
17
if ( ! isUuid ( node . id ) ) {
16
18
return node . id ;
17
19
} else if ( isRunnableInterface ( node . data ) ) {
@@ -101,14 +103,24 @@ export class Graph {
101
103
) ;
102
104
}
103
105
104
- addEdge ( source : Node , target : Node , data ?: string ) : Edge {
106
+ addEdge (
107
+ source : Node ,
108
+ target : Node ,
109
+ data ?: string ,
110
+ conditional ?: boolean
111
+ ) : Edge {
105
112
if ( this . nodes [ source . id ] === undefined ) {
106
113
throw new Error ( `Source node ${ source . id } not in graph` ) ;
107
114
}
108
115
if ( this . nodes [ target . id ] === undefined ) {
109
116
throw new Error ( `Target node ${ target . id } not in graph` ) ;
110
117
}
111
- const edge : Edge = { source : source . id , target : target . id , data } ;
118
+ const edge : Edge = {
119
+ source : source . id ,
120
+ target : target . id ,
121
+ data,
122
+ conditional,
123
+ } ;
112
124
this . edges . push ( edge ) ;
113
125
return edge ;
114
126
}
@@ -135,14 +147,40 @@ export class Graph {
135
147
return found [ 0 ] ;
136
148
}
137
149
138
- extend ( graph : Graph ) : void {
139
- // Add all nodes from the other graph, taking care to avoid duplicates
150
+ /**
151
+ * Add all nodes and edges from another graph.
152
+ * Note this doesn't check for duplicates, nor does it connect the graphs.
153
+ */
154
+ extend ( graph : Graph , prefix : string = "" ) {
155
+ let finalPrefix = prefix ;
156
+ const nodeIds = Object . values ( graph . nodes ) . map ( ( node ) => node . id ) ;
157
+ if ( nodeIds . every ( isUuid ) ) {
158
+ finalPrefix = "" ;
159
+ }
160
+
161
+ const prefixed = ( id : string ) => {
162
+ return finalPrefix ? `${ finalPrefix } :${ id } ` : id ;
163
+ } ;
164
+
140
165
Object . entries ( graph . nodes ) . forEach ( ( [ key , value ] ) => {
141
- this . nodes [ key ] = value ;
166
+ this . nodes [ prefixed ( key ) ] = { ... value , id : prefixed ( key ) } ;
142
167
} ) ;
143
168
169
+ const newEdges = graph . edges . map ( ( edge ) => {
170
+ return {
171
+ ...edge ,
172
+ source : prefixed ( edge . source ) ,
173
+ target : prefixed ( edge . target ) ,
174
+ } ;
175
+ } ) ;
144
176
// Add all edges from the other graph
145
- this . edges = [ ...this . edges , ...graph . edges ] ;
177
+ this . edges = [ ...this . edges , ...newEdges ] ;
178
+ const first = graph . firstNode ( ) ;
179
+ const last = graph . lastNode ( ) ;
180
+ return [
181
+ first ? { id : prefixed ( first . id ) , data : first . data } : undefined ,
182
+ last ? { id : prefixed ( last . id ) , data : last . data } : undefined ,
183
+ ] ;
146
184
}
147
185
148
186
trimFirstNode ( ) : void {
0 commit comments