@likec4/core 1.18.0 → 1.19.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 (176) hide show
  1. package/LICENSE +1 -1
  2. package/dist/builder/index.d.mts +502 -0
  3. package/dist/builder/index.d.ts +502 -0
  4. package/dist/builder/index.js +871 -0
  5. package/dist/compute-view/index.d.mts +9 -78
  6. package/dist/compute-view/index.d.ts +9 -78
  7. package/dist/compute-view/index.js +78 -0
  8. package/dist/index.d.mts +9 -730
  9. package/dist/index.d.ts +9 -730
  10. package/dist/{index.mjs → index.js} +7 -784
  11. package/dist/model/index.d.mts +218 -606
  12. package/dist/model/index.d.ts +218 -606
  13. package/dist/model/index.js +1 -0
  14. package/dist/shared/chunk-RAAYCPUM.M-JWF7SS.js +21 -0
  15. package/dist/shared/core.BIfgabEw.d.ts +719 -0
  16. package/dist/shared/core.BZ9Msq7w.d.mts +719 -0
  17. package/dist/shared/{core.DMYY7C8s.d.mts → core.C05RDLhi.d.ts} +179 -230
  18. package/dist/shared/{core.DMYY7C8s.d.ts → core.CmYMqgha.d.mts} +179 -230
  19. package/dist/shared/core.D6-fWbM3.d.ts +127 -0
  20. package/dist/shared/core.D74xkKkG.d.mts +148 -0
  21. package/dist/shared/core.D74xkKkG.d.ts +148 -0
  22. package/dist/shared/core.sLaWHBjR.d.mts +127 -0
  23. package/dist/shared/index.-BdzdI2C.js +7443 -0
  24. package/dist/shared/object_hash.CE_oF3I3.js +1222 -0
  25. package/dist/shared/view.CyZrG8BJ.js +354 -0
  26. package/dist/types/index.d.mts +4 -2
  27. package/dist/types/index.d.ts +4 -2
  28. package/dist/types/index.js +20 -0
  29. package/dist/utils/index.d.mts +404 -0
  30. package/dist/utils/index.d.ts +404 -0
  31. package/dist/utils/index.js +330 -0
  32. package/package.json +47 -33
  33. package/src/builder/Builder-style1.test-d.ts +190 -0
  34. package/src/builder/Builder-style2.test-d.ts +175 -0
  35. package/src/builder/Builder.deployment.ts +25 -20
  36. package/src/builder/Builder.deploymentModel.ts +80 -55
  37. package/src/builder/Builder.element.ts +2 -0
  38. package/src/builder/Builder.model.ts +57 -43
  39. package/src/builder/Builder.ts +412 -431
  40. package/src/builder/Builder.view-common.ts +234 -0
  41. package/src/builder/Builder.view-deployment.ts +135 -0
  42. package/src/builder/Builder.view-element.ts +189 -0
  43. package/src/builder/Builder.views.ts +109 -33
  44. package/src/builder/Builder.with.ts +475 -0
  45. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +374 -0
  46. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +183 -0
  47. package/src/builder/__snapshots__/Builder.spec.ts.snap +374 -0
  48. package/src/builder/_types.ts +28 -5
  49. package/src/builder/index.ts +10 -4
  50. package/src/colors/index.ts +2 -2
  51. package/src/compute-view/compute-view.ts +45 -54
  52. package/src/compute-view/deployment-view/__test__/TestHelper.ts +236 -0
  53. package/src/compute-view/deployment-view/__test__/fixture.ts +50 -62
  54. package/src/compute-view/deployment-view/_types.ts +26 -18
  55. package/src/compute-view/deployment-view/clean-connections.ts +173 -164
  56. package/src/compute-view/deployment-view/compute.ts +51 -37
  57. package/src/compute-view/deployment-view/memory/index.ts +9 -0
  58. package/src/compute-view/deployment-view/memory/memory.ts +97 -0
  59. package/src/compute-view/deployment-view/predicates/elements.ts +144 -0
  60. package/src/compute-view/deployment-view/predicates/relation-direct.ts +183 -76
  61. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +38 -20
  62. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +72 -23
  63. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +61 -22
  64. package/src/compute-view/deployment-view/predicates/wildcard.ts +15 -15
  65. package/src/compute-view/deployment-view/stages/stage-exclude.ts +5 -0
  66. package/src/compute-view/deployment-view/stages/stage-final.ts +245 -0
  67. package/src/compute-view/deployment-view/stages/stage-include.ts +95 -0
  68. package/src/compute-view/deployment-view/utils.ts +95 -31
  69. package/src/compute-view/dynamic-view/__test__/fixture.ts +4 -4
  70. package/src/compute-view/dynamic-view/compute.ts +59 -45
  71. package/src/compute-view/element-view/__test__/TestHelper.ts +258 -0
  72. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +64 -62
  73. package/src/compute-view/element-view/__test__/fixture.ts +147 -117
  74. package/src/compute-view/element-view/_types.ts +48 -0
  75. package/src/compute-view/element-view/clean-connections.ts +113 -0
  76. package/src/compute-view/element-view/compute.ts +264 -683
  77. package/src/compute-view/element-view/memory/NodeGroup.ts +31 -0
  78. package/src/compute-view/element-view/memory/index.ts +10 -0
  79. package/src/compute-view/element-view/memory/memory.ts +177 -0
  80. package/src/compute-view/element-view/memory/stage-exclude.ts +59 -0
  81. package/src/compute-view/element-view/memory/stage-final.ts +129 -0
  82. package/src/compute-view/element-view/memory/stage-include.ts +128 -0
  83. package/src/compute-view/element-view/predicates/_utils.ts +86 -0
  84. package/src/compute-view/element-view/predicates/element-expand.ts +33 -0
  85. package/src/compute-view/element-view/predicates/element-kind-tag.ts +26 -0
  86. package/src/compute-view/element-view/predicates/element-ref.ts +37 -0
  87. package/src/compute-view/element-view/predicates/relation-direct.ts +309 -0
  88. package/src/compute-view/element-view/predicates/relation-in-out.ts +66 -0
  89. package/src/compute-view/element-view/predicates/relation-in.ts +118 -0
  90. package/src/compute-view/element-view/predicates/relation-out.ts +116 -0
  91. package/src/compute-view/element-view/predicates/wildcard.ts +88 -0
  92. package/src/compute-view/element-view/utils.ts +59 -0
  93. package/src/compute-view/index.ts +3 -4
  94. package/src/compute-view/memory/AbstractMemory.ts +45 -0
  95. package/src/compute-view/memory/AbstractStageExclude.ts +216 -0
  96. package/src/compute-view/memory/AbstractStageInclude.ts +200 -0
  97. package/src/compute-view/memory/_types.ts +147 -0
  98. package/src/compute-view/memory/index.ts +5 -0
  99. package/src/compute-view/memory/ops.ts +43 -0
  100. package/src/compute-view/utils/buildComputedNodes.ts +4 -4
  101. package/src/compute-view/utils/elementExpressionToPredicate.ts +1 -3
  102. package/src/compute-view/utils/link-nodes-with-edges.ts +3 -7
  103. package/src/compute-view/utils/{derive-edge-props-from-relationships.ts → merge-props-from-relationships.ts} +54 -23
  104. package/src/compute-view/utils/relationExpressionToPredicates.ts +2 -2
  105. package/src/compute-view/utils/resolve-extended-views.ts +44 -40
  106. package/src/compute-view/utils/resolve-global-rules.ts +6 -6
  107. package/src/compute-view/utils/topological-sort.ts +167 -71
  108. package/src/compute-view/utils/with-readable-edges.ts +14 -9
  109. package/src/index.ts +22 -16
  110. package/src/model/DeploymentElementModel.ts +150 -85
  111. package/src/model/DeploymentModel.ts +27 -21
  112. package/src/model/ElementModel.ts +51 -25
  113. package/src/model/LikeC4Model.test-d.ts +4 -3
  114. package/src/model/LikeC4Model.ts +98 -42
  115. package/src/model/RelationModel.ts +5 -4
  116. package/src/model/__test__/fixture.ts +5 -9
  117. package/src/model/connection/Connection.ts +72 -0
  118. package/src/model/connection/deployment/DeploymentConnectionModel.ts +178 -0
  119. package/src/model/connection/{deployment.ts → deployment/find.ts} +14 -18
  120. package/src/model/connection/deployment/index.ts +8 -0
  121. package/src/model/connection/index.ts +22 -0
  122. package/src/model/connection/model/ConnectionModel.ts +157 -0
  123. package/src/model/connection/{model.ts → model/find.ts} +43 -49
  124. package/src/model/connection/model/index.ts +8 -0
  125. package/src/model/connection/ops.ts +274 -0
  126. package/src/model/guards.ts +9 -0
  127. package/src/model/index.ts +45 -3
  128. package/src/model/types.ts +35 -18
  129. package/src/model/view/EdgeModel.ts +6 -6
  130. package/src/model/view/LikeC4ViewModel.ts +14 -8
  131. package/src/model/view/NodeModel.ts +6 -5
  132. package/src/types/_common.ts +53 -1
  133. package/src/types/deployments.ts +88 -156
  134. package/src/types/element.ts +2 -2
  135. package/src/types/expression-v2.ts +172 -0
  136. package/src/types/expression.ts +9 -5
  137. package/src/types/global.ts +3 -3
  138. package/src/types/index.ts +220 -13
  139. package/src/types/model.ts +28 -24
  140. package/src/types/operators.ts +1 -1
  141. package/src/types/relation.ts +14 -10
  142. package/src/types/theme.ts +0 -1
  143. package/src/types/view.ts +20 -18
  144. package/src/utils/const.ts +1 -0
  145. package/src/utils/fqn.ts +140 -49
  146. package/src/utils/getOrCreate.ts +1 -1
  147. package/src/utils/index.ts +74 -9
  148. package/src/utils/iterable/_types.ts +5 -0
  149. package/src/utils/iterable/filter.ts +55 -0
  150. package/src/utils/iterable/flat.ts +17 -0
  151. package/src/utils/iterable/index.ts +12 -0
  152. package/src/utils/iterable/map.ts +40 -0
  153. package/src/utils/iterable/reduce.ts +24 -0
  154. package/src/utils/iterable/some.ts +36 -0
  155. package/src/utils/iterable/to.ts +19 -0
  156. package/src/utils/iterable/unique.ts +29 -0
  157. package/src/utils/relations.ts +3 -64
  158. package/src/utils/set.ts +11 -9
  159. package/src/utils/string-hash.ts +1 -1
  160. package/dist/compute-view/index.mjs +0 -79
  161. package/dist/model/index.mjs +0 -2
  162. package/dist/shared/core.BBgiAAv1.mjs +0 -144
  163. package/dist/shared/core.BPyJvuMU.mjs +0 -2420
  164. package/dist/shared/core.BQ4AbfvB.mjs +0 -9228
  165. package/dist/shared/core.k12s_keD.mjs +0 -203
  166. package/dist/types/index.mjs +0 -21
  167. package/src/builder/Builder.test-d.ts +0 -124
  168. package/src/builder/Builder.view.ts +0 -543
  169. package/src/compute-view/LikeC4ModelGraph.ts +0 -330
  170. package/src/compute-view/deployment-view/Memory.ts +0 -108
  171. package/src/compute-view/deployment-view/Stage.ts +0 -145
  172. package/src/compute-view/deployment-view/predicates/deployment-ref.ts +0 -146
  173. package/src/compute-view/element-view/predicates.ts +0 -517
  174. package/src/compute-view/utils/sortNodes.ts +0 -101
  175. package/src/model/connection/ConnectionModel.ts +0 -94
  176. package/src/model/connection/DeploymentConnectionModel.ts +0 -99
