@likec4/core 1.31.0 → 1.32.1

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 (185) hide show
  1. package/README.md +407 -5
  2. package/dist/builder/index.d.mts +221 -42
  3. package/dist/builder/index.mjs +118 -65
  4. package/dist/compute-view/index.d.mts +23 -7
  5. package/dist/compute-view/index.mjs +11 -6
  6. package/dist/compute-view/relationships-view/index.d.mts +9 -7
  7. package/dist/compute-view/relationships-view/index.mjs +3 -2
  8. package/dist/index.d.mts +10 -14
  9. package/dist/index.mjs +9 -6
  10. package/dist/model/index.d.mts +173 -19
  11. package/dist/model/index.mjs +6 -1
  12. package/dist/shared/core.BaYE_r29.d.mts +258 -0
  13. package/dist/shared/core.Bk7wEZFG.mjs +276 -0
  14. package/dist/shared/core.BrCnZFTn.mjs +32 -0
  15. package/dist/shared/core.BuO4ncfY.d.mts +146 -0
  16. package/dist/shared/{core.Bq753SYD.mjs → core.CBpKAlhj.mjs} +2012 -4422
  17. package/dist/shared/core.CUYDgv2-.mjs +214 -0
  18. package/dist/shared/{core.Cu-UdkSl.mjs → core.CpXlRyE5.mjs} +7 -494
  19. package/dist/shared/{core.C-YXI-43.mjs → core.Cy9smucx.mjs} +3 -1
  20. package/dist/shared/core.CywrQs86.d.mts +31 -0
  21. package/dist/shared/core.DXzRBkuI.d.mts +1264 -0
  22. package/dist/shared/core.DoK86JEe.mjs +518 -0
  23. package/dist/shared/{core.D2830qgg.d.mts → core.Pf5I9o0e.d.mts} +1 -1
  24. package/dist/shared/core.cbA9VZ02.mjs +2681 -0
  25. package/dist/shared/{core.CQXU9DF7.mjs → core.rmvsy0n3.mjs} +23 -32
  26. package/dist/shared/core.znRaUX_A.d.mts +920 -0
  27. package/dist/types/aux.d.mts +3 -0
  28. package/dist/types/aux.mjs +1 -0
  29. package/dist/types/index.d.mts +7 -45
  30. package/dist/types/index.mjs +130 -3
  31. package/dist/utils/index.d.mts +221 -53
  32. package/dist/utils/index.mjs +14 -10
  33. package/package.json +16 -8
  34. package/src/builder/Builder.deploymentModel.ts +82 -18
  35. package/src/builder/Builder.element.ts +40 -20
  36. package/src/builder/Builder.model.ts +66 -17
  37. package/src/builder/Builder.ts +168 -76
  38. package/src/builder/Builder.view-common.ts +35 -17
  39. package/src/builder/Builder.view-deployment.ts +25 -25
  40. package/src/builder/Builder.view-element.ts +13 -12
  41. package/src/builder/Builder.views.ts +12 -7
  42. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +62 -34
  43. package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +319 -0
  44. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +45 -24
  45. package/src/builder/_types.ts +34 -27
  46. package/src/compute-view/compute-view.ts +31 -34
  47. package/src/compute-view/deployment-view/__test__/TestHelper.ts +27 -14
  48. package/src/compute-view/deployment-view/__test__/fixture.ts +15 -13
  49. package/src/compute-view/deployment-view/_types.ts +10 -10
  50. package/src/compute-view/deployment-view/clean-connections.ts +5 -7
  51. package/src/compute-view/deployment-view/compute.ts +16 -13
  52. package/src/compute-view/deployment-view/memory/memory.ts +5 -6
  53. package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +4 -5
  54. package/src/compute-view/deployment-view/predicates/relation-direct.ts +25 -50
  55. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +5 -7
  56. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +7 -11
  57. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +7 -10
  58. package/src/compute-view/deployment-view/predicates/utils.ts +37 -31
  59. package/src/compute-view/deployment-view/predicates/wildcard.ts +3 -2
  60. package/src/compute-view/deployment-view/stages/stage-final.ts +2 -2
  61. package/src/compute-view/deployment-view/stages/stage-include.ts +1 -1
  62. package/src/compute-view/deployment-view/utils.ts +79 -72
  63. package/src/compute-view/dynamic-view/__test__/fixture.ts +20 -11
  64. package/src/compute-view/dynamic-view/compute.ts +60 -53
  65. package/src/compute-view/element-view/__test__/TestHelper.ts +53 -29
  66. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +26 -26
  67. package/src/compute-view/element-view/__test__/fixture.ts +134 -83
  68. package/src/compute-view/element-view/_types.ts +14 -19
  69. package/src/compute-view/element-view/clean-connections.ts +12 -8
  70. package/src/compute-view/element-view/compute.ts +61 -51
  71. package/src/compute-view/element-view/memory/NodeGroup.ts +8 -9
  72. package/src/compute-view/element-view/memory/memory.ts +22 -22
  73. package/src/compute-view/element-view/memory/stage-include.ts +5 -3
  74. package/src/compute-view/element-view/predicates/_utils.ts +18 -14
  75. package/src/compute-view/element-view/predicates/element-expand.ts +4 -5
  76. package/src/compute-view/element-view/predicates/element-kind-tag.ts +3 -4
  77. package/src/compute-view/element-view/predicates/element-ref.ts +3 -4
  78. package/src/compute-view/element-view/predicates/relation-direct.ts +16 -12
  79. package/src/compute-view/element-view/predicates/relation-in-out.ts +7 -8
  80. package/src/compute-view/element-view/predicates/relation-in.ts +19 -26
  81. package/src/compute-view/element-view/predicates/relation-out.ts +20 -21
  82. package/src/compute-view/element-view/predicates/wildcard.ts +3 -3
  83. package/src/compute-view/element-view/utils.ts +25 -23
  84. package/src/compute-view/index.ts +1 -1
  85. package/src/compute-view/memory/AbstractStageExclude.ts +3 -4
  86. package/src/compute-view/memory/AbstractStageInclude.ts +1 -1
  87. package/src/compute-view/memory/_types.ts +3 -2
  88. package/src/compute-view/relationships-view/_types.ts +3 -4
  89. package/src/compute-view/relationships-view/compute.ts +8 -11
  90. package/src/compute-view/relationships-view/layout.ts +6 -6
  91. package/src/compute-view/relationships-view/utils.ts +4 -4
  92. package/src/compute-view/utils/ancestorsOfNode.ts +7 -7
  93. package/src/compute-view/utils/applyCustomElementProperties.ts +16 -8
  94. package/src/compute-view/utils/applyCustomRelationProperties.ts +19 -9
  95. package/src/compute-view/utils/applyViewRuleStyles.ts +18 -10
  96. package/src/compute-view/utils/buildComputedNodes.ts +40 -40
  97. package/src/compute-view/utils/buildElementNotations.ts +14 -14
  98. package/src/compute-view/utils/elementExpressionToPredicate.ts +14 -15
  99. package/src/compute-view/utils/link-nodes-with-edges.ts +6 -4
  100. package/src/compute-view/utils/merge-props-from-relationships.ts +52 -20
  101. package/src/compute-view/utils/relationExpressionToPredicates.ts +19 -19
  102. package/src/compute-view/utils/resolve-extended-views.ts +8 -7
  103. package/src/compute-view/utils/resolve-global-rules.ts +31 -26
  104. package/src/compute-view/utils/topological-sort.ts +14 -14
  105. package/src/compute-view/utils/view-hash.ts +2 -2
  106. package/src/compute-view/utils/with-readable-edges.ts +9 -5
  107. package/src/index.ts +0 -32
  108. package/src/model/DeploymentElementModel.ts +171 -144
  109. package/src/model/DeploymentModel.ts +88 -65
  110. package/src/model/ElementModel.ts +85 -74
  111. package/src/model/LikeC4Model.ts +430 -241
  112. package/src/model/RelationModel.ts +63 -29
  113. package/src/model/__test__/fixture.ts +50 -36
  114. package/src/model/connection/Connection.ts +2 -2
  115. package/src/model/connection/deployment/DeploymentConnectionModel.ts +21 -24
  116. package/src/model/connection/deployment/find.ts +1 -1
  117. package/src/model/connection/model/ConnectionModel.ts +21 -20
  118. package/src/model/connection/model/find.ts +7 -7
  119. package/src/model/connection/ops.ts +6 -6
  120. package/src/model/guards.ts +66 -14
  121. package/src/model/index.ts +20 -7
  122. package/src/model/types.ts +41 -97
  123. package/src/model/view/EdgeModel.ts +47 -41
  124. package/src/model/view/LikeC4ViewModel.ts +130 -80
  125. package/src/model/view/NodeModel.ts +102 -96
  126. package/src/theme/element.ts +1 -1
  127. package/src/theme/index.ts +9 -9
  128. package/src/theme/relationships.ts +1 -1
  129. package/src/types/_common.ts +21 -15
  130. package/src/types/aux.ts +285 -0
  131. package/src/types/const.ts +34 -0
  132. package/src/types/expression-model.ts +292 -0
  133. package/src/types/expression.ts +311 -0
  134. package/src/types/fqnRef.ts +88 -0
  135. package/src/types/geometry.ts +131 -0
  136. package/src/types/global.ts +10 -8
  137. package/src/types/index.ts +39 -201
  138. package/src/types/model-data.ts +52 -84
  139. package/src/types/model-deployment.ts +87 -0
  140. package/src/types/model-dump.ts +72 -0
  141. package/src/types/model-logical.ts +111 -0
  142. package/src/types/model-spec.ts +81 -0
  143. package/src/types/operators.ts +51 -52
  144. package/src/types/scalar.ts +114 -0
  145. package/src/types/{theme.ts → styles.ts} +55 -15
  146. package/src/types/view-changes.ts +4 -5
  147. package/src/types/view-common.ts +157 -0
  148. package/src/types/view-computed.ts +113 -0
  149. package/src/types/view-layouted.ts +82 -0
  150. package/src/types/view-parsed.deployment.ts +40 -0
  151. package/src/types/view-parsed.dynamic.ts +78 -0
  152. package/src/types/view-parsed.element.ts +65 -0
  153. package/src/types/view.ts +122 -542
  154. package/src/utils/compare-natural.ts +43 -1
  155. package/src/utils/getOrCreate.ts +0 -34
  156. package/src/utils/index.ts +7 -12
  157. package/src/utils/iterable/filter.ts +1 -1
  158. package/src/utils/iterable/find.ts +3 -1
  159. package/src/utils/iterable/head.ts +22 -0
  160. package/src/utils/iterable/index.ts +1 -0
  161. package/src/utils/iterable/map.ts +1 -1
  162. package/src/utils/iterable/reduce.ts +1 -1
  163. package/src/utils/iterable/some.ts +1 -1
  164. package/src/utils/memoize-prop.ts +30 -0
  165. package/src/utils/object-hash.ts +1 -1
  166. package/src/utils/relations.ts +14 -11
  167. package/src/utils/string-hash.ts +1 -1
  168. package/dist/shared/core.CQDU11hR.d.mts +0 -753
  169. package/dist/shared/core.DJvmfnEi.d.mts +0 -1153
  170. package/dist/shared/core.DgfwjBtu.mjs +0 -495
  171. package/dist/shared/core.Dx7siloV.d.mts +0 -146
  172. package/dist/shared/core.SjLhMA7a.d.mts +0 -62
  173. package/src/builder/__snapshots__/Builder.spec.ts.snap +0 -374
  174. package/src/compute-view/element-view/predicates.ts +0 -520
  175. package/src/compute-view/utils/uniqueTags.ts +0 -21
  176. package/src/types/deployments.ts +0 -170
  177. package/src/types/element.ts +0 -109
  178. package/src/types/expression-v2-model.ts +0 -314
  179. package/src/types/expression-v2.ts +0 -392
  180. package/src/types/overview-graph.ts +0 -43
  181. package/src/types/relation.ts +0 -61
  182. package/src/types/scalars.ts +0 -39
  183. package/src/types/view-notation.ts +0 -9
  184. package/src/utils/graphlib.ts +0 -10
  185. /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 type { AnyAux } from '../../model/types'
