@likec4/core 1.40.0 → 1.42.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 (257) hide show
  1. package/builder/package.json +4 -0
  2. package/compute-view/package.json +4 -0
  3. package/compute-view/relationships/package.json +4 -0
  4. package/dist/builder/index.d.mts +83 -20
  5. package/dist/builder/index.mjs +210 -126
  6. package/dist/compute-view/index.d.mts +8 -7
  7. package/dist/compute-view/index.mjs +14 -11
  8. package/dist/compute-view/relationships-view/index.d.mts +9 -8
  9. package/dist/compute-view/relationships-view/index.mjs +6 -6
  10. package/dist/index.d.mts +7 -7
  11. package/dist/index.mjs +12 -12
  12. package/dist/model/connection/deployment/index.d.mts +11 -10
  13. package/dist/model/connection/deployment/index.mjs +2 -2
  14. package/dist/model/connection/index.d.mts +12 -11
  15. package/dist/model/connection/index.mjs +3 -3
  16. package/dist/model/connection/model/index.d.mts +11 -10
  17. package/dist/model/connection/model/index.mjs +2 -2
  18. package/dist/model/index.d.mts +14 -14
  19. package/dist/model/index.mjs +4 -5
  20. package/dist/shared/{core.DHQ32OHa.mjs → core.01VTr9qu.mjs} +10 -29
  21. package/dist/shared/core.1vX5a9AY.mjs +86 -0
  22. package/dist/shared/{core.BVNaR17u.mjs → core.B7KhhkRY.mjs} +1 -1
  23. package/dist/shared/core.B85MJLTf.mjs +5 -0
  24. package/dist/shared/{core.BIAlzwKc.mjs → core.BIqHjQiH.mjs} +85 -45
  25. package/dist/shared/core.BKlholso.mjs +3 -0
  26. package/dist/shared/core.BR4zXDH-.mjs +13 -0
  27. package/dist/shared/{core.yHe79zEl.mjs → core.BYNkXQ8A.mjs} +21 -12
  28. package/dist/shared/core.BazD6cot.mjs +14 -0
  29. package/dist/shared/{core.BuoXfSMj.mjs → core.BbE4y-yl.mjs} +1 -1
  30. package/dist/shared/core.BoYfZOBm.mjs +3 -0
  31. package/dist/shared/core.BsSXS-_R.mjs +7 -0
  32. package/dist/shared/{core.T-eLZTW_.mjs → core.BzTakU3I.mjs} +15 -7
  33. package/dist/shared/{core.4u1dVmfX.mjs → core.C2TiyjI6.mjs} +2 -2
  34. package/dist/shared/{core.DLpidoWc.mjs → core.C3JowhaZ.mjs} +3 -3
  35. package/dist/shared/{core.CNGyqkJh.mjs → core.C4x8aaWa.mjs} +3 -1
  36. package/dist/shared/{core.BB6zA-UU.mjs → core.C8YY6Uub.mjs} +38 -9
  37. package/dist/shared/{core.FPITT8Vx.mjs → core.C8sl5Y8Z.mjs} +144 -61
  38. package/dist/shared/{core.DuR3R-xJ.mjs → core.CNgZvKb8.mjs} +3 -5176
  39. package/dist/shared/{core.BbThmf6M.d.mts → core.CQngdcuj.d.mts} +85 -4
  40. package/dist/shared/{core.Be1n9a0i.mjs → core.C_Ni6yHl.mjs} +5 -4
  41. package/dist/shared/core.CbT8JVYL.mjs +5 -0
  42. package/dist/shared/core.CqAJJpK_.mjs +3 -0
  43. package/dist/shared/{core.CySf-2gP.d.mts → core.D0PjZzIS.d.mts} +52 -15
  44. package/dist/shared/{core.DrvfVXkh.d.mts → core.D5fzJWbF.d.mts} +11 -2
  45. package/dist/shared/{core.DrVOJuxX.d.mts → core.DACpKp35.d.mts} +5 -5
  46. package/dist/shared/core.DFi2dOTl.mjs +39548 -0
  47. package/dist/shared/{core.D704WZES.d.mts → core.DIol3syK.d.mts} +2 -2
  48. package/dist/shared/{core.DlG1xWt2.mjs → core.DMMOWQqc.mjs} +3 -2
  49. package/dist/shared/core.DNbUPnve.mjs +3990 -0
  50. package/dist/shared/{core.CCD1ID81.mjs → core.DRJma0Ol.mjs} +4 -3
  51. package/dist/shared/{core.DgttqsJc.mjs → core.DRhg-gVU.mjs} +9 -9
  52. package/dist/shared/core.DSO_rTC2.mjs +5322 -0
  53. package/dist/shared/{core.vWJTxpLV.d.mts → core.D_vkffV4.d.mts} +4 -2
  54. package/dist/shared/core.DdMJk7nx.d.mts +476 -0
  55. package/dist/shared/{core.D_fI5Lf6.d.mts → core.Dgs6-nuz.d.mts} +24 -4
  56. package/dist/shared/{core.Be4Jy9Qx.mjs → core.FZ305VYd.mjs} +2 -2
  57. package/dist/shared/core.OHD4KXm9.mjs +5 -0
  58. package/dist/shared/{core.GTgsmXS_.mjs → core.QJD_fcrc.mjs} +2 -2
  59. package/dist/shared/core.RfnaEmgA.mjs +7 -0
  60. package/dist/shared/core.fHR_8Tnq.d.mts +450 -0
  61. package/dist/shared/{core.D0EgVMQK.mjs → core.lRvxPoao.mjs} +14 -12
  62. package/dist/shared/{core.CaT0SUUK.mjs → core.rCeaAqgW.mjs} +1 -84
  63. package/dist/shared/{core.kxeJe0OY.d.mts → core.s9uwOt60.d.mts} +4 -4
  64. package/dist/shared/core.yna0OdV5.d.mts +98 -0
  65. package/dist/styles/index.d.mts +106 -0
  66. package/dist/styles/index.mjs +1 -0
  67. package/dist/types/_aux.d.mts +2 -2
  68. package/dist/types/_aux.mjs +1 -5
  69. package/dist/types/expression-model.d.mts +3 -4
  70. package/dist/types/expression.d.mts +3 -4
  71. package/dist/types/fqnRef.d.mts +2 -2
  72. package/dist/types/fqnRef.mjs +3 -3
  73. package/dist/types/index.d.mts +8 -8
  74. package/dist/types/index.mjs +151 -6
  75. package/dist/types/scalar.mjs +3 -2
  76. package/dist/utils/graphology/index.d.mts +1864 -0
  77. package/dist/utils/graphology/index.mjs +1 -0
  78. package/dist/utils/index.d.mts +11 -6
  79. package/dist/utils/index.mjs +21 -37
  80. package/dist/utils/iterable/index.d.mts +1 -1
  81. package/dist/utils/iterable/index.mjs +45 -7
  82. package/model/package.json +4 -0
  83. package/package.json +42 -24
  84. package/styles/package.json +4 -0
  85. package/types/package.json +4 -0
  86. package/utils/graphology/package.json +4 -0
  87. package/utils/package.json +4 -0
  88. package/dist/shared/core.6_Vp2iiN.mjs +0 -172
  89. package/dist/shared/core.Bpou6c2f.d.mts +0 -850
  90. package/dist/shared/core.CUw_2J9j.mjs +0 -47
  91. package/dist/shared/core.CzdwsPmY.d.mts +0 -69
  92. package/dist/shared/core.DoM6aM9N.mjs +0 -7
  93. package/dist/shared/core.ILwny7BV.mjs +0 -38
  94. package/dist/theme/index.d.mts +0 -11
  95. package/dist/theme/index.mjs +0 -232
  96. package/src/builder/Builder.deployment.ts +0 -224
  97. package/src/builder/Builder.deploymentModel.ts +0 -449
  98. package/src/builder/Builder.element.ts +0 -241
  99. package/src/builder/Builder.model.ts +0 -494
  100. package/src/builder/Builder.ts +0 -870
  101. package/src/builder/Builder.view-common.ts +0 -273
  102. package/src/builder/Builder.view-deployment.ts +0 -135
  103. package/src/builder/Builder.view-element.ts +0 -202
  104. package/src/builder/Builder.views.ts +0 -399
  105. package/src/builder/Builder.with.ts +0 -156
  106. package/src/builder/_types.ts +0 -320
  107. package/src/builder/index.ts +0 -11
  108. package/src/compute-view/compute-view.ts +0 -80
  109. package/src/compute-view/deployment-view/_types.ts +0 -38
  110. package/src/compute-view/deployment-view/clean-connections.ts +0 -236
  111. package/src/compute-view/deployment-view/compute.ts +0 -94
  112. package/src/compute-view/deployment-view/memory/index.ts +0 -9
  113. package/src/compute-view/deployment-view/memory/memory.ts +0 -96
  114. package/src/compute-view/deployment-view/predicates/deploymentRefs-where.ts +0 -18
  115. package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +0 -154
  116. package/src/compute-view/deployment-view/predicates/index.ts +0 -8
  117. package/src/compute-view/deployment-view/predicates/relation-direct.ts +0 -243
  118. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +0 -70
  119. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +0 -101
  120. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +0 -95
  121. package/src/compute-view/deployment-view/predicates/relation-where.ts +0 -18
  122. package/src/compute-view/deployment-view/predicates/utils.ts +0 -282
  123. package/src/compute-view/deployment-view/predicates/wildcard.ts +0 -41
  124. package/src/compute-view/deployment-view/stages/stage-exclude.ts +0 -5
  125. package/src/compute-view/deployment-view/stages/stage-final.ts +0 -245
  126. package/src/compute-view/deployment-view/stages/stage-include.ts +0 -95
  127. package/src/compute-view/deployment-view/utils.ts +0 -286
  128. package/src/compute-view/dynamic-view/compute.ts +0 -312
  129. package/src/compute-view/element-view/_types.ts +0 -47
  130. package/src/compute-view/element-view/clean-connections.ts +0 -117
  131. package/src/compute-view/element-view/compute.ts +0 -324
  132. package/src/compute-view/element-view/memory/NodeGroup.ts +0 -31
  133. package/src/compute-view/element-view/memory/index.ts +0 -10
  134. package/src/compute-view/element-view/memory/memory.ts +0 -178
  135. package/src/compute-view/element-view/memory/stage-exclude.ts +0 -59
  136. package/src/compute-view/element-view/memory/stage-final.ts +0 -129
  137. package/src/compute-view/element-view/memory/stage-include.ts +0 -130
  138. package/src/compute-view/element-view/predicates/_utils.ts +0 -91
  139. package/src/compute-view/element-view/predicates/element-expand.ts +0 -29
  140. package/src/compute-view/element-view/predicates/element-kind-tag.ts +0 -27
  141. package/src/compute-view/element-view/predicates/element-ref.ts +0 -24
  142. package/src/compute-view/element-view/predicates/relation-direct.ts +0 -321
  143. package/src/compute-view/element-view/predicates/relation-in-out.ts +0 -64
  144. package/src/compute-view/element-view/predicates/relation-in.ts +0 -115
  145. package/src/compute-view/element-view/predicates/relation-out.ts +0 -119
  146. package/src/compute-view/element-view/predicates/wildcard.ts +0 -88
  147. package/src/compute-view/element-view/utils.ts +0 -65
  148. package/src/compute-view/index.ts +0 -4
  149. package/src/compute-view/memory/AbstractMemory.ts +0 -45
  150. package/src/compute-view/memory/AbstractStageExclude.ts +0 -215
  151. package/src/compute-view/memory/AbstractStageInclude.ts +0 -200
  152. package/src/compute-view/memory/_types.ts +0 -148
  153. package/src/compute-view/memory/index.ts +0 -5
  154. package/src/compute-view/memory/ops.ts +0 -43
  155. package/src/compute-view/relationships-view/_types.ts +0 -16
  156. package/src/compute-view/relationships-view/compute.ts +0 -159
  157. package/src/compute-view/relationships-view/index.ts +0 -3
  158. package/src/compute-view/relationships-view/layout.ts +0 -357
  159. package/src/compute-view/relationships-view/utils.ts +0 -73
  160. package/src/compute-view/utils/ancestorsOfNode.ts +0 -19
  161. package/src/compute-view/utils/applyCustomElementProperties.ts +0 -107
  162. package/src/compute-view/utils/applyCustomRelationProperties.ts +0 -58
  163. package/src/compute-view/utils/applyViewRuleStyles.ts +0 -73
  164. package/src/compute-view/utils/buildComputedNodes.ts +0 -153
  165. package/src/compute-view/utils/buildElementNotations.ts +0 -63
  166. package/src/compute-view/utils/elementExpressionToPredicate.ts +0 -50
  167. package/src/compute-view/utils/link-nodes-with-edges.ts +0 -56
  168. package/src/compute-view/utils/merge-props-from-relationships.ts +0 -161
  169. package/src/compute-view/utils/relationExpressionToPredicates.ts +0 -55
  170. package/src/compute-view/utils/resolve-extended-views.ts +0 -85
  171. package/src/compute-view/utils/resolve-global-rules.ts +0 -88
  172. package/src/compute-view/utils/topological-sort.ts +0 -256
  173. package/src/compute-view/utils/view-hash.ts +0 -45
  174. package/src/compute-view/utils/with-readable-edges.ts +0 -40
  175. package/src/index.ts +0 -32
  176. package/src/model/DeploymentElementModel.ts +0 -682
  177. package/src/model/DeploymentModel.ts +0 -393
  178. package/src/model/ElementModel.ts +0 -293
  179. package/src/model/LikeC4Model.ts +0 -882
  180. package/src/model/RelationModel.ts +0 -152
  181. package/src/model/connection/Connection.ts +0 -72
  182. package/src/model/connection/deployment/DeploymentConnectionModel.ts +0 -185
  183. package/src/model/connection/deployment/find.ts +0 -120
  184. package/src/model/connection/deployment/index.ts +0 -8
  185. package/src/model/connection/index.ts +0 -22
  186. package/src/model/connection/model/ConnectionModel.ts +0 -158
  187. package/src/model/connection/model/find.ts +0 -117
  188. package/src/model/connection/model/index.ts +0 -8
  189. package/src/model/connection/ops.ts +0 -276
  190. package/src/model/guards.ts +0 -77
  191. package/src/model/index.ts +0 -72
  192. package/src/model/types.ts +0 -67
  193. package/src/model/utils.ts +0 -66
  194. package/src/model/view/EdgeModel.ts +0 -120
  195. package/src/model/view/LikeC4ViewModel.ts +0 -361
  196. package/src/model/view/LikeC4ViewsFolder.ts +0 -151
  197. package/src/model/view/NodeModel.ts +0 -247
  198. package/src/theme/element.ts +0 -61
  199. package/src/theme/index.ts +0 -127
  200. package/src/theme/relationships.ts +0 -54
  201. package/src/types/RichText.ts +0 -206
  202. package/src/types/_aux.ts +0 -291
  203. package/src/types/_common.ts +0 -80
  204. package/src/types/const.ts +0 -34
  205. package/src/types/expression-model.ts +0 -294
  206. package/src/types/expression.ts +0 -313
  207. package/src/types/fqnRef.ts +0 -91
  208. package/src/types/geometry.ts +0 -159
  209. package/src/types/global.ts +0 -21
  210. package/src/types/index.ts +0 -42
  211. package/src/types/model-data.ts +0 -77
  212. package/src/types/model-deployment.ts +0 -88
  213. package/src/types/model-dump.ts +0 -79
  214. package/src/types/model-logical.ts +0 -135
  215. package/src/types/model-spec.ts +0 -85
  216. package/src/types/operators.ts +0 -156
  217. package/src/types/project.ts +0 -14
  218. package/src/types/scalar.ts +0 -162
  219. package/src/types/styles.ts +0 -122
  220. package/src/types/view-changes.ts +0 -32
  221. package/src/types/view-common.ts +0 -157
  222. package/src/types/view-computed.ts +0 -118
  223. package/src/types/view-layouted.ts +0 -98
  224. package/src/types/view-parsed.deployment.ts +0 -39
  225. package/src/types/view-parsed.dynamic.ts +0 -89
  226. package/src/types/view-parsed.element.ts +0 -65
  227. package/src/types/view.ts +0 -113
  228. package/src/utils/common-head.ts +0 -22
  229. package/src/utils/compare-natural.ts +0 -60
  230. package/src/utils/const.ts +0 -1
  231. package/src/utils/fqn.ts +0 -302
  232. package/src/utils/getOrCreate.ts +0 -8
  233. package/src/utils/guards.ts +0 -9
  234. package/src/utils/index.ts +0 -68
  235. package/src/utils/invariant.ts +0 -29
  236. package/src/utils/iterable/_types.ts +0 -5
  237. package/src/utils/iterable/filter.ts +0 -55
  238. package/src/utils/iterable/find.ts +0 -38
  239. package/src/utils/iterable/first.ts +0 -48
  240. package/src/utils/iterable/flat.ts +0 -17
  241. package/src/utils/iterable/head.ts +0 -22
  242. package/src/utils/iterable/index.ts +0 -15
  243. package/src/utils/iterable/map.ts +0 -40
  244. package/src/utils/iterable/reduce.ts +0 -24
  245. package/src/utils/iterable/some.ts +0 -36
  246. package/src/utils/iterable/to.ts +0 -19
  247. package/src/utils/iterable/unique.ts +0 -23
  248. package/src/utils/markdown/index.ts +0 -2
  249. package/src/utils/markdown/to-html.ts +0 -32
  250. package/src/utils/markdown/to-text.ts +0 -14
  251. package/src/utils/memoize-prop.ts +0 -30
  252. package/src/utils/mnemonist.ts +0 -9
  253. package/src/utils/object-hash.ts +0 -14
  254. package/src/utils/promises.ts +0 -24
  255. package/src/utils/relations.ts +0 -36
  256. package/src/utils/set.ts +0 -83
  257. package/src/utils/string-hash.ts +0 -16