@@ -1,15 +1,16 @@
1
1
  import Graph from 'graphology'
2
2
  import { topologicalSort as topsort } from 'graphology-dag/topological-sort'
3
3
  import willCreateCycle from 'graphology-dag/will-create-cycle'
4
- import { forEach, map, pipe, prop, sortBy } from 'remeda'
4
+ import { forEach, map, partition, pipe, takeWhile } from 'remeda'
5
5
  import { invariant, nonNullable } from '../../errors'
6
- import type { ComputedEdge, ComputedNode, NodeId } from '../../types'
6
+ import type { ComputedEdge, ComputedNode, Fqn, NodeId } from '../../types'
7
+ import { ancestorsOfNode } from './ancestorsOfNode'
7
8
 
8
9
  /**
9
- * Keeps initial order of the elements, but ensures that parents are before children
10
+ * Keeps initial order of the elements, but ensures parents are placed before children
10
11
  */
11
12
  function ensureParentsFirst<T extends { id: string; parent: string | null }>(
12
- array: ReadonlyArray<T>
13
+ array: ReadonlyArray<T>,
13
14
  ): Array<T> {
14
15
  const result = [] as T[]
15
16
  const items = [...array]
@@ -55,106 +56,201 @@ function updateChildren(nodes: ComputedNode[]) {
55
56
  }
56
57
 
57
58
  type TopologicalSortParam = {
58
- nodes: Iterable<ComputedNode>
59
+ nodes: ReadonlyMap<Fqn, ComputedNode>
59
60
  edges: Iterable<ComputedEdge>
60
61
  }
61
62
  export function topologicalSort(
62
- param: TopologicalSortParam
63
+ param: TopologicalSortParam,
63
64
  ): {
64
65
  nodes: ComputedNode[]
65
66
  edges: ComputedEdge[]
66
67
  } {
67
- let nodes = [...param.nodes]
68
+ let nodes = ensureParentsFirst([...param.nodes.values()])
68
69
  let edges = [...param.edges]
69
- if (nodes.length < 2) {
70
+ if (nodes.length < 2 || edges.length === 0) {
70
71
  return {
71
72
  nodes,
72
- edges
73
+ edges,
73
74
  }
74
75
  }
75
- nodes = ensureParentsFirst(nodes)
76
76
 
77
- if (edges.length === 0) {
78
- return {
79
- nodes,
80
- edges
81
- }
82
- }
83
-
84
- const getNode = (id: string) => nonNullable(nodes.find(n => n.id === id))
85
- const nodeLevel = (id: string) => getNode(id).level + 1
86
- const getEdge = (id: string) => nonNullable(edges.find(edge => edge.id === id))
77
+ const getNode = (id: Fqn) => nonNullable(param.nodes.get(id))
78
+ // const nodeLevel = (id: string) => getNode(id).level + 1
79
+ //
87
80
 
88
81
  const g = new Graph({
89
82
  multi: true,
90
83
  allowSelfLoops: true,
91
- type: 'directed'
84
+ type: 'directed',
92
85
  })
93
86
 
94
- for (const n of nodes) {
95
- g.addNode(n.id)
96
- }
97
- const sortedEdges = [] as ComputedEdge[]
98
-
99
- pipe(
87
+ const enrichedEdges = pipe(
100
88
  edges,
101
- map(e => ({
102
- e,
103
- parentLevel: e.parent ? nodeLevel(e.parent) : 0,
104
- sourceLevel: nodeLevel(e.source),
105
- targetLevel: nodeLevel(e.target),
106
- sourceIndex: nodes.findIndex(n => n.id === e.source),
107
- targetIndex: nodes.findIndex(n => n.id === e.target)
108
- })),
109
- sortBy(
110
- [prop('parentLevel'), 'desc'],
111
- [prop('sourceLevel'), 'desc'],
112
- [prop('targetLevel'), 'desc'],
113
- [prop('sourceIndex'), 'asc'],
114
- [prop('targetIndex'), 'asc']
115
- ),
116
- forEach(({ e }, idx, _all) => {
117
- sortedEdges.push(e)
118
- if (idx === 0 || !willCreateCycle(g, e.source, e.target)) {
119
- g.mergeDirectedEdge(e.source, e.target)
120
- }
121
- })
89
+ map((edge, __dirname) => {
90
+ const source = getNode(edge.source),
91
+ target = getNode(edge.target),
92
+ parent = edge.parent ? getNode(edge.parent) : null
93
+ return ({
94
+ id: edge.id,
95
+ edge,
96
+ parent,
97
+ source,
98
+ target,
99
+ })
100
+ }),
101
+ // sortBy(
102
+ // [prop('sourceIndex'), 'asc'],
103
+ // // [prop('sourceInCount'), 'asc'],
104
+ // // [prop('sourceLevel'), 'asc'],
105
+ // ),
106
+ )
107
+
108
+ const [edgesBetweenLeafs, edgesWithCompounds] = partition(
109
+ enrichedEdges,
110
+ ({ source, target }) => source.children.length === 0 && target.children.length === 0,
122
111
  )
123
112
 
124
- // Strengthen the graph by adding edges to compound nodes
125
- for (const n of nodes) {
126
- if (n.children.length > 0) {
127
- n.inEdges.forEach(e => {
128
- const edge = getEdge(e)
129
- // if this edge from leaf to the child of this node
130
- if (edge.target !== n.id && getNode(edge.source).children.length === 0) {
131
- if (!willCreateCycle(g, edge.source, n.id)) {
132
- g.mergeDirectedEdge(edge.source, n.id)
113
+ // edgesBetweenLeafs.sort((a, b) => {
114
+ // if (a.source === b.source) {
115
+ // return 0
116
+ // }
117
+ // if (a.source.level === 0 && b.source.level === 0) {
118
+ // return 0
119
+ // }
120
+ // if (isSameHierarchy(a.source, b.target) || isSameHierarchy(a.target, b.source)) {
121
+ // return edges.indexOf(a.edge) - edges.indexOf(b.edge)
122
+ // }
123
+ // const aLevel = a.parent ? a.parent.level + 1 - a.source.level : a.source.level
124
+ // const bLevel = b.parent ? b.parent.level + 1 - b.source.level : b.source.level
125
+ // return aLevel - bLevel
126
+ // // if (a.source.level === 0 && b.source.level === 0) {
127
+
128
+ // // // if (a.source.depth)
129
+ // // return nodes.indexOf(a.target) - nodes.indexOf(b.target)
130
+ // // }
131
+ // // if (a.source.level === 0 && b.source.level > 0) {
132
+ // // return -1
133
+ // // }
134
+ // // if (a.parent && b.parent && a.parent !== b.parent) {
135
+ // // if (a.parent.level !== b.parent.level) {
136
+ // // return b.parent.level - a.parent.level
137
+ // // } else {
138
+ // // return nodes.indexOf(a.parent) - nodes.indexOf(b.parent)
139
+ // // }
140
+ // // }
141
+ // // return Math.min(nodes.indexOf(a.source), nodes.indexOf(a.target)) - Math.min(nodes.indexOf(b.source), nodes.indexOf(b.target))
142
+ // })
143
+ const sortedEdges = [] as ComputedEdge[]
144
+
145
+ const addEdgeToGraph = (edge: ComputedEdge) => {
146
+ g.mergeNode(edge.source)
147
+ g.mergeNode(edge.target)
148
+ sortedEdges.push(edge)
149
+ if (!willCreateCycle(g, edge.source, edge.target)) {
150
+ g.mergeDirectedEdge(edge.source, edge.target)
151
+ }
152
+ }
153
+
154
+ for (const { edge, source, target } of edgesBetweenLeafs) {
155
+ addEdgeToGraph(edge)
156
+ // Strengthen the graph by adding edges to parents
157
+ if (target.parent && target.parent !== edge.parent) {
158
+ pipe(
159
+ ancestorsOfNode(target, param.nodes),
160
+ takeWhile(ancestor => ancestor.inEdges.includes(edge.id)),
161
+ forEach(ancestor => {
162
+ g.mergeNode(ancestor.id)
163
+ if (!willCreateCycle(g, edge.source, ancestor.id)) {
164
+ g.mergeDirectedEdge(edge.source, ancestor.id)
133
165
  }
134
- }
135
- })
166
+ if (!willCreateCycle(g, ancestor.id, edge.target)) {
167
+ g.mergeDirectedEdge(ancestor.id, edge.target)
168
+ }
169
+ }),
170
+ )
136
171
  }
137
- if (n.parent && !willCreateCycle(g, n.parent, n.id)) {
138
- g.mergeDirectedEdge(n.parent, n.id)
172
+ if (source.parent) {
173
+ const sourceParent = getNode(source.parent)
174
+ g.mergeNode(sourceParent.id)
175
+ if (!willCreateCycle(g, sourceParent.id, source.id)) {
176
+ g.mergeDirectedEdge(sourceParent.id, source.id)
177
+ }
178
+ if (target.parent && target.parent !== source.parent) {
179
+ if (!willCreateCycle(g, sourceParent.id, target.parent)) {
180
+ g.mergeDirectedEdge(sourceParent.id, target.parent)
181
+ }
182
+ }
139
183
  }
184
+
185
+ // addEdgeToGraph(edge)
186
+ }
187
+ for (const { edge } of edgesWithCompounds) {
188
+ addEdgeToGraph(edge)
140
189
  }
141
190
 
191
+ invariant(sortedEdges.length === edges.length, 'Not all edges were added to the graph')
192
+
193
+ // for (const compound of nodes) {
194
+ // if (compound.children.length === 0 || compound.inEdges.length === 0) {
195
+ // continue
196
+ // }
197
+ // // g.mergeNode(compound.id)
198
+ // for (const inEdge of compound.inEdges) {
199
+ // const { edge, source } = getEdge(inEdge)
200
+ // // ignore if this edge is coming from compound node
201
+ // if (source.children.length > 0) {
202
+ // continue
203
+ // }
204
+ // // if this edge is coming to the compound node directly
205
+ // if (edge.target === compound.id) {
206
+ // // for (const child of compound.children) {
207
+ // // // g.mergeNode(child)
208
+ // // if (!willCreateCycle(g, edge.source, child)) {
209
+ // // g.mergeDirectedEdge(edge.source, child)
210
+ // // }
211
+ // // }
212
+ // } else {
213
+ // if (!willCreateCycle(g, edge.source, compound.id)) {
214
+ // g.mergeDirectedEdge(edge.source, compound.id)
215
+ // }
216
+ // if (!willCreateCycle(g, compound.id, edge.target)) {
217
+ // g.mergeDirectedEdge(compound.id, edge.target)
218
+ // }
219
+ // }
220
+ // }
221
+ // }
222
+
142
223
  const sortedIds = topsort(g)
143
- const sorted = [] as ComputedNode[]
224
+ let sorted = [] as ComputedNode[]
225
+ let unsorted = nodes.slice()
144
226
  for (const sortedId of sortedIds) {
145
- const indx = nodes.findIndex(n => n.id === sortedId)
227
+ const indx = unsorted.findIndex(n => n.id === sortedId)
146
228
  invariant(indx >= 0, `Node "${sortedId}" not found`)
147
- sorted.push(...nodes.splice(indx, 1))
229
+ sorted.push(...unsorted.splice(indx, 1))
148
230
  }
149
- if (nodes.length > 0) {
150
- sorted.push(...nodes)
231
+ // Merge unsorted nodes, keeping their initial order
232
+ if (unsorted.length > 0 && sorted.length > 0) {
233
+ sorted = sorted.flatMap(node => {
234
+ if (unsorted.length === 0) {
235
+ return node
236
+ }
237
+ const wereBefore = nodes
238
+ .slice(0, nodes.indexOf(node))
239
+ .filter(n => unsorted.includes(n))
240
+ if (wereBefore.length > 0) {
241
+ unsorted = unsorted.filter(n => !wereBefore.includes(n))
242
+ return [...wereBefore, node]
243
+ }
244
+
245
+ return node
246
+ })
151
247
  }
248
+ // Add remaining unsorted nodes
249
+ sorted.push(...unsorted)
152
250
  return {
153
- nodes: pipe(
154
- sorted,
155
- ensureParentsFirst,
156
- updateChildren
251
+ nodes: updateChildren(
252
+ ensureParentsFirst(sorted),
157
253
  ),
158
- edges: sortedEdges
254
+ edges: sortedEdges,
159
255
  }
160
256
  }
@@ -1,4 +1,4 @@
1
- import { map, mapToObj, mapValues } from 'remeda'
1
+ import { map, mapToObj, mapValues, omit } from 'remeda'
2
2
  import type { ComputedLikeC4Model } from '../../types'
3
3
  import type { ComputedView, EdgeId } from '../../types/view'
4
4
 
@@ -6,26 +6,31 @@ import type { ComputedView, EdgeId } from '../../types/view'
6
6
  * Convert hashed edge ids to human-readable
7
7
  * Mostly for testing purposes
8
8
  */
9
- export function withReadableEdges<T extends ComputedView>({ edges, nodes, ...view }: T): T {
10
- const edgeids = mapToObj(edges, e => [e.id, `${e.source}:${e.target}` as EdgeId])
9
+ export function withReadableEdges<T extends ComputedView>({ edges, nodes, ...view }: T, separator = ':'): T & {
10
+ nodeIds: string[]
11
+ edgeIds: string[]
12
+ } {
13
+ const edgeids = mapToObj(edges, e => [e.id, `${e.source}${separator}${e.target}` as EdgeId])
11
14
 
12
15
  return {
13
16
  ...view,
14
17
  edges: edges.map(e => ({
15
18
  ...e,
16
- id: edgeids[e.id]!
19
+ id: edgeids[e.id]!,
17
20
  })),
18
21
  nodes: nodes.map(n => ({
19
22
  ...n,
20
23
  inEdges: map(n.inEdges, e => edgeids[e]!),
21
- outEdges: map(n.outEdges, e => edgeids[e]!)
22
- }))
23
- } as T
24
+ outEdges: map(n.outEdges, e => edgeids[e]!),
25
+ })),
26
+ nodeIds: nodes.map(n => n.id),
27
+ edgeIds: edges.map(e => edgeids[e.id]!),
28
+ } as any
24
29
  }
25
30
 
26
31
  export function viewsWithReadableEdges<M extends ComputedLikeC4Model>({ views, ...model }: M): M {
27
32
  return {
28
33
  ...model,
29
- views: mapValues(views, withReadableEdges)
30
- } as M
34
+ views: mapValues(views, v => omit(withReadableEdges(v), ['nodeIds', 'edgeIds'])),
35
+ } as any
31
36
  }
package/src/index.ts CHANGED
@@ -1,20 +1,26 @@
1
- export * from './builder'
2
- export { Builder } from './builder'
3
- export type * from './builder'
4
- export * from './colors'
5
- export * from './errors'
6
- export * from './model'
1
+ export {
2
+ computeColorValues,
3
+ defaultTheme,
4
+ ElementColors,
5
+ RelationshipColors,
6
+ } from './colors'
7
+
8
+ export {
9
+ invariant,
10
+ nonexhaustive,
11
+ nonNullable,
12
+ } from './errors'
13
+
14
+ export {
15
+ type AnyAux,
16
+ type Aux,
17
+ LikeC4DeploymentModel,
18
+ LikeC4Model,
19
+ LikeC4ViewModel,
20
+ } from './model'
7
21
 
8
22
  export * from './types'
9
- export * from './utils/common-head'
10
- export * from './utils/compare-natural'
11
- export * from './utils/fqn'
12
- export * from './utils/getOrCreate'
13
- export * from './utils/guards'
14
- export * from './utils/object-hash'
15
- export * from './utils/promises'
16
- export { compareRelations } from './utils/relations'
17
- export * from './utils/set'
18
- export * from './utils/string-hash'
23
+
24
+ export * from './utils'
19
25
 
20
26
  export * as Expr from './types/expression'