8
- import type {
9
- ComputedElementView,
10
- ElementView,
11
- NodeId,
12
- ViewRule,
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 { isViewRuleAutoLayout, isViewRuleGroup, isViewRulePredicate, whereOperatorAsPredicate } from '../../types'
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: ModelLayer.AnyFqnExpr, op: 'include', IncludePredicateCtx<ModelLayer.AnyFqnExpr>]
43
- // | [expr: ModelLayer.AnyFqnExpr, op: 'exclude', ExcludePredicateCtx<ModelLayer.AnyFqnExpr>]
44
- expr: ModelLayer.AnyFqnExpr,
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<ModelLayer.AnyFqnExpr>, 'expr'>,
50
+ ctx: Omit<PredicateCtx<ModelFqnExpr.Any>, 'expr'>,
47
51
  ): Stage {
48
52
  switch (true) {
49
- case ModelLayer.FqnExpr.isCustom(expr): {
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 ModelLayer.FqnExpr.isWhere(expr): {
59
+ case ModelFqnExpr.isWhere(expr): {
56
60
  const where = whereOperatorAsPredicate(expr.where.condition)
57
- const filterWhere = filter<Elem>(where)
58
- return processElementPredicate(expr.where.expr, op, { ...ctx, where, filterWhere } as any)
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 ModelLayer.FqnExpr.isModelRef(expr) && expr.selector === 'expanded': {
66
+ case ModelFqnExpr.isModelRef(expr) && expr.selector === 'expanded': {
61
67
  return ExpandedElementPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
62
68
  }
63
- case ModelLayer.FqnExpr.isWildcard(expr): {
69
+ case ModelFqnExpr.isWildcard(expr): {
64
70
  return WildcardPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
65
71
  }
66
- case ModelLayer.FqnExpr.isElementKindExpr(expr):
67
- case ModelLayer.FqnExpr.isElementTagExpr(expr): {
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 ModelLayer.FqnExpr.isModelRef(expr): {
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: ModelLayer.AnyRelationExpr,
84
+ expr: ModelRelationExpr.Any,
79
85
  op: 'include' | 'exclude',
80
- ctx: Omit<PredicateCtx<ModelLayer.AnyRelationExpr>, 'expr'>,
86
+ ctx: Omit<PredicateCtx<ModelRelationExpr.Any>, 'expr'>,
81
87
  ): Stage {
82
88
  switch (true) {
83
- case ModelLayer.RelationExpr.isCustom(expr): {
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 ModelLayer.RelationExpr.isWhere(expr): {
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 ModelLayer.RelationExpr.isInOut(expr): {
113
+ case ModelRelationExpr.isInOut(expr): {
108
114
  return InOutRelationPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
109
115
  }
110
- case ModelLayer.RelationExpr.isDirect(expr): {
116
+ case ModelRelationExpr.isDirect(expr): {
111
117
  return DirectRelationExprPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
112
118
  }
113
- case ModelLayer.RelationExpr.isOutgoing(expr): {
119
+ case ModelRelationExpr.isOutgoing(expr): {
114
120
  return OutgoingExprPredicate[op]({ ...ctx, expr } as any) ?? ctx.stage
115
121
  }
116
- case ModelLayer.RelationExpr.isIncoming(expr): {
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<M extends AnyAux>(
125
- model: LikeC4Model<M>,
130
+ export function processPredicates<A extends AnyAux>(
131
+ model: LikeC4Model<A>,
126
132
  memory: Memory,
127
- rules: ViewRule[],
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 ModelLayer.isAnyFqnExpr(expr):
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 ModelLayer.isAnyRelationExpr(expr):
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<M extends AnyAux>(
174
- likec4model: LikeC4Model<M>,
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
- }: ElementView,
180
- ): ComputedElementView<M['ViewId']> {
181
- rules = resolveGlobalRulesInElementView(rules, likec4model.globals())
182
- const scope = view.viewOf ? likec4model.element(view.viewOf) : null
183
- let memory = processPredicates<M>(
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 elementNotations = buildElementNotations(nodes)
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
- ...(elementNotations.length > 0 && {
242
+ ...(nodeNotations.length > 0 && {
233
243
  notation: {
234
- elements: elementNotations,
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<ElementModel, NodesGroup['id']>()
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 { ElementKind } from '../../../types/element'
2
- import { type NodeId, type ViewRuleGroup } from '../../../types/view'
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 = ElementKind.Group
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: ViewRuleGroup,
9
+ public readonly viewRule: ElementViewRuleGroup<A>,
11
10
  public readonly parent: NodeId | null = null,
12
- public readonly elements: ReadonlySet<Elem> = new Set<Elem>(),
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<Elem>): NodesGroup {
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 { nonNullable } from '../../../errors'
2
- import type { ConnectionModel } from '../../../model/connection'
3
- import type { ElementModel } from '../../../model/ElementModel'
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
- ModelLayer.Expression
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, NodesGroup['id']>
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, NodesGroup['id']>
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: CtxElement<Ctx> | null): Memory {
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, NodesGroup['id']> {
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, NodesGroup['id']> {
69
+ public get lastSeenIn(): ReadonlyMap<ElementModel<A>, scalar.NodeId> {
70
70
  return this.state.lastSeenIn
71
71
  }
72
72
 
73
- override stageInclude(expr: StageExpression<Ctx>): StageInclude {
73
+ override stageInclude(expr: StageExpression<C>): StageInclude {
74
74
  return new StageInclude(this, expr)
75
75
  }
76
- override stageExclude(expr: StageExpression<Ctx>): StageExclude {
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 { findConnection, findConnectionsBetween } from '../../../model/connection/model'
3
- import { ModelLayer } from '../../../types/expression-v2-model'
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 (ModelLayer.isAnyRelationExpr(this.expression)) {
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 { nonexhaustive } from '../../../errors'
3
- import type { LikeC4Model } from '../../../model/LikeC4Model'
4
- import { ModelLayer } from '../../../types/expression-v2-model'
5
- import { isDescendantOf } from '../../../utils/fqn'
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(model: LikeC4Model, expr: ModelLayer.FqnExpr.NonWildcard): Elem[] {
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 ModelLayer.FqnExpr.isElementKindExpr(expr): {
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 ModelLayer.FqnExpr.isElementTagExpr(expr): {
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(ModelLayer.FqnRef.toFqn(expr.ref))
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(ModelLayer.FqnRef.toFqn(expr.ref))
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 ModelLayer.FqnExpr.isModelRef(expr): {
39
- return [model.element(ModelLayer.FqnRef.toFqn(expr.ref))]
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: ModelLayer.FqnExpr.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 (ModelLayer.FqnExpr.isModelRef(nonWildcard)) {
84
+ if (ModelFqnExpr.isModelRef(nonWildcard)) {
81
85
  if (nonWildcard.selector === 'descendants') {
82
86
  return resolved
83
87
  }
@@ -1,11 +1,10 @@
1
- import { findConnectionsWithin } from '../../../model/connection/model'
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<ModelLayer.FqnExpr.ModelRef> = {
5
+ export const ExpandedElementPredicate: PredicateExecutor<ModelFqnExpr.Ref<AnyAux>> = {
7
6
  include: ({ expr, model, stage, where }) => {
8
- const parent = model.element(ModelLayer.FqnRef.toFqn(expr.ref))
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 { findConnectionsWithin } from '../../../model/connection/model'
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
- ModelLayer.FqnExpr.ElementKindExpr | ModelLayer.FqnExpr.ElementTagExpr
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 { findConnectionsWithin } from '../../../model/connection/model'
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<ModelLayer.FqnExpr.ModelRef> = {
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 { invariant } from '../../../errors'
3
- import { ConnectionModel, findConnectionsBetween, findConnectionsWithin } from '../../../model/connection/model'
4
- import type { RelationshipModel } from '../../../model/RelationModel'
5
- import type { AnyAux } from '../../../model/types'
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 { includeDescendantsFromMemory, resolveAndIncludeFromMemory, resolveElements } from './_utils'
10
+ import {
11
+ findConnectionsBetween,
12
+ findConnectionsWithin,
13
+ includeDescendantsFromMemory,
14
+ resolveAndIncludeFromMemory,
15
+ resolveElements,
16
+ } from './_utils'
13
17
 
14
- const isWildcard = ModelLayer.FqnExpr.isWildcard
18
+ const isWildcard = ModelFqnExpr.isWildcard
15
19
 
16
- export const DirectRelationExprPredicate: PredicateExecutor<ModelLayer.RelationExpr.Direct> = {
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: ModelLayer.FqnExpr.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 (ModelLayer.FqnExpr.isModelRef(nonWildcard)) {
295
- const parent = model.element(ModelLayer.FqnRef.toFqn(nonWildcard.ref))
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, findConnectionsBetween } from '../../../model/connection/model'
3
- import type { RelationshipModel } from '../../../model/RelationModel'
4
- import type { AnyAux } from '../../../model/types'
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<ModelLayer.RelationExpr.InOut> = {
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 (ModelLayer.FqnExpr.isWildcard(inout)) {
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 (ModelLayer.FqnExpr.isWildcard(inout)) {
48
+ if (ModelFqnExpr.isWildcard(inout)) {
50
49
  if (!scope) {
51
50
  return
52
51
  }