@likec4/core 1.30.0 → 1.32.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/README.md +407 -5
- package/dist/builder/index.d.mts +221 -42
- package/dist/builder/index.mjs +118 -65
- package/dist/compute-view/index.d.mts +23 -7
- package/dist/compute-view/index.mjs +11 -6
- package/dist/compute-view/relationships-view/index.d.mts +9 -7
- package/dist/compute-view/relationships-view/index.mjs +3 -2
- package/dist/index.d.mts +10 -14
- package/dist/index.mjs +10 -6
- package/dist/model/index.d.mts +173 -19
- package/dist/model/index.mjs +6 -1
- package/dist/shared/core.BaYE_r29.d.mts +258 -0
- package/dist/shared/core.Bk7wEZFG.mjs +276 -0
- package/dist/shared/core.BrCnZFTn.mjs +32 -0
- package/dist/shared/core.BuO4ncfY.d.mts +146 -0
- package/dist/shared/{core.CAcZ6_cP.mjs → core.CBpKAlhj.mjs} +1742 -4128
- package/dist/shared/core.CCWXGc6G.d.mts +920 -0
- package/dist/shared/core.CUYDgv2-.mjs +214 -0
- package/dist/shared/{core.Cu-UdkSl.mjs → core.CpXlRyE5.mjs} +7 -494
- package/dist/shared/{core.C-YXI-43.mjs → core.Cy9smucx.mjs} +3 -1
- package/dist/shared/core.CywrQs86.d.mts +31 -0
- package/dist/shared/core.DoK86JEe.mjs +518 -0
- package/dist/shared/core.Dpq3P3YJ.d.mts +1265 -0
- package/dist/shared/{core.D2830qgg.d.mts → core.Pf5I9o0e.d.mts} +1 -1
- package/dist/shared/core.cbA9VZ02.mjs +2681 -0
- package/dist/shared/{core.CQXU9DF7.mjs → core.rmvsy0n3.mjs} +23 -32
- package/dist/types/aux.d.mts +3 -0
- package/dist/types/aux.mjs +1 -0
- package/dist/types/index.d.mts +7 -45
- package/dist/types/index.mjs +130 -3
- package/dist/utils/index.d.mts +221 -53
- package/dist/utils/index.mjs +14 -10
- package/package.json +19 -10
- package/src/builder/Builder.deploymentModel.ts +82 -18
- package/src/builder/Builder.element.ts +40 -20
- package/src/builder/Builder.model.ts +66 -17
- package/src/builder/Builder.ts +168 -76
- package/src/builder/Builder.view-common.ts +35 -17
- package/src/builder/Builder.view-deployment.ts +25 -25
- package/src/builder/Builder.view-element.ts +13 -12
- package/src/builder/Builder.views.ts +12 -7
- package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +62 -34
- package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +319 -0
- package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +45 -24
- package/src/builder/_types.ts +34 -27
- package/src/compute-view/compute-view.ts +31 -34
- package/src/compute-view/deployment-view/__test__/TestHelper.ts +27 -14
- package/src/compute-view/deployment-view/__test__/fixture.ts +15 -13
- package/src/compute-view/deployment-view/_types.ts +10 -10
- package/src/compute-view/deployment-view/clean-connections.ts +5 -7
- package/src/compute-view/deployment-view/compute.ts +16 -13
- package/src/compute-view/deployment-view/memory/memory.ts +5 -6
- package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +4 -5
- package/src/compute-view/deployment-view/predicates/relation-direct.ts +25 -50
- package/src/compute-view/deployment-view/predicates/relation-in-out.ts +5 -7
- package/src/compute-view/deployment-view/predicates/relation-incoming.ts +7 -11
- package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +7 -10
- package/src/compute-view/deployment-view/predicates/utils.ts +37 -31
- package/src/compute-view/deployment-view/predicates/wildcard.ts +3 -2
- package/src/compute-view/deployment-view/stages/stage-final.ts +2 -2
- package/src/compute-view/deployment-view/stages/stage-include.ts +1 -1
- package/src/compute-view/deployment-view/utils.ts +79 -72
- package/src/compute-view/dynamic-view/__test__/fixture.ts +20 -11
- package/src/compute-view/dynamic-view/compute.ts +60 -53
- package/src/compute-view/element-view/__test__/TestHelper.ts +53 -29
- package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +26 -26
- package/src/compute-view/element-view/__test__/fixture.ts +134 -83
- package/src/compute-view/element-view/_types.ts +14 -19
- package/src/compute-view/element-view/clean-connections.ts +12 -8
- package/src/compute-view/element-view/compute.ts +61 -51
- package/src/compute-view/element-view/memory/NodeGroup.ts +8 -9
- package/src/compute-view/element-view/memory/memory.ts +22 -22
- package/src/compute-view/element-view/memory/stage-include.ts +5 -3
- package/src/compute-view/element-view/predicates/_utils.ts +18 -14
- package/src/compute-view/element-view/predicates/element-expand.ts +4 -5
- package/src/compute-view/element-view/predicates/element-kind-tag.ts +3 -4
- package/src/compute-view/element-view/predicates/element-ref.ts +3 -4
- package/src/compute-view/element-view/predicates/relation-direct.ts +16 -12
- package/src/compute-view/element-view/predicates/relation-in-out.ts +7 -8
- package/src/compute-view/element-view/predicates/relation-in.ts +19 -26
- package/src/compute-view/element-view/predicates/relation-out.ts +20 -21
- package/src/compute-view/element-view/predicates/wildcard.ts +3 -3
- package/src/compute-view/element-view/utils.ts +25 -23
- package/src/compute-view/index.ts +1 -1
- package/src/compute-view/memory/AbstractStageExclude.ts +3 -4
- package/src/compute-view/memory/AbstractStageInclude.ts +1 -1
- package/src/compute-view/memory/_types.ts +3 -2
- package/src/compute-view/relationships-view/_types.ts +3 -4
- package/src/compute-view/relationships-view/compute.ts +8 -11
- package/src/compute-view/relationships-view/layout.ts +6 -6
- package/src/compute-view/relationships-view/utils.ts +4 -4
- package/src/compute-view/utils/ancestorsOfNode.ts +7 -7
- package/src/compute-view/utils/applyCustomElementProperties.ts +16 -8
- package/src/compute-view/utils/applyCustomRelationProperties.ts +19 -9
- package/src/compute-view/utils/applyViewRuleStyles.ts +18 -10
- package/src/compute-view/utils/buildComputedNodes.ts +40 -40
- package/src/compute-view/utils/buildElementNotations.ts +14 -14
- package/src/compute-view/utils/elementExpressionToPredicate.ts +14 -15
- package/src/compute-view/utils/link-nodes-with-edges.ts +6 -4
- package/src/compute-view/utils/merge-props-from-relationships.ts +52 -20
- package/src/compute-view/utils/relationExpressionToPredicates.ts +19 -19
- package/src/compute-view/utils/resolve-extended-views.ts +8 -7
- package/src/compute-view/utils/resolve-global-rules.ts +31 -26
- package/src/compute-view/utils/topological-sort.ts +14 -14
- package/src/compute-view/utils/view-hash.ts +2 -2
- package/src/compute-view/utils/with-readable-edges.ts +9 -5
- package/src/index.ts +0 -32
- package/src/model/DeploymentElementModel.ts +182 -137
- package/src/model/DeploymentModel.ts +88 -65
- package/src/model/ElementModel.ts +92 -72
- package/src/model/LikeC4Model.ts +430 -241
- package/src/model/RelationModel.ts +69 -26
- package/src/model/__test__/fixture.ts +50 -36
- package/src/model/connection/Connection.ts +2 -2
- package/src/model/connection/deployment/DeploymentConnectionModel.ts +21 -24
- package/src/model/connection/deployment/find.ts +1 -1
- package/src/model/connection/model/ConnectionModel.ts +21 -20
- package/src/model/connection/model/find.ts +7 -7
- package/src/model/connection/ops.ts +6 -6
- package/src/model/guards.ts +66 -14
- package/src/model/index.ts +20 -7
- package/src/model/types.ts +41 -97
- package/src/model/view/EdgeModel.ts +47 -41
- package/src/model/view/LikeC4ViewModel.ts +130 -80
- package/src/model/view/NodeModel.ts +102 -96
- package/src/theme/element.ts +1 -1
- package/src/theme/index.ts +9 -9
- package/src/theme/relationships.ts +1 -1
- package/src/types/_common.ts +21 -15
- package/src/types/aux.ts +285 -0
- package/src/types/const.ts +34 -0
- package/src/types/expression-model.ts +292 -0
- package/src/types/expression.ts +311 -0
- package/src/types/fqnRef.ts +88 -0
- package/src/types/geometry.ts +131 -0
- package/src/types/global.ts +10 -8
- package/src/types/index.ts +39 -201
- package/src/types/model-data.ts +52 -84
- package/src/types/model-deployment.ts +87 -0
- package/src/types/model-dump.ts +72 -0
- package/src/types/model-logical.ts +111 -0
- package/src/types/model-spec.ts +81 -0
- package/src/types/operators.ts +51 -52
- package/src/types/scalar.ts +114 -0
- package/src/types/styles.ts +123 -0
- package/src/types/view-changes.ts +4 -5
- package/src/types/view-common.ts +157 -0
- package/src/types/view-computed.ts +113 -0
- package/src/types/view-layouted.ts +82 -0
- package/src/types/view-parsed.deployment.ts +40 -0
- package/src/types/view-parsed.dynamic.ts +78 -0
- package/src/types/view-parsed.element.ts +65 -0
- package/src/types/view.ts +122 -542
- package/src/utils/compare-natural.ts +43 -1
- package/src/utils/getOrCreate.ts +0 -34
- package/src/utils/index.ts +7 -12
- package/src/utils/iterable/filter.ts +1 -1
- package/src/utils/iterable/find.ts +3 -1
- package/src/utils/iterable/head.ts +22 -0
- package/src/utils/iterable/index.ts +1 -0
- package/src/utils/iterable/map.ts +1 -1
- package/src/utils/iterable/reduce.ts +1 -1
- package/src/utils/iterable/some.ts +1 -1
- package/src/utils/memoize-prop.ts +30 -0
- package/src/utils/object-hash.ts +1 -1
- package/src/utils/relations.ts +14 -11
- package/src/utils/string-hash.ts +1 -1
- package/dist/shared/core.CZR9J1Qx.d.mts +0 -146
- package/dist/shared/core.CiFKryGW.d.mts +0 -745
- package/dist/shared/core.DJvmfnEi.d.mts +0 -1153
- package/dist/shared/core.DgfwjBtu.mjs +0 -495
- package/dist/shared/core.SjLhMA7a.d.mts +0 -62
- package/src/builder/__snapshots__/Builder.spec.ts.snap +0 -374
- package/src/compute-view/element-view/predicates.ts +0 -520
- package/src/compute-view/utils/uniqueTags.ts +0 -21
- package/src/types/deployments.ts +0 -170
- package/src/types/element.ts +0 -109
- package/src/types/expression-v2-model.ts +0 -314
- package/src/types/expression-v2.ts +0 -392
- package/src/types/overview-graph.ts +0 -43
- package/src/types/relation.ts +0 -61
- package/src/types/scalars.ts +0 -39
- package/src/types/theme.ts +0 -82
- package/src/types/view-notation.ts +0 -9
- package/src/utils/graphlib.ts +0 -10
- /package/src/{errors/index.ts → utils/invariant.ts} +0 -0
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { filter, findLast, forEach, map, pipe } from 'remeda'
|
|
2
|
-
import { invariant, nonexhaustive, nonNullable } from '../../errors'
|
|
3
2
|
import { ConnectionModel } from '../../model/connection/model/ConnectionModel'
|
|
4
|
-
import { type ElementModel } from '../../model/ElementModel'
|
|
5
3
|
import { LikeC4Model } from '../../model/LikeC4Model'
|
|
6
4
|
import type { RelationshipModel } from '../../model/RelationModel'
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
ComputedElementView,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
import {
|
|
6
|
+
type AnyAux,
|
|
7
|
+
type ComputedElementView,
|
|
8
|
+
type ElementViewRule,
|
|
9
|
+
type ModelGlobals,
|
|
10
|
+
type NodeId,
|
|
11
|
+
type ParsedElementView,
|
|
12
|
+
isViewRuleAutoLayout,
|
|
13
|
+
isViewRuleGroup,
|
|
14
|
+
isViewRulePredicate,
|
|
15
|
+
ModelExpression,
|
|
16
|
+
ModelFqnExpr,
|
|
17
|
+
ModelRelationExpr,
|
|
18
|
+
whereOperatorAsPredicate,
|
|
13
19
|
} from '../../types'
|
|
14
|
-
import {
|
|
15
|
-
import { ModelLayer } from '../../types/expression-v2-model'
|
|
16
|
-
import { sortParentsFirst } from '../../utils'
|
|
20
|
+
import { invariant, nonexhaustive, nonNullable, sortParentsFirst } from '../../utils'
|
|
17
21
|
import { DefaultMap } from '../../utils/mnemonist'
|
|
18
22
|
import { applyCustomElementProperties } from '../utils/applyCustomElementProperties'
|
|
19
23
|
import { applyCustomRelationProperties } from '../utils/applyCustomRelationProperties'
|
|
@@ -39,35 +43,37 @@ import { buildNodes, NoFilter, NoWhere, toComputedEdges } from './utils'
|
|
|
39
43
|
|
|
40
44
|
function processElementPredicate(
|
|
41
45
|
// ...args:
|
|
42
|
-
// | [expr:
|
|
43
|
-
// | [expr:
|
|
44
|
-
expr:
|
|
46
|
+
// | [expr: ModelAnyFqnExpr, op: 'include', IncludePredicateCtx<ModelAnyFqnExpr>]
|
|
47
|
+
// | [expr: ModelAnyFqnExpr, op: 'exclude', ExcludePredicateCtx<ModelAnyFqnExpr>]
|
|
48
|
+
expr: ModelFqnExpr.Any,
|
|
45
49
|
op: 'include' | 'exclude',
|
|
46
|
-
ctx: Omit<PredicateCtx<
|
|
50
|
+
ctx: Omit<PredicateCtx<ModelFqnExpr.Any>, 'expr'>,
|
|
47
51
|
): Stage {
|
|
48
52
|
switch (true) {
|
|
49
|
-
case
|
|
53
|
+
case ModelFqnExpr.isCustom(expr): {
|
|
50
54
|
if (op === 'include') {
|
|
51
55
|
return processElementPredicate(expr.custom.expr, op, ctx)
|
|
52
56
|
}
|
|
53
57
|
return ctx.stage
|
|
54
58
|
}
|
|
55
|
-
case
|
|
59
|
+
case ModelFqnExpr.isWhere(expr): {
|
|
56
60
|
const where = whereOperatorAsPredicate(expr.where.condition)
|
|
57
|
-
const filterWhere =
|
|
58
|
-
|
|
61
|
+
const filterWhere = (elements: ReadonlyArray<Elem>) => {
|
|
62
|
+
return filter(elements, where)
|
|
63
|
+
}
|
|
64
|
+
return processElementPredicate(expr.where.expr, op, { ...ctx, where, filterWhere })
|
|
59
65
|
}
|
|
60
|
-
case
|
|
66
|
+
case ModelFqnExpr.isModelRef(expr) && expr.selector === 'expanded': {
|
|
61
67
|
return ExpandedElementPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
62
68
|
}
|
|
63
|
-
case
|
|
69
|
+
case ModelFqnExpr.isWildcard(expr): {
|
|
64
70
|
return WildcardPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
65
71
|
}
|
|
66
|
-
case
|
|
67
|
-
case
|
|
72
|
+
case ModelFqnExpr.isElementKindExpr(expr):
|
|
73
|
+
case ModelFqnExpr.isElementTagExpr(expr): {
|
|
68
74
|
return ElementKindOrTagPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
69
75
|
}
|
|
70
|
-
case
|
|
76
|
+
case ModelFqnExpr.isModelRef(expr): {
|
|
71
77
|
return ElementRefPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
72
78
|
}
|
|
73
79
|
default:
|
|
@@ -75,18 +81,18 @@ function processElementPredicate(
|
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
function processRelationtPredicate(
|
|
78
|
-
expr:
|
|
84
|
+
expr: ModelRelationExpr.Any,
|
|
79
85
|
op: 'include' | 'exclude',
|
|
80
|
-
ctx: Omit<PredicateCtx<
|
|
86
|
+
ctx: Omit<PredicateCtx<ModelRelationExpr.Any>, 'expr'>,
|
|
81
87
|
): Stage {
|
|
82
88
|
switch (true) {
|
|
83
|
-
case
|
|
89
|
+
case ModelRelationExpr.isCustom(expr): {
|
|
84
90
|
if (op === 'include') {
|
|
85
91
|
return processRelationtPredicate(expr.customRelation.expr, op, ctx)
|
|
86
92
|
}
|
|
87
93
|
return ctx.stage
|
|
88
94
|
}
|
|
89
|
-
case
|
|
95
|
+
case ModelRelationExpr.isWhere(expr): {
|
|
90
96
|
const where = whereOperatorAsPredicate(expr.where.condition)
|
|
91
97
|
const filterRelations = (relations: ReadonlySet<RelationshipModel>) => {
|
|
92
98
|
return new Set(filter([...relations], where))
|
|
@@ -104,16 +110,16 @@ function processRelationtPredicate(
|
|
|
104
110
|
filterWhere,
|
|
105
111
|
})
|
|
106
112
|
}
|
|
107
|
-
case
|
|
113
|
+
case ModelRelationExpr.isInOut(expr): {
|
|
108
114
|
return InOutRelationPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
109
115
|
}
|
|
110
|
-
case
|
|
116
|
+
case ModelRelationExpr.isDirect(expr): {
|
|
111
117
|
return DirectRelationExprPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
112
118
|
}
|
|
113
|
-
case
|
|
119
|
+
case ModelRelationExpr.isOutgoing(expr): {
|
|
114
120
|
return OutgoingExprPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
115
121
|
}
|
|
116
|
-
case
|
|
122
|
+
case ModelRelationExpr.isIncoming(expr): {
|
|
117
123
|
return IncomingExprPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
|
|
118
124
|
}
|
|
119
125
|
default:
|
|
@@ -121,10 +127,10 @@ function processRelationtPredicate(
|
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
export function processPredicates<
|
|
125
|
-
model: LikeC4Model<
|
|
130
|
+
export function processPredicates<A extends AnyAux>(
|
|
131
|
+
model: LikeC4Model<A>,
|
|
126
132
|
memory: Memory,
|
|
127
|
-
rules:
|
|
133
|
+
rules: ElementViewRule<A>[],
|
|
128
134
|
): Memory {
|
|
129
135
|
const ctx = {
|
|
130
136
|
model,
|
|
@@ -146,14 +152,14 @@ export function processPredicates<M extends AnyAux>(
|
|
|
146
152
|
for (const expr of exprs) {
|
|
147
153
|
let stage = op === 'include' ? memory.stageInclude(expr) : memory.stageExclude(expr)
|
|
148
154
|
switch (true) {
|
|
149
|
-
case
|
|
155
|
+
case ModelExpression.isFqnExpr(expr):
|
|
150
156
|
stage = processElementPredicate(expr, op, {
|
|
151
157
|
...ctx,
|
|
152
158
|
stage,
|
|
153
159
|
memory,
|
|
154
160
|
} as any) ?? stage
|
|
155
161
|
break
|
|
156
|
-
case
|
|
162
|
+
case ModelExpression.isRelationExpr(expr):
|
|
157
163
|
stage = processRelationtPredicate(expr, op, {
|
|
158
164
|
...ctx,
|
|
159
165
|
stage,
|
|
@@ -170,17 +176,20 @@ export function processPredicates<M extends AnyAux>(
|
|
|
170
176
|
return StageFinal.for(memory).commit()
|
|
171
177
|
}
|
|
172
178
|
|
|
173
|
-
export function computeElementView<
|
|
174
|
-
likec4model: LikeC4Model<
|
|
179
|
+
export function computeElementView<A extends AnyAux>(
|
|
180
|
+
likec4model: LikeC4Model<any>,
|
|
175
181
|
{
|
|
176
182
|
docUri: _docUri, // exclude docUri
|
|
177
|
-
rules, // exclude rules
|
|
183
|
+
rules: _rules, // exclude rules
|
|
178
184
|
...view
|
|
179
|
-
}:
|
|
180
|
-
): ComputedElementView<
|
|
181
|
-
rules = resolveGlobalRulesInElementView(
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
}: ParsedElementView<A>,
|
|
186
|
+
): ComputedElementView<A> {
|
|
187
|
+
const rules = resolveGlobalRulesInElementView(
|
|
188
|
+
_rules,
|
|
189
|
+
likec4model.globals as unknown as ModelGlobals<A>,
|
|
190
|
+
)
|
|
191
|
+
const scope = view.viewOf ? likec4model.asComputed.element(view.viewOf) : null
|
|
192
|
+
let memory = processPredicates(
|
|
184
193
|
likec4model,
|
|
185
194
|
Memory.empty(scope),
|
|
186
195
|
rules,
|
|
@@ -192,9 +201,9 @@ export function computeElementView<M extends AnyAux>(
|
|
|
192
201
|
}
|
|
193
202
|
memory = assignElementsToGroups(memory)
|
|
194
203
|
|
|
195
|
-
const nodesMap = buildNodes(memory)
|
|
204
|
+
const nodesMap = buildNodes<A>(memory)
|
|
196
205
|
|
|
197
|
-
const computedEdges = toComputedEdges(memory.connections)
|
|
206
|
+
const computedEdges = toComputedEdges(memory.connections as unknown as readonly ConnectionModel<A>[])
|
|
198
207
|
|
|
199
208
|
linkNodesWithEdges(nodesMap, computedEdges)
|
|
200
209
|
|
|
@@ -213,10 +222,11 @@ export function computeElementView<M extends AnyAux>(
|
|
|
213
222
|
|
|
214
223
|
const autoLayoutRule = findLast(rules, isViewRuleAutoLayout)
|
|
215
224
|
|
|
216
|
-
const
|
|
225
|
+
const nodeNotations = buildElementNotations(nodes)
|
|
217
226
|
|
|
218
227
|
return calcViewLayoutHash({
|
|
219
228
|
...view,
|
|
229
|
+
_stage: 'computed',
|
|
220
230
|
autoLayout: {
|
|
221
231
|
direction: autoLayoutRule?.direction ?? 'TB',
|
|
222
232
|
...(autoLayoutRule?.nodeSep && { nodeSep: autoLayoutRule.nodeSep }),
|
|
@@ -229,9 +239,9 @@ export function computeElementView<M extends AnyAux>(
|
|
|
229
239
|
}
|
|
230
240
|
return n
|
|
231
241
|
}),
|
|
232
|
-
...(
|
|
242
|
+
...(nodeNotations.length > 0 && {
|
|
233
243
|
notation: {
|
|
234
|
-
|
|
244
|
+
nodes: nodeNotations,
|
|
235
245
|
},
|
|
236
246
|
}),
|
|
237
247
|
})
|
|
@@ -246,7 +256,7 @@ function assignElementsToGroups(memory: Memory) {
|
|
|
246
256
|
}
|
|
247
257
|
const groupAssignments = new DefaultMap<NodeId, Set<Elem>>(() => new Set())
|
|
248
258
|
|
|
249
|
-
const assignedTo = new Map<
|
|
259
|
+
const assignedTo = new Map<Elem, NodesGroup['id']>()
|
|
250
260
|
|
|
251
261
|
const isAncestorAssigned = (el: Elem) => {
|
|
252
262
|
for (const parent of el.ancestors()) {
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type
|
|
3
|
-
import type { Elem } from '../_types'
|
|
1
|
+
import type { ElementModel } from '../../../model'
|
|
2
|
+
import { type AnyAux, type ElementViewRuleGroup, type NodeId, GroupElementKind } from '../../../types'
|
|
4
3
|
|
|
5
|
-
export class NodesGroup {
|
|
6
|
-
static readonly kind =
|
|
4
|
+
export class NodesGroup<A extends AnyAux = AnyAux> {
|
|
5
|
+
static readonly kind = GroupElementKind
|
|
7
6
|
|
|
8
7
|
constructor(
|
|
9
8
|
public readonly id: NodeId,
|
|
10
|
-
public readonly viewRule:
|
|
9
|
+
public readonly viewRule: ElementViewRuleGroup<A>,
|
|
11
10
|
public readonly parent: NodeId | null = null,
|
|
12
|
-
public readonly elements: ReadonlySet<
|
|
11
|
+
public readonly elements: ReadonlySet<ElementModel<A>> = new Set<ElementModel<A>>(),
|
|
13
12
|
) {
|
|
14
13
|
}
|
|
15
14
|
|
|
@@ -17,12 +16,12 @@ export class NodesGroup {
|
|
|
17
16
|
return this.elements.size === 0
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
update(elements: ReadonlySet<
|
|
19
|
+
update(elements: ReadonlySet<ElementModel<AnyAux>>): NodesGroup<A> {
|
|
21
20
|
return new NodesGroup(
|
|
22
21
|
this.id,
|
|
23
22
|
this.viewRule,
|
|
24
23
|
this.parent,
|
|
25
|
-
elements
|
|
24
|
+
elements as unknown as ReadonlySet<ElementModel<A>>,
|
|
26
25
|
)
|
|
27
26
|
}
|
|
28
27
|
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
import
|
|
4
|
-
import type { ModelLayer } from '../../../types/expression-v2-model'
|
|
5
|
-
import type { NodeId, ViewRuleGroup } from '../../../types/view'
|
|
1
|
+
import type { ConnectionModel, ElementModel } from '../../../model'
|
|
2
|
+
import type { aux, ElementViewRuleGroup as ViewRuleGroup, ModelExpression, NodeId, scalar } from '../../../types'
|
|
3
|
+
import { nonNullable } from '../../../utils'
|
|
6
4
|
import { Stack } from '../../../utils/mnemonist'
|
|
7
5
|
import { type ComputeCtx, type CtxElement, type MutableState, type StageExpression, AbstractMemory } from '../../memory'
|
|
8
6
|
import { NodesGroup } from './NodeGroup'
|
|
9
7
|
import { ActiveGroupStageExclude, StageExclude } from './stage-exclude'
|
|
10
8
|
import { ActiveGroupStageInclude, StageInclude } from './stage-include'
|
|
11
9
|
|
|
10
|
+
type A = aux.Any
|
|
11
|
+
|
|
12
12
|
export interface Ctx extends
|
|
13
13
|
ComputeCtx<
|
|
14
|
-
ElementModel
|
|
15
|
-
ConnectionModel
|
|
14
|
+
ElementModel<A>,
|
|
15
|
+
ConnectionModel<A>,
|
|
16
16
|
Memory<Ctx>,
|
|
17
17
|
StageInclude<Ctx>,
|
|
18
18
|
StageExclude,
|
|
19
|
-
|
|
19
|
+
ModelExpression<A>
|
|
20
20
|
>
|
|
21
21
|
{
|
|
22
22
|
MutableState: {
|
|
23
|
-
elements: Set<ElementModel
|
|
24
|
-
explicits: Set<ElementModel
|
|
25
|
-
final: Set<ElementModel
|
|
26
|
-
connections: ConnectionModel[]
|
|
27
|
-
groups: NodesGroup[]
|
|
23
|
+
elements: Set<ElementModel<A>>
|
|
24
|
+
explicits: Set<ElementModel<A>>
|
|
25
|
+
final: Set<ElementModel<A>>
|
|
26
|
+
connections: ConnectionModel<A>[]
|
|
27
|
+
groups: NodesGroup<A>[]
|
|
28
28
|
/*
|
|
29
29
|
* The group where explict element was added first time
|
|
30
30
|
* May be a root group
|
|
31
31
|
*/
|
|
32
|
-
explicitFirstSeenIn: Map<ElementModel
|
|
32
|
+
explicitFirstSeenIn: Map<ElementModel<A>, scalar.NodeId>
|
|
33
33
|
/**
|
|
34
34
|
* The group where element (implicit or explicit) was last seen (added or updated)
|
|
35
35
|
* Exclude root group
|
|
36
36
|
*/
|
|
37
|
-
lastSeenIn: Map<ElementModel
|
|
37
|
+
lastSeenIn: Map<ElementModel<A>, scalar.NodeId>
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export class Memory<C extends Ctx = Ctx> extends AbstractMemory<C> {
|
|
42
|
-
static empty(scope:
|
|
42
|
+
static empty<EC extends Ctx>(scope: ElementModel<any> | null): Memory<EC> {
|
|
43
43
|
return new Memory({
|
|
44
44
|
elements: new Set(),
|
|
45
45
|
explicits: new Set(),
|
|
@@ -58,22 +58,22 @@ export class Memory<C extends Ctx = Ctx> extends AbstractMemory<C> {
|
|
|
58
58
|
super(state)
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
public get groups(): ReadonlyArray<NodesGroup
|
|
61
|
+
public get groups(): ReadonlyArray<NodesGroup<A>> {
|
|
62
62
|
return this.state.groups
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
public get explicitFirstSeenIn(): ReadonlyMap<ElementModel
|
|
65
|
+
public get explicitFirstSeenIn(): ReadonlyMap<ElementModel<A>, scalar.NodeId> {
|
|
66
66
|
return this.state.explicitFirstSeenIn
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
public get lastSeenIn(): ReadonlyMap<ElementModel
|
|
69
|
+
public get lastSeenIn(): ReadonlyMap<ElementModel<A>, scalar.NodeId> {
|
|
70
70
|
return this.state.lastSeenIn
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
override stageInclude(expr: StageExpression<
|
|
73
|
+
override stageInclude(expr: StageExpression<C>): StageInclude {
|
|
74
74
|
return new StageInclude(this, expr)
|
|
75
75
|
}
|
|
76
|
-
override stageExclude(expr: StageExpression<
|
|
76
|
+
override stageExclude(expr: StageExpression<C>): StageExclude {
|
|
77
77
|
return new StageExclude(this, expr)
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -108,7 +108,7 @@ export interface ActiveGroupCtx extends Ctx {
|
|
|
108
108
|
export class ActiveGroupMemory extends Memory<ActiveGroupCtx> {
|
|
109
109
|
static enter(
|
|
110
110
|
memory: Memory,
|
|
111
|
-
rule: ViewRuleGroup
|
|
111
|
+
rule: ViewRuleGroup<any>,
|
|
112
112
|
): ActiveGroupMemory {
|
|
113
113
|
const groupId = `@gr${memory.groups.length + 1}` as NodeId
|
|
114
114
|
if (memory instanceof ActiveGroupMemory) {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { dropWhile, forEach, pipe, take, zip } from 'remeda'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { modelConnection } from '../../../model'
|
|
3
|
+
import { ModelExpression } from '../../../types'
|
|
4
4
|
import { difference, isAncestor, isIterable } from '../../../utils'
|
|
5
5
|
import { toArray } from '../../../utils/iterable'
|
|
6
6
|
import { type CtxConnection, type StageExpression, AbstractStageInclude } from '../../memory'
|
|
7
7
|
import { type ActiveGroupCtx, type ActiveGroupMemory, type Ctx } from './memory'
|
|
8
8
|
|
|
9
|
+
const { findConnection, findConnectionsBetween } = modelConnection
|
|
10
|
+
|
|
9
11
|
export type Elem = Ctx['Element']
|
|
10
12
|
|
|
11
13
|
export class StageInclude<C extends Ctx = Ctx> extends AbstractStageInclude<C> {
|
|
@@ -62,7 +64,7 @@ export class StageInclude<C extends Ctx = Ctx> extends AbstractStageInclude<C> {
|
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
protected override processConnections(connections: CtxConnection<Ctx>[]) {
|
|
65
|
-
if (
|
|
67
|
+
if (ModelExpression.isRelationExpr(this.expression)) {
|
|
66
68
|
return connections
|
|
67
69
|
}
|
|
68
70
|
|
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
import { anyPass } from 'remeda'
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { isDescendantOf } from '../../../utils
|
|
6
|
-
import { ifilter, toArray } from '../../../utils/iterable'
|
|
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'
|
|
7
6
|
import type { Elem, Memory, PredicateCtx } from '../_types'
|
|
8
7
|
|
|
8
|
+
export const { findConnection, findConnectionsBetween, findConnectionsWithin } = modelConnection
|
|
9
|
+
|
|
9
10
|
/**
|
|
10
11
|
* Resolve elements from the model based on the given expression
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
|
-
export function resolveElements
|
|
14
|
+
export function resolveElements<A extends AnyAux>(
|
|
15
|
+
model: LikeC4Model<A>,
|
|
16
|
+
expr: ModelFqnExpr.NonWildcard<A>,
|
|
17
|
+
): ElementModel<A>[] {
|
|
14
18
|
switch (true) {
|
|
15
|
-
case
|
|
19
|
+
case ModelFqnExpr.isElementKindExpr(expr): {
|
|
16
20
|
return [...ifilter(model.elements(), el => {
|
|
17
21
|
return expr.isEqual === (el.kind === expr.elementKind)
|
|
18
22
|
})]
|
|
19
23
|
}
|
|
20
|
-
case
|
|
24
|
+
case ModelFqnExpr.isElementTagExpr(expr): {
|
|
21
25
|
return [...ifilter(model.elements(), el => {
|
|
22
26
|
return expr.isEqual === el.tags.includes(expr.elementTag)
|
|
23
27
|
})]
|
|
24
28
|
}
|
|
25
29
|
case expr.selector === 'expanded': {
|
|
26
|
-
const element = model.element(
|
|
30
|
+
const element = model.element(FqnRef.flatten(expr.ref))
|
|
27
31
|
return [
|
|
28
32
|
element,
|
|
29
33
|
...element.children(),
|
|
@@ -31,12 +35,12 @@ export function resolveElements(model: LikeC4Model, expr: ModelLayer.FqnExpr.Non
|
|
|
31
35
|
}
|
|
32
36
|
case expr.selector === 'children':
|
|
33
37
|
case expr.selector === 'descendants': {
|
|
34
|
-
const element = model.element(
|
|
38
|
+
const element = model.element(FqnRef.flatten(expr.ref))
|
|
35
39
|
let children = expr.selector === 'children' ? toArray(element.children()) : toArray(element.descendants())
|
|
36
40
|
return children && children.length > 0 ? children : [element]
|
|
37
41
|
}
|
|
38
|
-
case
|
|
39
|
-
return [model.element(
|
|
42
|
+
case ModelFqnExpr.isModelRef(expr): {
|
|
43
|
+
return [model.element(FqnRef.flatten(expr.ref))]
|
|
40
44
|
}
|
|
41
45
|
default:
|
|
42
46
|
nonexhaustive(expr)
|
|
@@ -70,14 +74,14 @@ export function includeDescendantsFromMemory(elements: Elem[], memory: Memory):
|
|
|
70
74
|
* Combination of `resolveElements` and `includeDescendantsFromMemory`
|
|
71
75
|
*/
|
|
72
76
|
export function resolveAndIncludeFromMemory(
|
|
73
|
-
nonWildcard:
|
|
77
|
+
nonWildcard: ModelFqnExpr.NonWildcard,
|
|
74
78
|
{ memory, model }: Pick<PredicateCtx, 'model' | 'memory'>,
|
|
75
79
|
): Elem[] {
|
|
76
80
|
const resolved = resolveElements(model, nonWildcard)
|
|
77
81
|
// We include from memory only if the expression is:
|
|
78
82
|
// - expanded element
|
|
79
83
|
// - element reference with or with children (but not descendants - they are already included)
|
|
80
|
-
if (
|
|
84
|
+
if (ModelFqnExpr.isModelRef(nonWildcard)) {
|
|
81
85
|
if (nonWildcard.selector === 'descendants') {
|
|
82
86
|
return resolved
|
|
83
87
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ModelLayer } from '../../../types/expression-v2-model'
|
|
1
|
+
import { type AnyAux, type ModelFqnExpr, FqnRef } from '../../../types'
|
|
3
2
|
import type { Elem, PredicateExecutor } from '../_types'
|
|
4
|
-
import { resolveElements } from './_utils'
|
|
3
|
+
import { findConnectionsWithin, resolveElements } from './_utils'
|
|
5
4
|
|
|
6
|
-
export const ExpandedElementPredicate: PredicateExecutor<
|
|
5
|
+
export const ExpandedElementPredicate: PredicateExecutor<ModelFqnExpr.Ref<AnyAux>> = {
|
|
7
6
|
include: ({ expr, model, stage, where }) => {
|
|
8
|
-
const parent = model.element(
|
|
7
|
+
const parent = model.element(FqnRef.flatten(expr.ref))
|
|
9
8
|
if (where(parent)) {
|
|
10
9
|
stage.addExplicit(parent)
|
|
11
10
|
stage.connectWithExisting(parent)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { ModelLayer } from '../../../types/expression-v2-model'
|
|
1
|
+
import type { AnyAux, ModelFqnExpr } from '../../../types'
|
|
3
2
|
import type { PredicateExecutor } from '../_types'
|
|
4
|
-
import { resolveElements } from './_utils'
|
|
3
|
+
import { findConnectionsWithin, resolveElements } from './_utils'
|
|
5
4
|
|
|
6
5
|
export const ElementKindOrTagPredicate: PredicateExecutor<
|
|
7
|
-
|
|
6
|
+
ModelFqnExpr.ElementKindExpr<AnyAux> | ModelFqnExpr.ElementTagExpr<AnyAux>
|
|
8
7
|
> = {
|
|
9
8
|
include: ({ expr, model, stage, filterWhere }) => {
|
|
10
9
|
const elements = filterWhere(resolveElements(model, expr))
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ModelLayer } from '../../../types/expression-v2-model'
|
|
1
|
+
import type { AnyAux, ModelFqnExpr } from '../../../types'
|
|
3
2
|
import type { Elem, PredicateExecutor } from '../_types'
|
|
4
|
-
import { resolveElements } from './_utils'
|
|
3
|
+
import { findConnectionsWithin, resolveElements } from './_utils'
|
|
5
4
|
|
|
6
|
-
export const ElementRefPredicate: PredicateExecutor<
|
|
5
|
+
export const ElementRefPredicate: PredicateExecutor<ModelFqnExpr.Ref<AnyAux>> = {
|
|
7
6
|
include: ({ expr, model, stage, filterWhere }) => {
|
|
8
7
|
const elements = filterWhere(resolveElements(model, expr))
|
|
9
8
|
if (elements.length === 0) {
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { concat, constant, flatMap, hasAtLeast, map, partition, pipe, piped, prop, when } from 'remeda'
|
|
2
|
-
import {
|
|
3
|
-
import { ConnectionModel
|
|
4
|
-
import type
|
|
5
|
-
import
|
|
6
|
-
import { ModelLayer } from '../../../types/expression-v2-model'
|
|
7
|
-
import { isSameHierarchy } from '../../../utils'
|
|
2
|
+
import type { RelationshipModel } from '../../../model'
|
|
3
|
+
import { ConnectionModel } from '../../../model'
|
|
4
|
+
import { type AnyAux, type ModelRelationExpr, FqnRef, ModelFqnExpr } from '../../../types'
|
|
5
|
+
import { invariant, isSameHierarchy } from '../../../utils'
|
|
8
6
|
import { ifilter, iflat, iunique, toArray, toSet } from '../../../utils/iterable'
|
|
9
7
|
import { intersection, union } from '../../../utils/set'
|
|
10
8
|
import type { Elem, PredicateCtx, PredicateExecutor } from '../_types'
|
|
11
9
|
import { NoWhere } from '../utils'
|
|
12
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
findConnectionsBetween,
|
|
12
|
+
findConnectionsWithin,
|
|
13
|
+
includeDescendantsFromMemory,
|
|
14
|
+
resolveAndIncludeFromMemory,
|
|
15
|
+
resolveElements,
|
|
16
|
+
} from './_utils'
|
|
13
17
|
|
|
14
|
-
const isWildcard =
|
|
18
|
+
const isWildcard = ModelFqnExpr.isWildcard
|
|
15
19
|
|
|
16
|
-
export const DirectRelationExprPredicate: PredicateExecutor<
|
|
20
|
+
export const DirectRelationExprPredicate: PredicateExecutor<ModelRelationExpr.Direct<AnyAux>> = {
|
|
17
21
|
include: ({ expr: { source, target, isBidirectional = false }, memory, model, stage, where, filterWhere }) => {
|
|
18
22
|
const sourceIsWildcard = isWildcard(source)
|
|
19
23
|
const targetIsWildcard = isWildcard(target)
|
|
@@ -283,7 +287,7 @@ export const DirectRelationExprPredicate: PredicateExecutor<ModelLayer.RelationE
|
|
|
283
287
|
* Resolve elements for both source and target, when one of them is a wildcard
|
|
284
288
|
*/
|
|
285
289
|
function resolveWildcard(
|
|
286
|
-
nonWildcard:
|
|
290
|
+
nonWildcard: ModelFqnExpr.NonWildcard,
|
|
287
291
|
{ memory, model }: Pick<PredicateCtx, 'model' | 'memory'>,
|
|
288
292
|
): [elements: Elem[], wildcard: Elem[]] {
|
|
289
293
|
let sources = resolveElements(model, nonWildcard)
|
|
@@ -291,8 +295,8 @@ function resolveWildcard(
|
|
|
291
295
|
return [[], []]
|
|
292
296
|
}
|
|
293
297
|
|
|
294
|
-
if (
|
|
295
|
-
const parent = model.element(
|
|
298
|
+
if (ModelFqnExpr.isModelRef(nonWildcard)) {
|
|
299
|
+
const parent = model.element(FqnRef.flatten(nonWildcard.ref))
|
|
296
300
|
const targets = toArray(parent.ascendingSiblings())
|
|
297
301
|
return [
|
|
298
302
|
includeDescendantsFromMemory(sources, memory),
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { unique } from 'remeda'
|
|
2
|
-
import { type ConnectionModel
|
|
3
|
-
import type { RelationshipModel } from '../../../model
|
|
4
|
-
import type
|
|
5
|
-
import { ModelLayer } from '../../../types/expression-v2-model'
|
|
2
|
+
import { type ConnectionModel } from '../../../model'
|
|
3
|
+
import type { RelationshipModel } from '../../../model'
|
|
4
|
+
import { type AnyAux, type ModelRelationExpr, ModelFqnExpr } from '../../../types'
|
|
6
5
|
import { toArray, toSet } from '../../../utils/iterable/to'
|
|
7
6
|
import type { PredicateExecutor } from '../_types'
|
|
8
|
-
import { resolveAndIncludeFromMemory, resolveElements } from './_utils'
|
|
7
|
+
import { findConnectionsBetween, resolveAndIncludeFromMemory, resolveElements } from './_utils'
|
|
9
8
|
|
|
10
|
-
export const InOutRelationPredicate: PredicateExecutor<
|
|
9
|
+
export const InOutRelationPredicate: PredicateExecutor<ModelRelationExpr.InOut<AnyAux>> = {
|
|
11
10
|
include: ({ expr: { inout }, scope, model, memory, stage, filterWhere }) => {
|
|
12
11
|
const connections = [] as ConnectionModel<AnyAux>[]
|
|
13
|
-
if (
|
|
12
|
+
if (ModelFqnExpr.isWildcard(inout)) {
|
|
14
13
|
if (!scope) {
|
|
15
14
|
return
|
|
16
15
|
}
|
|
@@ -46,7 +45,7 @@ export const InOutRelationPredicate: PredicateExecutor<ModelLayer.RelationExpr.I
|
|
|
46
45
|
},
|
|
47
46
|
exclude: ({ expr: { inout }, model, scope, stage, where }) => {
|
|
48
47
|
const excluded = [] as RelationshipModel[]
|
|
49
|
-
if (
|
|
48
|
+
if (ModelFqnExpr.isWildcard(inout)) {
|
|
50
49
|
if (!scope) {
|
|
51
50
|
return
|
|
52
51
|
}
|