@@ -1,245 +0,0 @@
1
- import { forEach, only, pipe } from 'remeda'
2
- import { differenceConnections } from '../../../model'
3
- import type { RelationshipModel } from '../../../model'
4
- import { isAncestor, sortByFqnHierarchically } from '../../../utils/fqn'
5
- import { ifilter, isome, toArray } from '../../../utils/iterable'
6
- import { DefaultMap } from '../../../utils/mnemonist'
7
- import { difference, union } from '../../../utils/set'
8
- import { treeFromMemoryState } from '../../memory'
9
- import { cleanCrossBoundary, cleanRedundantRelationships } from '../clean-connections'
10
- import type { Ctx, Memory } from '../memory'
11
-
12
- type Elem = Ctx['Element']
13
- /**
14
- * This patch:
15
- * 1. Keeps connections between leafs or having direct deployment relations
16
- * 2. Removes cross-boundary model relations, that already exist inside boundaries
17
- * (e.g. prefer relations inside same deployment node over relations between nodes)
18
- * 3. Removes implicit connections between elements, if their descendants have same connection
19
- */
20
- export class StageFinal {
21
- static for(memory: Memory) {
22
- return new StageFinal(memory)
23
- }
24
-
25
- private constructor(
26
- protected readonly memory: Memory,
27
- ) {
28
- }
29
-
30
- public step1CleanConnections(memory: Memory): Memory {
31
- if (memory.connections.length < 2) {
32
- return memory
33
- }
34
-
35
- // const leafs = new Set<Elem>()
36
-
37
- // for (const element of memory.final) {
38
- // // Instance is always leaf
39
- // if (element.isInstance()) {
40
- // leafs.add(element)
41
- // continue
42
- // }
43
- // // Check if element is ancestor of any element in elements
44
- // let isLeaf = true
45
- // for (const el of memory.final) {
46
- // if (isAncestor(element.id, el.id)) {
47
- // isLeaf = false
48
- // break
49
- // }
50
- // }
51
- // if (isLeaf) {
52
- // leafs.add(element)
53
- // }
54
- // }
55
-
56
- const connections = pipe(
57
- memory.connections,
58
- // Keep connections
59
- // - between leafs
60
- // - has direct deployment relation
61
- // filter(c => {
62
- // return (leafs.has(c.source) && leafs.has(c.target)) || c.hasDirectDeploymentRelation()
63
- // }),
64
- cleanCrossBoundary,
65
- cleanRedundantRelationships,
66
- )
67
-
68
- const connectionsToExclude = differenceConnections(
69
- memory.connections,
70
- connections,
71
- )
72
- if (connectionsToExclude.length === 0) {
73
- return memory
74
- }
75
- const stage = memory.stageExclude({} as any)
76
- stage.excludeConnections(connectionsToExclude, true)
77
- return stage.commit()
78
- }
79
-
80
- public step2ProcessImplicits(memory: Memory): Memory {
81
- const implicits = union(this.memory.elements, memory.elements)
82
- const final = union(memory.final, this.memory.explicits)
83
-
84
- // Find connections based on same relation but different boundaries
85
- const groupedByRelation = new DefaultMap<RelationshipModel, Set<Elem>>(() => new Set())
86
- for (const conn of memory.connections) {
87
- if (conn.boundary) {
88
- for (const relation of conn.relations.model) {
89
- groupedByRelation.get(relation).add(conn.boundary)
90
- }
91
- }
92
- }
93
- for (const [_, boundaries] of groupedByRelation) {
94
- if (boundaries.size < 2) {
95
- continue
96
- }
97
- for (const boundary of boundaries) {
98
- if (implicits.delete(boundary)) {
99
- final.add(boundary)
100
- }
101
- }
102
- }
103
-
104
- const snapshot = new Set(final)
105
- const isFinalOrHasIncludedDescendant = (el: Elem) => {
106
- for (const final of snapshot) {
107
- if (el === final || isAncestor(el, final)) {
108
- return true
109
- }
110
- }
111
- return false
112
- }
113
-
114
- // Pick from implicit elements
115
- pipe(
116
- difference(implicits, snapshot),
117
- ifilter(e => e.isDeploymentNode()),
118
- toArray(),
119
- sortByFqnHierarchically,
120
- forEach((el) => {
121
- // If element has more 2 or more children included
122
- // It can "box" around
123
- const childrensToWrap = [...el.children()].filter(isFinalOrHasIncludedDescendant).length
124
- if (childrensToWrap >= 2) {
125
- final.add(el)
126
- return
127
- }
128
- // If Element has only one child included
129
- // and has "similar" sibling with included descendant
130
- if (childrensToWrap === 1 && isome(el.siblings(), isFinalOrHasIncludedDescendant)) {
131
- final.add(el)
132
- }
133
- }),
134
- )
135
-
136
- return memory.update({ final })
137
- }
138
-
139
- public step3ProcessBoundaries(memory: Memory): Memory {
140
- const boundaries = new Set<Elem>()
141
- for (const conn of memory.connections) {
142
- if (conn.boundary) {
143
- boundaries.add(conn.boundary)
144
- }
145
- }
146
- const tree = treeFromMemoryState<Ctx>(memory, 'final')
147
- const stage = memory.stageExclude({} as any)
148
-
149
- const isRemovable = (el: Elem) =>
150
- !(
151
- boundaries.has(el)
152
- || memory.explicits.has(el)
153
- || tree.hasInOut(el)
154
- || tree.root.has(el)
155
- )
156
-
157
- const singleRoot = only([...tree.root])
158
- if (singleRoot && !memory.explicits.has(singleRoot)) {
159
- stage.exclude(singleRoot)
160
- }
161
-
162
- for (const el of memory.final) {
163
- const singleChild = only(tree.children(el))
164
- if (singleChild && !tree.hasInOut(singleChild) && isRemovable(el)) {
165
- stage.exclude(el)
166
- }
167
- }
168
-
169
- if (stage.isDirty()) {
170
- return stage.commit()
171
- }
172
- return memory
173
- }
174
-
175
- // TODO: Lot of corner cases to cover, skip for now
176
- // public step3FlatNodes(memory: Memory): Memory {
177
- // // final implicits
178
- // const explicits = new Set<Elem>([
179
- // ...memory.explicits,
180
- // ...memory.connections.flatMap(c => [c.source, c.target]),
181
- // ])
182
- // const sorted = sortParentsFirst(toArray(memory.final))
183
-
184
- // const toplevel = new Set<Elem>(sorted)
185
- // const children = sorted.reduce((acc, el, index, all) => {
186
- // acc.set(
187
- // el,
188
- // new Set(
189
- // all
190
- // .slice(index + 1)
191
- // .filter(e => isAncestor(el, e))
192
- // .reduce((acc, el) => {
193
- // if (!acc.some(e => isAncestor(e, el))) {
194
- // toplevel.delete(el)
195
- // acc.push(el)
196
- // }
197
- // return acc
198
- // }, [] as Elem[]),
199
- // ),
200
- // )
201
- // return acc
202
- // }, new DefaultMap<Elem, Set<Elem>>(() => new Set()))
203
-
204
- // const state = memory.mutableState()
205
-
206
- // function flattenNode(node: Elem) {
207
- // const _children = [...children.get(node)]
208
- // if (_children.length > 1) {
209
- // for (const child of _children) {
210
- // flattenNode(child)
211
- // }
212
- // return !explicits.has(node)
213
- // }
214
- // if (hasAtLeast(_children, 1)) {
215
- // if (flattenNode(_children[0])) {
216
- // state.final.delete(_children[0])
217
- // }
218
- // }
219
- // return !explicits.has(node)
220
- // }
221
-
222
- // const root = [...toplevel]
223
- // for (const node of root) {
224
- // flattenNode(node)
225
- // if (!explicits.has(node) && children.get(node).size === 1) {
226
- // state.final.delete(node)
227
- // }
228
- // }
229
- // if (root.length === 1 && !explicits.has(root[0]!)) {
230
- // state.final.delete(root[0]!)
231
- // }
232
-
233
- // return memory.update(state)
234
- // }
235
-
236
- public commit(): Memory {
237
- // return []
238
- const step1 = this.step1CleanConnections(this.memory)
239
- const step2 = this.step2ProcessImplicits(step1)
240
- return this.step3ProcessBoundaries(step2)
241
- // return step2memory
242
- // const step3m?emory = this.step3FlatNodes(step2memory)
243
- // return step3memory
244
- }
245
- }
@@ -1,95 +0,0 @@
1
- import { dropWhile, forEach, pipe, take, zip } from 'remeda'
2
- import { isIterable } from '../../../utils'
3
- import { toArray } from '../../../utils/iterable'
4
- import { type CtxConnection, type CtxElement, AbstractStageInclude } from '../../memory'
5
- import { cleanCrossBoundary, cleanRedundantRelationships } from '../clean-connections'
6
- import { type Ctx } from '../memory/memory'
7
- import { findConnection, findConnectionsBetween } from '../utils'
8
-
9
- type Elem = CtxElement<Ctx>
10
- type Connection = CtxConnection<Ctx>
11
-
12
- export class StageInclude extends AbstractStageInclude<Ctx> {
13
- /**
14
- * Connects elements with existing ones in the memory
15
- */
16
- public override connectWithExisting(
17
- elements: Elem | Iterable<Elem>,
18
- direction: 'in' | 'out' | 'both' = 'both',
19
- ): boolean {
20
- const before = this._connections.length
21
- const hasChanged = () => this._connections.length > before
22
- if (!isIterable(elements)) {
23
- if (direction === 'in' || direction === 'both') {
24
- for (const el of this.memory.elements) {
25
- this.addConnections(
26
- findConnection(el, elements, 'directed'),
27
- )
28
- }
29
- }
30
- if (direction === 'out' || direction === 'both') {
31
- this.addConnections(
32
- findConnectionsBetween(elements, this.memory.elements, 'directed'),
33
- )
34
- }
35
- return hasChanged()
36
- }
37
-
38
- const targets = [...elements]
39
- if (direction === 'in' || direction === 'both') {
40
- for (const el of this.memory.elements) {
41
- this.addConnections(
42
- findConnectionsBetween(el, targets, 'directed'),
43
- )
44
- }
45
- }
46
- if (direction === 'out' || direction === 'both') {
47
- for (const el of targets) {
48
- this.addConnections(
49
- findConnectionsBetween(el, this.memory.elements, 'directed'),
50
- )
51
- }
52
- }
53
- return hasChanged()
54
- }
55
-
56
- protected override processConnections(connections: Connection[]) {
57
- const clean = pipe(
58
- connections,
59
- cleanCrossBoundary,
60
- cleanRedundantRelationships,
61
- )
62
-
63
- pipe(
64
- clean,
65
- // Process only connection from this stage
66
- // filter(c => this._connections.some(c2 => c2.id === c.id)),
67
- forEach(({ source, target, boundary }) => {
68
- pipe(
69
- zip(
70
- [...toArray(source.ancestors()).reverse(), source],
71
- [...toArray(target.ancestors()).reverse(), target],
72
- ),
73
- // Filter out common ancestors
74
- dropWhile(([sourceAncestor, targetAncestor]) => sourceAncestor === targetAncestor),
75
- take(1),
76
- forEach(([sourceAncestor, targetAncestor]) => {
77
- if (source === sourceAncestor && target === targetAncestor) {
78
- this.addImplicit(boundary)
79
- return
80
- }
81
- if (sourceAncestor !== source && sourceAncestor.isDeploymentNode() && !sourceAncestor.onlyOneInstance()) {
82
- // state.final.add(source)
83
- this.addImplicit(sourceAncestor)
84
- }
85
- if (targetAncestor !== target && targetAncestor.isDeploymentNode() && !targetAncestor.onlyOneInstance()) {
86
- // state.final.add(source)
87
- this.addImplicit(targetAncestor)
88
- }
89
- }),
90
- )
91
- }),
92
- )
93
- return clean
94
- }
95
- }
@@ -1,286 +0,0 @@
1
- import { hasAtLeast, isEmpty, unique } from 'remeda'
2
- import type {
3
- DeployedInstanceModel,
4
- DeploymentConnectionModel,
5
- DeploymentElementModel,
6
- DeploymentNodeModel,
7
- ElementModel,
8
- LikeC4DeploymentModel,
9
- } from '../../model'
10
- import { deploymentConnection } from '../../model'
11
- import {
12
- type AnyAux,
13
- type aux,
14
- type ComputedEdge,
15
- type ComputedNode,
16
- type DeploymentViewRule,
17
- type scalar,
18
- type Unknown,
19
- DefaultArrowType,
20
- FqnExpr,
21
- isViewRuleStyle,
22
- } from '../../types'
23
- import { invariant, nameFromFqn, nonexhaustive, parentFqn } from '../../utils'
24
- import { applyViewRuleStyle } from '../utils/applyViewRuleStyles'
25
- import { type ComputedNodeSource, buildComputedNodes } from '../utils/buildComputedNodes'
26
- import { mergePropsFromRelationships } from '../utils/merge-props-from-relationships'
27
- import type { Memory } from './_types'
28
-
29
- export const { findConnection, findConnectionsBetween, findConnectionsWithin } = deploymentConnection
30
-
31
- type Predicate<T> = (x: T) => boolean
32
-
33
- export function resolveElements<A extends AnyAux>(
34
- model: LikeC4DeploymentModel<A>,
35
- expr: FqnExpr.DeploymentRef<A>,
36
- ): DeploymentElementModel<A>[] {
37
- const ref = model.element(expr.ref.deployment)
38
- if (ref.isDeploymentNode()) {
39
- if (expr.selector === 'children') {
40
- return [...ref.children()]
41
- }
42
- if (expr.selector === 'expanded') {
43
- return [ref, ...ref.children()]
44
- }
45
- if (expr.selector === 'descendants') {
46
- return [...ref.descendants()]
47
- }
48
- }
49
- return [ref]
50
- }
51
-
52
- export function resolveModelElements<A extends AnyAux>(
53
- model: LikeC4DeploymentModel<A>,
54
- expr: FqnExpr.ModelRef<A>,
55
- ): ElementModel<A>[] {
56
- const ref = model.$model.element(expr.ref.model)
57
- if (expr.selector === 'children') {
58
- return [...ref.children()]
59
- }
60
- if (expr.selector === 'expanded') {
61
- return [ref, ...ref.children()]
62
- }
63
- if (expr.selector === 'descendants') {
64
- return [...ref.descendants()]
65
- }
66
- return [ref]
67
- }
68
-
69
- export function deploymentExpressionToPredicate<
70
- A extends AnyAux,
71
- N extends { id: string | aux.DeploymentFqn<A>; modelRef?: aux.Fqn<A> | undefined },
72
- >(
73
- target: FqnExpr<A>,
74
- ): Predicate<N> {
75
- if (FqnExpr.isWildcard(target)) {
76
- return () => true
77
- }
78
- if (FqnExpr.isElementTagExpr(target) || FqnExpr.isElementKindExpr(target)) {
79
- throw new Error('element kind and tag expressions are not supported in deployment view rules')
80
- }
81
- if (FqnExpr.isDeploymentRef(target)) {
82
- const fqn = target.ref.deployment
83
- if (target.selector === 'expanded') {
84
- const fqnWithDot = fqn + '.'
85
- return n => n.id === fqn || n.id.startsWith(fqnWithDot)
86
- }
87
- if (target.selector === 'descendants') {
88
- const fqnWithDot = fqn + '.'
89
- return n => n.id.startsWith(fqnWithDot)
90
- }
91
- if (target.selector === 'children') {
92
- return n => parentFqn(n.id) === fqn
93
- }
94
- return n => n.id === fqn
95
- }
96
- if (FqnExpr.isModelRef(target)) {
97
- const fqn = target.ref.model
98
- if (target.selector === 'expanded') {
99
- const fqnWithDot = fqn + '.'
100
- return (n: N) => {
101
- const m = n.modelRef ?? null
102
- if (!m) {
103
- return true
104
- }
105
- return m === fqn || m.startsWith(fqnWithDot)
106
- }
107
- }
108
- if (target.selector === 'descendants') {
109
- const fqnWithDot = fqn + '.'
110
- return (n: N) => {
111
- const m = n.modelRef ?? null
112
- if (!m) {
113
- return true
114
- }
115
- return m.startsWith(fqnWithDot)
116
- }
117
- }
118
- if (target.selector === 'children') {
119
- return (n: N) => {
120
- const m = n.modelRef ?? null
121
- if (!m) {
122
- return true
123
- }
124
- return parentFqn(m) === fqn
125
- }
126
- }
127
- return (n: N) => {
128
- const m = n.modelRef ?? null
129
- if (!m) {
130
- return true
131
- }
132
- return m === fqn
133
- }
134
- }
135
- nonexhaustive(target)
136
- }
137
-
138
- export function toNodeSource<A extends AnyAux>(
139
- el: DeploymentNodeModel<A> | DeployedInstanceModel<A>,
140
- ): ComputedNodeSource<A> {
141
- if (el.isDeploymentNode()) {
142
- const onlyOneInstance = el.onlyOneInstance()
143
- let { title, kind, id, description, ...$node } = el.$node
144
- const { icon, color, shape, ...style } = el.$node.style ?? {}
145
- let tags = [...el.tags]
146
- // let description
147
- // If there is only one instance
148
- if (onlyOneInstance) {
149
- tags = unique([...tags, ...onlyOneInstance.tags])
150
- // If title was not overriden, take title from the instance
151
- if (title === nameFromFqn(el.id)) {
152
- title = onlyOneInstance.title
153
- }
154
- description = onlyOneInstance.description.$source ?? description
155
- }
156
-
157
- return {
158
- ...(onlyOneInstance && {
159
- ...toNodeSource(onlyOneInstance),
160
- modelRef: onlyOneInstance.element.id,
161
- }),
162
- title,
163
- ...$node,
164
- ...(icon && { icon }),
165
- ...(color && { color }),
166
- ...(shape && { shape }),
167
- ...(description && { description }),
168
- tags,
169
- style: {
170
- ...style,
171
- },
172
- deploymentRef: id,
173
- kind,
174
- id: id as scalar.NodeId,
175
- }
176
- }
177
- invariant(el.isInstance(), 'Expected Instance')
178
- const instance = el.$instance
179
- const element = el.element
180
- const { icon, color, shape, ...style } = el.style
181
-
182
- const links = [
183
- ...element.links,
184
- ...(instance.links ?? []),
185
- ]
186
-
187
- const metadata = {
188
- ...element.getMetadata(),
189
- ...instance.metadata,
190
- }
191
-
192
- const notation = instance.notation ?? element.$element.notation
193
-
194
- let description = el.description.$source
195
- let technology = instance.technology ?? element.technology
196
-
197
- return {
198
- id: el.id as scalar.NodeId,
199
- kind: 'instance' as unknown as aux.DeploymentKind<A>,
200
- title: el.title,
201
- ...(description && { description }),
202
- ...(technology && { technology }),
203
- tags: [...el.tags],
204
- links: hasAtLeast(links, 1) ? links : null,
205
- ...icon && { icon },
206
- ...color && { color },
207
- ...shape && { shape },
208
- style,
209
- deploymentRef: instance.id,
210
- modelRef: element.id,
211
- ...notation && { notation },
212
- ...!isEmpty(metadata) && ({ metadata }),
213
- }
214
- }
215
-
216
- export function toComputedEdges<A extends AnyAux>(
217
- connections: ReadonlyArray<DeploymentConnectionModel<A>>,
218
- ): ComputedEdge<A>[] {
219
- return connections.reduce((acc, e) => {
220
- // const modelRelations = []
221
- // const deploymentRelations = []
222
- const relations = [
223
- ...e.relations.model,
224
- ...e.relations.deployment,
225
- ]
226
- invariant(hasAtLeast(relations, 1), 'Edge must have at least one relation')
227
-
228
- const source = e.source.id as scalar.NodeId
229
- const target = e.target.id as scalar.NodeId
230
-
231
- const {
232
- title,
233
- ...props
234
- } = mergePropsFromRelationships(relations.map(r => r.$relationship)) // || relations.find(r => r.source === source && r.target === target)
235
-
236
- const edge: ComputedEdge<A> = {
237
- id: e.id,
238
- parent: e.boundary?.id as scalar.NodeId ?? null,
239
- source,
240
- target,
241
- label: title ?? null,
242
- relations: relations.map((r) => r.id),
243
- ...props,
244
- }
245
-
246
- // If exists same edge but in opposite direction
247
- const existing = acc.find(e => e.source === target && e.target === source)
248
- if (existing && edge.label === existing.label) {
249
- existing.dir = 'both'
250
- const head = existing.head ?? edge.head ?? DefaultArrowType
251
- existing.head ??= head
252
- existing.tail ??= head
253
-
254
- if (edge.color) {
255
- existing.color ??= edge.color
256
- }
257
- if (edge.line) {
258
- existing.line ??= edge.line
259
- }
260
- return acc
261
- }
262
-
263
- acc.push(edge)
264
- return acc
265
- }, [] as ComputedEdge<A>[])
266
- }
267
-
268
- export function buildNodes<A extends AnyAux = Unknown>(
269
- memory: Memory,
270
- ): ReadonlyMap<aux.NodeId, ComputedNode<A>> {
271
- return buildComputedNodes([...memory.final].map(toNodeSource))
272
- }
273
-
274
- export function applyDeploymentViewRuleStyles<A extends AnyAux>(
275
- rules: DeploymentViewRule<A>[],
276
- nodes: ComputedNode<A>[],
277
- ): ComputedNode<A>[] {
278
- for (const rule of rules) {
279
- if (!isViewRuleStyle(rule) || rule.targets.length === 0) {
280
- continue
281
- }
282
- const predicates = rule.targets.map(deploymentExpressionToPredicate)
283
- applyViewRuleStyle(rule, predicates, nodes)
284
- }
285
- return nodes
286
- }