@likec4/core 1.41.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.
- package/builder/package.json +4 -0
- package/compute-view/package.json +4 -0
- package/compute-view/relationships/package.json +4 -0
- package/dist/builder/index.d.mts +13 -11
- package/dist/builder/index.mjs +111 -91
- package/dist/compute-view/index.d.mts +8 -7
- package/dist/compute-view/index.mjs +14 -11
- package/dist/compute-view/relationships-view/index.d.mts +9 -8
- package/dist/compute-view/relationships-view/index.mjs +6 -6
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +11 -11
- package/dist/model/connection/deployment/index.d.mts +11 -10
- package/dist/model/connection/deployment/index.mjs +2 -2
- package/dist/model/connection/index.d.mts +12 -11
- package/dist/model/connection/index.mjs +3 -3
- package/dist/model/connection/model/index.d.mts +11 -10
- package/dist/model/connection/model/index.mjs +2 -2
- package/dist/model/index.d.mts +14 -14
- package/dist/model/index.mjs +4 -5
- package/dist/shared/{core.Ae86Y3tB.mjs → core.01VTr9qu.mjs} +8 -26
- package/dist/shared/core.1vX5a9AY.mjs +86 -0
- package/dist/shared/{core.BVNaR17u.mjs → core.B7KhhkRY.mjs} +1 -1
- package/dist/shared/core.B85MJLTf.mjs +5 -0
- package/dist/shared/{core.DA5vzwZ9.mjs → core.BIqHjQiH.mjs} +56 -42
- package/dist/shared/core.BKlholso.mjs +3 -0
- package/dist/shared/core.BR4zXDH-.mjs +13 -0
- package/dist/shared/{core.CXy1NLUG.mjs → core.BYNkXQ8A.mjs} +21 -12
- package/dist/shared/{core.BuoXfSMj.mjs → core.BbE4y-yl.mjs} +1 -1
- package/dist/shared/core.BoYfZOBm.mjs +3 -0
- package/dist/shared/core.BsSXS-_R.mjs +7 -0
- package/dist/shared/{core.DJp8fgok.mjs → core.BzTakU3I.mjs} +14 -10
- package/dist/shared/{core.4u1dVmfX.mjs → core.C2TiyjI6.mjs} +2 -2
- package/dist/shared/{core.DLpidoWc.mjs → core.C3JowhaZ.mjs} +3 -3
- package/dist/shared/{core.CNGyqkJh.mjs → core.C4x8aaWa.mjs} +3 -1
- package/dist/shared/{core.BB6zA-UU.mjs → core.C8YY6Uub.mjs} +38 -9
- package/dist/shared/{core.Asc11Mjy.mjs → core.C8sl5Y8Z.mjs} +122 -58
- package/dist/shared/{core.BvMRMo7Z.mjs → core.CNgZvKb8.mjs} +3 -5198
- package/dist/shared/{core.CUG6vpyL.d.mts → core.CQngdcuj.d.mts} +85 -4
- package/dist/shared/{core.Be1n9a0i.mjs → core.C_Ni6yHl.mjs} +5 -4
- package/dist/shared/core.CbT8JVYL.mjs +5 -0
- package/dist/shared/core.CqAJJpK_.mjs +3 -0
- package/dist/shared/{core.BXsxn-hf.d.mts → core.D0PjZzIS.d.mts} +27 -15
- package/dist/shared/{core.DgesAwC8.d.mts → core.D5fzJWbF.d.mts} +2 -2
- package/dist/shared/{core.hfOE3RfK.d.mts → core.DACpKp35.d.mts} +5 -5
- package/dist/shared/core.DFi2dOTl.mjs +39548 -0
- package/dist/shared/{core.xSQO0XYD.d.mts → core.DIol3syK.d.mts} +2 -2
- package/dist/shared/{core.DlG1xWt2.mjs → core.DMMOWQqc.mjs} +3 -2
- package/dist/shared/core.DNbUPnve.mjs +3990 -0
- package/dist/shared/{core.CCD1ID81.mjs → core.DRJma0Ol.mjs} +4 -3
- package/dist/shared/{core.DgttqsJc.mjs → core.DRhg-gVU.mjs} +9 -9
- package/dist/shared/core.DSO_rTC2.mjs +5322 -0
- package/dist/shared/{core.FUPplpae.d.mts → core.D_vkffV4.d.mts} +4 -2
- package/dist/shared/core.DdMJk7nx.d.mts +476 -0
- package/dist/shared/{core.BhpgpOep.d.mts → core.Dgs6-nuz.d.mts} +2 -2
- package/dist/shared/{core.Be4Jy9Qx.mjs → core.FZ305VYd.mjs} +2 -2
- package/dist/shared/core.OHD4KXm9.mjs +5 -0
- package/dist/shared/{core.GTgsmXS_.mjs → core.QJD_fcrc.mjs} +2 -2
- package/dist/shared/core.RfnaEmgA.mjs +7 -0
- package/dist/shared/core.fHR_8Tnq.d.mts +450 -0
- package/dist/shared/{core.D0EgVMQK.mjs → core.lRvxPoao.mjs} +14 -12
- package/dist/shared/{core.CaT0SUUK.mjs → core.rCeaAqgW.mjs} +1 -84
- package/dist/shared/{core.zxTBF_PD.d.mts → core.s9uwOt60.d.mts} +4 -4
- package/dist/shared/core.yna0OdV5.d.mts +98 -0
- package/dist/styles/index.d.mts +106 -0
- package/dist/styles/index.mjs +1 -0
- package/dist/types/_aux.d.mts +2 -2
- package/dist/types/expression-model.d.mts +3 -4
- package/dist/types/expression.d.mts +3 -4
- package/dist/types/fqnRef.d.mts +2 -2
- package/dist/types/fqnRef.mjs +3 -3
- package/dist/types/index.d.mts +8 -8
- package/dist/types/index.mjs +150 -5
- package/dist/types/scalar.mjs +3 -2
- package/dist/utils/graphology/index.d.mts +1864 -0
- package/dist/utils/graphology/index.mjs +1 -0
- package/dist/utils/index.d.mts +11 -6
- package/dist/utils/index.mjs +21 -37
- package/dist/utils/iterable/index.d.mts +1 -1
- package/dist/utils/iterable/index.mjs +45 -7
- package/model/package.json +4 -0
- package/package.json +42 -24
- package/styles/package.json +4 -0
- package/types/package.json +4 -0
- package/utils/graphology/package.json +4 -0
- package/utils/package.json +4 -0
- package/dist/shared/core.6_Vp2iiN.mjs +0 -172
- package/dist/shared/core.CUw_2J9j.mjs +0 -47
- package/dist/shared/core.CzdwsPmY.d.mts +0 -69
- package/dist/shared/core.D-ZGWDDt.d.mts +0 -831
- package/dist/shared/core.DoM6aM9N.mjs +0 -7
- package/dist/shared/core.ILwny7BV.mjs +0 -38
- package/dist/theme/index.d.mts +0 -11
- package/dist/theme/index.mjs +0 -232
- package/src/builder/Builder.deployment.ts +0 -224
- package/src/builder/Builder.deploymentModel.ts +0 -449
- package/src/builder/Builder.element.ts +0 -241
- package/src/builder/Builder.model.ts +0 -494
- package/src/builder/Builder.ts +0 -946
- package/src/builder/Builder.view-common.ts +0 -273
- package/src/builder/Builder.view-deployment.ts +0 -135
- package/src/builder/Builder.view-element.ts +0 -202
- package/src/builder/Builder.views.ts +0 -399
- package/src/builder/Builder.with.ts +0 -156
- package/src/builder/_types.ts +0 -324
- package/src/builder/index.ts +0 -11
- package/src/compute-view/compute-view.ts +0 -80
- package/src/compute-view/deployment-view/_types.ts +0 -38
- package/src/compute-view/deployment-view/clean-connections.ts +0 -236
- package/src/compute-view/deployment-view/compute.ts +0 -94
- package/src/compute-view/deployment-view/memory/index.ts +0 -9
- package/src/compute-view/deployment-view/memory/memory.ts +0 -96
- package/src/compute-view/deployment-view/predicates/deploymentRefs-where.ts +0 -18
- package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +0 -154
- package/src/compute-view/deployment-view/predicates/index.ts +0 -8
- package/src/compute-view/deployment-view/predicates/relation-direct.ts +0 -243
- package/src/compute-view/deployment-view/predicates/relation-in-out.ts +0 -70
- package/src/compute-view/deployment-view/predicates/relation-incoming.ts +0 -101
- package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +0 -95
- package/src/compute-view/deployment-view/predicates/relation-where.ts +0 -18
- package/src/compute-view/deployment-view/predicates/utils.ts +0 -282
- package/src/compute-view/deployment-view/predicates/wildcard.ts +0 -41
- package/src/compute-view/deployment-view/stages/stage-exclude.ts +0 -5
- package/src/compute-view/deployment-view/stages/stage-final.ts +0 -245
- package/src/compute-view/deployment-view/stages/stage-include.ts +0 -95
- package/src/compute-view/deployment-view/utils.ts +0 -297
- package/src/compute-view/dynamic-view/compute.ts +0 -312
- package/src/compute-view/element-view/_types.ts +0 -47
- package/src/compute-view/element-view/clean-connections.ts +0 -117
- package/src/compute-view/element-view/compute.ts +0 -324
- package/src/compute-view/element-view/memory/NodeGroup.ts +0 -31
- package/src/compute-view/element-view/memory/index.ts +0 -10
- package/src/compute-view/element-view/memory/memory.ts +0 -178
- package/src/compute-view/element-view/memory/stage-exclude.ts +0 -59
- package/src/compute-view/element-view/memory/stage-final.ts +0 -129
- package/src/compute-view/element-view/memory/stage-include.ts +0 -130
- package/src/compute-view/element-view/predicates/_utils.ts +0 -91
- package/src/compute-view/element-view/predicates/element-expand.ts +0 -29
- package/src/compute-view/element-view/predicates/element-kind-tag.ts +0 -27
- package/src/compute-view/element-view/predicates/element-ref.ts +0 -24
- package/src/compute-view/element-view/predicates/relation-direct.ts +0 -321
- package/src/compute-view/element-view/predicates/relation-in-out.ts +0 -64
- package/src/compute-view/element-view/predicates/relation-in.ts +0 -115
- package/src/compute-view/element-view/predicates/relation-out.ts +0 -119
- package/src/compute-view/element-view/predicates/wildcard.ts +0 -88
- package/src/compute-view/element-view/utils.ts +0 -65
- package/src/compute-view/index.ts +0 -4
- package/src/compute-view/memory/AbstractMemory.ts +0 -45
- package/src/compute-view/memory/AbstractStageExclude.ts +0 -215
- package/src/compute-view/memory/AbstractStageInclude.ts +0 -200
- package/src/compute-view/memory/_types.ts +0 -148
- package/src/compute-view/memory/index.ts +0 -5
- package/src/compute-view/memory/ops.ts +0 -43
- package/src/compute-view/relationships-view/_types.ts +0 -16
- package/src/compute-view/relationships-view/compute.ts +0 -159
- package/src/compute-view/relationships-view/index.ts +0 -3
- package/src/compute-view/relationships-view/layout.ts +0 -358
- package/src/compute-view/relationships-view/utils.ts +0 -73
- package/src/compute-view/utils/ancestorsOfNode.ts +0 -19
- package/src/compute-view/utils/applyCustomElementProperties.ts +0 -107
- package/src/compute-view/utils/applyCustomRelationProperties.ts +0 -58
- package/src/compute-view/utils/applyViewRuleStyles.ts +0 -73
- package/src/compute-view/utils/buildComputedNodes.ts +0 -166
- package/src/compute-view/utils/buildElementNotations.ts +0 -64
- package/src/compute-view/utils/elementExpressionToPredicate.ts +0 -50
- package/src/compute-view/utils/link-nodes-with-edges.ts +0 -56
- package/src/compute-view/utils/merge-props-from-relationships.ts +0 -161
- package/src/compute-view/utils/relationExpressionToPredicates.ts +0 -55
- package/src/compute-view/utils/resolve-extended-views.ts +0 -85
- package/src/compute-view/utils/resolve-global-rules.ts +0 -88
- package/src/compute-view/utils/topological-sort.ts +0 -256
- package/src/compute-view/utils/view-hash.ts +0 -45
- package/src/compute-view/utils/with-readable-edges.ts +0 -40
- package/src/index.ts +0 -32
- package/src/model/DeploymentElementModel.ts +0 -712
- package/src/model/DeploymentModel.ts +0 -393
- package/src/model/ElementModel.ts +0 -316
- package/src/model/LikeC4Model.ts +0 -882
- package/src/model/RelationModel.ts +0 -152
- package/src/model/connection/Connection.ts +0 -72
- package/src/model/connection/deployment/DeploymentConnectionModel.ts +0 -185
- package/src/model/connection/deployment/find.ts +0 -120
- package/src/model/connection/deployment/index.ts +0 -8
- package/src/model/connection/index.ts +0 -22
- package/src/model/connection/model/ConnectionModel.ts +0 -158
- package/src/model/connection/model/find.ts +0 -117
- package/src/model/connection/model/index.ts +0 -8
- package/src/model/connection/ops.ts +0 -276
- package/src/model/guards.ts +0 -77
- package/src/model/index.ts +0 -72
- package/src/model/types.ts +0 -67
- package/src/model/utils.ts +0 -66
- package/src/model/view/EdgeModel.ts +0 -121
- package/src/model/view/LikeC4ViewModel.ts +0 -361
- package/src/model/view/LikeC4ViewsFolder.ts +0 -151
- package/src/model/view/NodeModel.ts +0 -247
- package/src/theme/element.ts +0 -61
- package/src/theme/index.ts +0 -127
- package/src/theme/relationships.ts +0 -54
- package/src/types/RichText.ts +0 -205
- package/src/types/_aux.ts +0 -317
- package/src/types/_common.ts +0 -102
- package/src/types/const.ts +0 -34
- package/src/types/expression-model.ts +0 -294
- package/src/types/expression.ts +0 -313
- package/src/types/fqnRef.ts +0 -91
- package/src/types/geometry.ts +0 -159
- package/src/types/global.ts +0 -21
- package/src/types/index.ts +0 -44
- package/src/types/model-data.ts +0 -77
- package/src/types/model-deployment.ts +0 -78
- package/src/types/model-dump.ts +0 -79
- package/src/types/model-logical.ts +0 -126
- package/src/types/model-spec.ts +0 -88
- package/src/types/operators.ts +0 -156
- package/src/types/project.ts +0 -14
- package/src/types/scalar.ts +0 -162
- package/src/types/styles.ts +0 -122
- package/src/types/view-changes.ts +0 -32
- package/src/types/view-common.ts +0 -157
- package/src/types/view-computed.ts +0 -126
- package/src/types/view-layouted.ts +0 -94
- package/src/types/view-parsed.deployment.ts +0 -39
- package/src/types/view-parsed.dynamic.ts +0 -89
- package/src/types/view-parsed.element.ts +0 -65
- package/src/types/view.ts +0 -113
- package/src/utils/common-head.ts +0 -22
- package/src/utils/compare-natural.ts +0 -60
- package/src/utils/const.ts +0 -1
- package/src/utils/fqn.ts +0 -302
- package/src/utils/getOrCreate.ts +0 -8
- package/src/utils/guards.ts +0 -9
- package/src/utils/index.ts +0 -68
- package/src/utils/invariant.ts +0 -29
- package/src/utils/iterable/_types.ts +0 -5
- package/src/utils/iterable/filter.ts +0 -55
- package/src/utils/iterable/find.ts +0 -38
- package/src/utils/iterable/first.ts +0 -48
- package/src/utils/iterable/flat.ts +0 -17
- package/src/utils/iterable/head.ts +0 -22
- package/src/utils/iterable/index.ts +0 -15
- package/src/utils/iterable/map.ts +0 -40
- package/src/utils/iterable/reduce.ts +0 -24
- package/src/utils/iterable/some.ts +0 -36
- package/src/utils/iterable/to.ts +0 -19
- package/src/utils/iterable/unique.ts +0 -23
- package/src/utils/markdown/index.ts +0 -2
- package/src/utils/markdown/to-html.ts +0 -32
- package/src/utils/markdown/to-text.ts +0 -14
- package/src/utils/memoize-prop.ts +0 -30
- package/src/utils/mnemonist.ts +0 -9
- package/src/utils/object-hash.ts +0 -14
- package/src/utils/promises.ts +0 -24
- package/src/utils/relations.ts +0 -36
- package/src/utils/set.ts +0 -83
- 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
|
-
}
|