@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,129 +0,0 @@
1
- import { forEach, only, pipe } from 'remeda'
2
- import { isAncestor, sortByFqnHierarchically } from '../../../utils/fqn'
3
- import { isome, toArray } from '../../../utils/iterable'
4
- import { difference, union } from '../../../utils/set'
5
- import { treeFromMemoryState } from '../../memory/ops'
6
- import type { Elem } from '../_types'
7
- import { findRedundantConnections } from '../clean-connections'
8
- import type { Ctx, Memory } from './memory'
9
-
10
- /**
11
- * This patch:
12
- * 1. Keeps connections between leafs or having direct deployment relations
13
- * 2. Removes cross-boundary model relations, that already exist inside boundaries
14
- * (e.g. prefer relations inside same deployment node over relations between nodes)
15
- * 3. Removes implicit connections between elements, if their descendants have same connection
16
- */
17
- export class StageFinal {
18
- static for(memory: Memory) {
19
- return new StageFinal(memory)
20
- }
21
-
22
- private constructor(
23
- protected readonly memory: Memory,
24
- ) {
25
- }
26
-
27
- public step1CleanConnections(memory: Memory): Memory {
28
- if (memory.connections.length < 2) {
29
- return memory
30
- }
31
-
32
- const connectionsToExclude = findRedundantConnections(memory.connections)
33
- if (connectionsToExclude.length === 0) {
34
- return memory
35
- }
36
- const stage = memory.stageExclude({} as any)
37
-
38
- stage.excludeConnections(connectionsToExclude, true)
39
-
40
- return stage.commit()
41
- }
42
-
43
- public step2ProcessImplicits(memory: Memory): Memory {
44
- const implicits = union(this.memory.elements, memory.elements)
45
- const final = union(memory.final, this.memory.explicits)
46
-
47
- const snapshot = new Set(final)
48
- const isFinalOrHasIncludedDescendant = (el: Elem) => {
49
- for (const final of snapshot) {
50
- if (el === final || isAncestor(el, final)) {
51
- return true
52
- }
53
- }
54
- return false
55
- }
56
-
57
- // Pick from implicit elements
58
- pipe(
59
- difference(implicits, snapshot),
60
- toArray(),
61
- sortByFqnHierarchically,
62
- forEach((el) => {
63
- // if (memory.scope && !memory.scope.isAncestorOf(el)) {
64
- // return
65
- // }
66
- // If element has more 2 or more children included
67
- // It can "box" around
68
- const childrensToWrap = [...el.children()].filter(isFinalOrHasIncludedDescendant).length
69
- if (childrensToWrap >= 2) {
70
- final.add(el)
71
- return
72
- }
73
- // If Element has only one child included
74
- // and has "similar" sibling with included descendant
75
- if (childrensToWrap === 1 && isome(el.siblings(), isFinalOrHasIncludedDescendant)) {
76
- final.add(el)
77
- }
78
- }),
79
- )
80
-
81
- return memory.update({ final })
82
- }
83
-
84
- public step3ProcessBoundaries(memory: Memory): Memory {
85
- const boundaries = new Set<Elem>()
86
- for (const conn of memory.connections) {
87
- if (conn.boundary && conn.boundary !== conn.source && conn.boundary !== conn.target) {
88
- boundaries.add(conn.boundary)
89
- }
90
- }
91
- const tree = treeFromMemoryState<Ctx>(memory, 'final')
92
- const stage = memory.stageExclude({} as any)
93
-
94
- const isRemovable = (el: Elem) =>
95
- !(
96
- boundaries.has(el)
97
- || memory.explicits.has(el)
98
- || tree.hasInOut(el)
99
- || tree.root.has(el)
100
- )
101
-
102
- const singleRoot = only([...tree.root])
103
- if (singleRoot && !memory.explicits.has(singleRoot)) {
104
- stage.exclude(singleRoot)
105
- }
106
-
107
- for (const el of memory.final) {
108
- const singleChild = only(tree.children(el))
109
- if (singleChild && !tree.hasInOut(singleChild) && isRemovable(el)) {
110
- stage.exclude(el)
111
- }
112
- }
113
-
114
- if (stage.isDirty()) {
115
- return stage.commit()
116
- }
117
- return memory
118
- }
119
-
120
- public commit(): Memory {
121
- // return []
122
- const step1 = this.step1CleanConnections(this.memory)
123
- const step2 = this.step2ProcessImplicits(step1)
124
- return this.step3ProcessBoundaries(step2)
125
- // return step2memory
126
- // const step3m?emory = this.step3FlatNodes(step2memory)
127
- // return step3memory
128
- }
129
- }
@@ -1,130 +0,0 @@
1
- import { dropWhile, forEach, pipe, take, zip } from 'remeda'
2
- import { modelConnection } from '../../../model'
3
- import { ModelExpression } from '../../../types'
4
- import { difference, isAncestor, isIterable } from '../../../utils'
5
- import { toArray } from '../../../utils/iterable'
6
- import { type CtxConnection, type StageExpression, AbstractStageInclude } from '../../memory'
7
- import { type ActiveGroupCtx, type ActiveGroupMemory, type Ctx } from './memory'
8
-
9
- const { findConnection, findConnectionsBetween } = modelConnection
10
-
11
- export type Elem = Ctx['Element']
12
-
13
- export class StageInclude<C extends Ctx = Ctx> extends AbstractStageInclude<C> {
14
- /**
15
- * Connects elements with existing ones in the memory
16
- */
17
- public override connectWithExisting(
18
- elements: Elem | Iterable<Elem>,
19
- direction: 'in' | 'out' | 'both' = 'both',
20
- ): boolean {
21
- const before = this._connections.length
22
- const hasChanged = () => this._connections.length > before
23
- if (!isIterable(elements)) {
24
- if (direction === 'in' || direction === 'both') {
25
- for (const el of this.memory.elements) {
26
- this.addConnections(
27
- findConnection(el, elements, 'directed'),
28
- )
29
- }
30
- }
31
- if (direction === 'out' || direction === 'both') {
32
- this.addConnections(
33
- findConnectionsBetween(elements, this.memory.elements, 'directed'),
34
- )
35
- }
36
- return hasChanged()
37
- }
38
-
39
- const targets = [...elements]
40
- if (direction === 'in' || direction === 'both') {
41
- for (const el of this.memory.elements) {
42
- this.addConnections(
43
- findConnectionsBetween(el, targets, 'directed'),
44
- )
45
- }
46
- }
47
- if (direction === 'out' || direction === 'both') {
48
- for (const el of targets) {
49
- this.addConnections(
50
- findConnectionsBetween(el, this.memory.elements, 'directed'),
51
- )
52
- }
53
- }
54
- return hasChanged()
55
- }
56
-
57
- protected addImplicitWithinScope(element: Elem | undefined | null) {
58
- if (!element) {
59
- return
60
- }
61
- if (!this.memory.scope || isAncestor(this.memory.scope, element)) {
62
- this.addImplicit(element)
63
- }
64
- }
65
-
66
- protected override processConnections(connections: CtxConnection<Ctx>[]) {
67
- if (ModelExpression.isRelationExpr(this.expression)) {
68
- return connections
69
- }
70
-
71
- pipe(
72
- connections,
73
- forEach(({ source, target, boundary }) => {
74
- pipe(
75
- zip(
76
- [...toArray(source.ancestors()).reverse(), source],
77
- [...toArray(target.ancestors()).reverse(), target],
78
- ),
79
- // Filter out common ancestors
80
- dropWhile(([sourceAncestor, targetAncestor]) => sourceAncestor === targetAncestor),
81
- take(1),
82
- forEach(([sourceAncestor, targetAncestor]) => {
83
- if (sourceAncestor === source && targetAncestor === target) {
84
- this.addImplicitWithinScope(boundary)
85
- return
86
- }
87
- if (sourceAncestor !== source) {
88
- this.addImplicitWithinScope(sourceAncestor)
89
- }
90
- if (targetAncestor !== target) {
91
- this.addImplicitWithinScope(targetAncestor)
92
- }
93
- }),
94
- )
95
- }),
96
- )
97
- return connections
98
- }
99
-
100
- protected override postcommit(state: ActiveGroupCtx['MutableState']) {
101
- const newExplicits = difference(state.explicits, this.memory.explicits)
102
- for (const explicit of newExplicits) {
103
- state.explicitFirstSeenIn.set(explicit, '@root' as any)
104
- }
105
-
106
- return state
107
- }
108
- }
109
-
110
- export class ActiveGroupStageInclude extends StageInclude<ActiveGroupCtx> {
111
- constructor(
112
- public override readonly memory: ActiveGroupMemory,
113
- public override readonly expression: StageExpression<ActiveGroupCtx>,
114
- ) {
115
- super(memory, expression)
116
- }
117
-
118
- protected override postcommit(state: ActiveGroupCtx['MutableState']) {
119
- const newExplicits = difference(state.explicits, this.memory.explicits)
120
- for (const explicit of newExplicits) {
121
- state.explicitFirstSeenIn.set(explicit, this.memory.activeGroupId)
122
- }
123
-
124
- for (const implicit of [...this.explicits, ...this.implicits]) {
125
- state.lastSeenIn.set(implicit, this.memory.activeGroupId)
126
- }
127
-
128
- return state
129
- }
130
- }
@@ -1,91 +0,0 @@
1
- import { anyPass } from 'remeda'
2
- import type { ElementModel, LikeC4Model } from '../../../model'
3
- import { modelConnection } from '../../../model'
4
- import { type AnyAux, FqnRef, ModelFqnExpr } from '../../../types'
5
- import { ifilter, isDescendantOf, nonexhaustive, toArray } from '../../../utils'
6
- import type { Elem, Memory, PredicateCtx } from '../_types'
7
-
8
- export const { findConnection, findConnectionsBetween, findConnectionsWithin } = modelConnection
9
-
10
- /**
11
- * Resolve elements from the model based on the given expression
12
- */
13
-
14
- export function resolveElements<A extends AnyAux>(
15
- model: LikeC4Model<A>,
16
- expr: ModelFqnExpr.NonWildcard<A>,
17
- ): ElementModel<A>[] {
18
- switch (true) {
19
- case ModelFqnExpr.isElementKindExpr(expr): {
20
- return [...ifilter(model.elements(), el => {
21
- return expr.isEqual === (el.kind === expr.elementKind)
22
- })]
23
- }
24
- case ModelFqnExpr.isElementTagExpr(expr): {
25
- return [...ifilter(model.elements(), el => {
26
- return expr.isEqual === el.tags.includes(expr.elementTag)
27
- })]
28
- }
29
- case expr.selector === 'expanded': {
30
- const element = model.element(FqnRef.flatten(expr.ref))
31
- return [
32
- element,
33
- ...element.children(),
34
- ]
35
- }
36
- case expr.selector === 'children':
37
- case expr.selector === 'descendants': {
38
- const element = model.element(FqnRef.flatten(expr.ref))
39
- let children = expr.selector === 'children' ? toArray(element.children()) : toArray(element.descendants())
40
- return children && children.length > 0 ? children : [element]
41
- }
42
- case ModelFqnExpr.isModelRef(expr): {
43
- return [model.element(FqnRef.flatten(expr.ref))]
44
- }
45
- default:
46
- nonexhaustive(expr)
47
- }
48
- }
49
-
50
- /**
51
- * Include elements that are not in the given set but are descendants of the current set
52
- * Consider the following example:
53
- * a1.* -> b1
54
- * If there are a1.a2.a3 and b1.b2 in the memory, but not connected yet - we connect them
55
- */
56
- export function includeDescendantsFromMemory(elements: Elem[], memory: Memory): Elem[] {
57
- if (memory.isEmpty() || elements.length === 0) {
58
- return elements
59
- }
60
- const descedantsOf = anyPass(elements.map(e => isDescendantOf(e)))
61
- const fromMemory = toArray(
62
- ifilter(
63
- memory.elements,
64
- el => !elements.includes(el) && descedantsOf(el),
65
- ),
66
- )
67
- return [
68
- ...elements,
69
- ...fromMemory,
70
- ]
71
- }
72
-
73
- /**
74
- * Combination of `resolveElements` and `includeDescendantsFromMemory`
75
- */
76
- export function resolveAndIncludeFromMemory(
77
- nonWildcard: ModelFqnExpr.NonWildcard,
78
- { memory, model }: Pick<PredicateCtx, 'model' | 'memory'>,
79
- ): Elem[] {
80
- const resolved = resolveElements(model, nonWildcard)
81
- // We include from memory only if the expression is:
82
- // - expanded element
83
- // - element reference with or with children (but not descendants - they are already included)
84
- if (ModelFqnExpr.isModelRef(nonWildcard)) {
85
- if (nonWildcard.selector === 'descendants') {
86
- return resolved
87
- }
88
- return includeDescendantsFromMemory(resolved, memory)
89
- }
90
- return resolved
91
- }
@@ -1,29 +0,0 @@
1
- import { type AnyAux, type ModelFqnExpr, FqnRef } from '../../../types'
2
- import type { Elem, PredicateExecutor } from '../_types'
3
- import { findConnectionsWithin, resolveElements } from './_utils'
4
-
5
- export const ExpandedElementPredicate: PredicateExecutor<ModelFqnExpr.Ref<AnyAux>> = {
6
- include: ({ expr, model, stage, where }) => {
7
- const parent = model.element(FqnRef.flatten(expr.ref))
8
- if (where(parent)) {
9
- stage.addExplicit(parent)
10
- stage.connectWithExisting(parent)
11
- }
12
-
13
- const children = [...parent.children()].filter(where)
14
- const expanded = [] as Elem[]
15
- for (const child of children) {
16
- stage.addImplicit(child)
17
- if (stage.connectWithExisting(child)) {
18
- expanded.push(child)
19
- }
20
- }
21
- stage.addConnections(findConnectionsWithin(expanded))
22
- return stage
23
- },
24
- exclude: ({ expr, model, stage, filterWhere }) => {
25
- const elements = filterWhere(resolveElements(model, expr))
26
- stage.exclude(elements)
27
- return stage
28
- },
29
- }
@@ -1,27 +0,0 @@
1
- import type { AnyAux, ModelFqnExpr } from '../../../types'
2
- import type { PredicateExecutor } from '../_types'
3
- import { findConnectionsWithin, resolveElements } from './_utils'
4
-
5
- export const ElementKindOrTagPredicate: PredicateExecutor<
6
- ModelFqnExpr.ElementKindExpr<AnyAux> | ModelFqnExpr.ElementTagExpr<AnyAux>
7
- > = {
8
- include: ({ expr, model, stage, filterWhere }) => {
9
- const elements = filterWhere(resolveElements(model, expr))
10
- if (elements.length === 0) {
11
- return
12
- }
13
-
14
- stage.addExplicit(elements)
15
- stage.connectWithExisting(elements)
16
- stage.addConnections(findConnectionsWithin(elements))
17
-
18
- return stage
19
- },
20
-
21
- exclude: ({ expr, model, stage, filterWhere }) => {
22
- const elements = filterWhere(resolveElements(model, expr))
23
- stage.exclude(elements)
24
-
25
- return stage
26
- },
27
- }
@@ -1,24 +0,0 @@
1
- import type { AnyAux, ModelFqnExpr } from '../../../types'
2
- import type { Elem, PredicateExecutor } from '../_types'
3
- import { findConnectionsWithin, resolveElements } from './_utils'
4
-
5
- export const ElementRefPredicate: PredicateExecutor<ModelFqnExpr.Ref<AnyAux>> = {
6
- include: ({ expr, model, stage, filterWhere }) => {
7
- const elements = filterWhere(resolveElements(model, expr))
8
- if (elements.length === 0) {
9
- return
10
- }
11
-
12
- stage.addExplicit(elements)
13
- stage.connectWithExisting(elements)
14
- stage.addConnections(findConnectionsWithin(elements))
15
-
16
- return stage
17
- },
18
- exclude: ({ expr, model, stage, filterWhere }) => {
19
- const elements = filterWhere(resolveElements(model, expr))
20
- stage.exclude(elements)
21
-
22
- return stage
23
- },
24
- }