@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.
Files changed (186) 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 +10 -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.CAcZ6_cP.mjs → core.CBpKAlhj.mjs} +1742 -4128
  17. package/dist/shared/core.CCWXGc6G.d.mts +920 -0
  18. package/dist/shared/core.CUYDgv2-.mjs +214 -0
  19. package/dist/shared/{core.Cu-UdkSl.mjs → core.CpXlRyE5.mjs} +7 -494
  20. package/dist/shared/{core.C-YXI-43.mjs → core.Cy9smucx.mjs} +3 -1
  21. package/dist/shared/core.CywrQs86.d.mts +31 -0
  22. package/dist/shared/core.DoK86JEe.mjs +518 -0
  23. package/dist/shared/core.Dpq3P3YJ.d.mts +1265 -0
  24. package/dist/shared/{core.D2830qgg.d.mts → core.Pf5I9o0e.d.mts} +1 -1
  25. package/dist/shared/core.cbA9VZ02.mjs +2681 -0
  26. package/dist/shared/{core.CQXU9DF7.mjs → core.rmvsy0n3.mjs} +23 -32
  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 +19 -10
  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 +182 -137
  109. package/src/model/DeploymentModel.ts +88 -65
  110. package/src/model/ElementModel.ts +92 -72
  111. package/src/model/LikeC4Model.ts +430 -241
  112. package/src/model/RelationModel.ts +69 -26
  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/styles.ts +123 -0
  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.CZR9J1Qx.d.mts +0 -146
  169. package/dist/shared/core.CiFKryGW.d.mts +0 -745
  170. package/dist/shared/core.DJvmfnEi.d.mts +0 -1153
  171. package/dist/shared/core.DgfwjBtu.mjs +0 -495
  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/theme.ts +0 -82
  184. package/src/types/view-notation.ts +0 -9
  185. package/src/utils/graphlib.ts +0 -10
  186. /package/src/{errors/index.ts → utils/invariant.ts} +0 -0
@@ -0,0 +1,292 @@
1
+ import type { ExclusiveUnion } from './_common'
2
+ import type * as aux from './aux'
3
+ import type { AnyAux } from './aux'
4
+ import type { PredicateSelector } from './expression'
5
+ import { FqnRef } from './fqnRef'
6
+ import type { WhereOperator } from './operators'
7
+ import { type Icon } from './scalar'
8
+ import type {
9
+ BorderStyle,
10
+ Color,
11
+ ElementShape,
12
+ RelationshipArrowType,
13
+ RelationshipLineType,
14
+ ShapeSize,
15
+ } from './styles'
16
+
17
+ export namespace ModelFqnExpr {
18
+ export type Wildcard = {
19
+ wildcard: true
20
+ }
21
+ export function isWildcard<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelFqnExpr.Wildcard {
22
+ return 'wildcard' in expr && expr.wildcard === true
23
+ }
24
+
25
+ export interface Ref<M extends AnyAux> {
26
+ ref: FqnRef.ModelRef<M>
27
+ selector?: PredicateSelector
28
+ }
29
+ export function isModelRef<A extends AnyAux>(ref: ModelExpression<A>): ref is ModelFqnExpr.Ref<A> {
30
+ return 'ref' in ref && FqnRef.isModelRef(ref.ref)
31
+ }
32
+
33
+ export interface ElementKindExpr<A extends AnyAux = AnyAux> {
34
+ elementKind: aux.ElementKind<A>
35
+ isEqual: boolean
36
+ }
37
+ export function isElementKindExpr<A extends AnyAux>(expr: ModelExpression<A>): expr is ElementKindExpr<A> {
38
+ return 'elementKind' in expr && 'isEqual' in expr
39
+ }
40
+
41
+ export interface ElementTagExpr<A extends AnyAux> {
42
+ elementTag: aux.Tag<A>
43
+ isEqual: boolean
44
+ }
45
+ export function isElementTagExpr<A extends AnyAux>(expr: ModelExpression<A>): expr is ElementTagExpr<A> {
46
+ return 'elementTag' in expr && 'isEqual' in expr
47
+ }
48
+
49
+ export type NonWildcard<A extends AnyAux = AnyAux> = ExclusiveUnion<{
50
+ Ref: Ref<A>
51
+ ElementKind: ElementKindExpr<A>
52
+ ElementTag: ElementTagExpr<A>
53
+ }>
54
+
55
+ export interface Where<A extends AnyAux = AnyAux> {
56
+ where: {
57
+ expr: ExclusiveUnion<{
58
+ Wildcard: Wildcard
59
+ Ref: Ref<A>
60
+ ElementKind: ElementKindExpr<A>
61
+ ElementTag: ElementTagExpr<A>
62
+ }>
63
+ condition: WhereOperator<A>
64
+ }
65
+ }
66
+
67
+ export function isWhere<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelFqnExpr.Where<A> {
68
+ return 'where' in expr && is(expr.where.expr)
69
+ }
70
+
71
+ export interface Custom<A extends AnyAux = AnyAux> {
72
+ custom: {
73
+ expr: OrWhere<A>
74
+ title?: string
75
+ description?: string
76
+ technology?: string
77
+ notation?: string
78
+ shape?: ElementShape
79
+ color?: Color
80
+ icon?: Icon
81
+ border?: BorderStyle
82
+ opacity?: number
83
+ navigateTo?: aux.StrictViewId<A>
84
+ multiple?: boolean
85
+ size?: ShapeSize
86
+ padding?: ShapeSize
87
+ textSize?: ShapeSize
88
+ }
89
+ }
90
+
91
+ export function isCustom<A extends AnyAux>(expr: ModelExpression<A>): expr is Custom<A> {
92
+ return 'custom' in expr && (is(expr.custom.expr) || isWhere(expr.custom.expr))
93
+ }
94
+
95
+ export function is<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelFqnExpr<A> {
96
+ return isWildcard(expr)
97
+ || isModelRef(expr)
98
+ || isElementKindExpr(expr)
99
+ || isElementTagExpr(expr)
100
+ }
101
+
102
+ export type OrWhere<A extends AnyAux = AnyAux> = ExclusiveUnion<{
103
+ Wildcard: ModelFqnExpr.Wildcard
104
+ Ref: ModelFqnExpr.Ref<A>
105
+ ElementKind: ElementKindExpr<A>
106
+ ElementTag: ElementTagExpr<A>
107
+ Where: ModelFqnExpr.Where<A>
108
+ }>
109
+
110
+ export type Any<A extends AnyAux = AnyAux> = ExclusiveUnion<{
111
+ Wildcard: Wildcard
112
+ Ref: Ref<A>
113
+ ElementKind: ElementKindExpr<A>
114
+ ElementTag: ElementTagExpr<A>
115
+ Where: Where<A>
116
+ Custom: Custom<A>
117
+ }>
118
+
119
+ export function unwrap<A extends AnyAux>(
120
+ expr: ModelFqnExpr.Any<A>,
121
+ ): Wildcard | Ref<A> | ElementKindExpr<A> | ElementTagExpr<A> {
122
+ if (isCustom(expr)) {
123
+ expr = expr.custom.expr
124
+ }
125
+ if (isWhere(expr)) {
126
+ expr = expr.where.expr
127
+ }
128
+ return expr
129
+ }
130
+ }
131
+
132
+ export type ModelFqnExpr<A extends AnyAux = AnyAux> = ExclusiveUnion<{
133
+ Wildcard: ModelFqnExpr.Wildcard
134
+ Ref: ModelFqnExpr.Ref<A>
135
+ ElementKind: ModelFqnExpr.ElementKindExpr<A>
136
+ ElementTag: ModelFqnExpr.ElementTagExpr<A>
137
+ }>
138
+
139
+ export namespace ModelRelationExpr {
140
+ export type Endpoint<A extends AnyAux = AnyAux> = ModelFqnExpr.Where<A>['where']['expr']
141
+
142
+ export interface Direct<A extends AnyAux = AnyAux> {
143
+ source: Endpoint<A>
144
+ target: Endpoint<A>
145
+ isBidirectional?: boolean
146
+ }
147
+ export function isDirect<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Direct<A> {
148
+ return 'source' in expr && 'target' in expr
149
+ }
150
+ export interface Incoming<A extends AnyAux = AnyAux> {
151
+ incoming: Endpoint<A>
152
+ }
153
+ export function isIncoming<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Incoming<A> {
154
+ return 'incoming' in expr
155
+ }
156
+ export interface Outgoing<A extends AnyAux = AnyAux> {
157
+ outgoing: Endpoint<A>
158
+ }
159
+ export function isOutgoing<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Outgoing<A> {
160
+ return 'outgoing' in expr
161
+ }
162
+ export interface InOut<A extends AnyAux = AnyAux> {
163
+ inout: Endpoint<A>
164
+ }
165
+ export function isInOut<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.InOut<A> {
166
+ return 'inout' in expr
167
+ }
168
+ export interface Where<A extends AnyAux = AnyAux> {
169
+ where: {
170
+ expr: ExclusiveUnion<{
171
+ Direct: ModelRelationExpr.Direct<A>
172
+ Incoming: ModelRelationExpr.Incoming<A>
173
+ Outgoing: ModelRelationExpr.Outgoing<A>
174
+ InOut: ModelRelationExpr.InOut<A>
175
+ }>
176
+ condition: WhereOperator<A>
177
+ }
178
+ }
179
+ export function isWhere<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Where<A> {
180
+ return 'where' in expr &&
181
+ (isDirect(expr.where.expr) || isIncoming(expr.where.expr) || isOutgoing(expr.where.expr) ||
182
+ isInOut(expr.where.expr))
183
+ }
184
+
185
+ export interface Custom<A extends AnyAux = AnyAux> {
186
+ customRelation: {
187
+ expr: OrWhere<A>
188
+ title?: string
189
+ description?: string
190
+ technology?: string
191
+ notation?: string
192
+ // Link to dynamic view
193
+ navigateTo?: aux.StrictViewId<A>
194
+ // Notes for walkthrough
195
+ notes?: string
196
+ color?: Color
197
+ line?: RelationshipLineType
198
+ head?: RelationshipArrowType
199
+ tail?: RelationshipArrowType
200
+ }
201
+ }
202
+
203
+ export function isCustom<A extends AnyAux>(expr: ModelExpression<A>): expr is Custom<A> {
204
+ return 'customRelation' in expr
205
+ }
206
+
207
+ export function is<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr<A> {
208
+ return isDirect(expr)
209
+ || isIncoming(expr)
210
+ || isOutgoing(expr)
211
+ || isInOut(expr)
212
+ }
213
+
214
+ export type OrWhere<A extends AnyAux = AnyAux> = ExclusiveUnion<{
215
+ Direct: Direct<A>
216
+ Incoming: Incoming<A>
217
+ Outgoing: Outgoing<A>
218
+ InOut: InOut<A>
219
+ Where: Where<A>
220
+ }>
221
+
222
+ export type Any<A extends AnyAux = AnyAux> = ExclusiveUnion<{
223
+ Direct: Direct<A>
224
+ Incoming: Incoming<A>
225
+ Outgoing: Outgoing<A>
226
+ InOut: InOut<A>
227
+ Where: Where<A>
228
+ Custom: Custom<A>
229
+ }>
230
+
231
+ export function unwrap<A extends AnyAux>(
232
+ expr: ModelRelationExpr.Any<A>,
233
+ ): Direct<A> | Incoming<A> | Outgoing<A> | InOut<A> {
234
+ if (isCustom(expr)) {
235
+ expr = expr.customRelation.expr
236
+ }
237
+ if (isWhere(expr)) {
238
+ expr = expr.where.expr
239
+ }
240
+ return expr
241
+ }
242
+ }
243
+
244
+ export type ModelRelationExpr<A extends AnyAux = AnyAux> = ExclusiveUnion<{
245
+ Direct: ModelRelationExpr.Direct<A>
246
+ Incoming: ModelRelationExpr.Incoming<A>
247
+ Outgoing: ModelRelationExpr.Outgoing<A>
248
+ InOut: ModelRelationExpr.InOut<A>
249
+ }>
250
+
251
+ /**
252
+ * Represents a version 2 expression which can be one of several types.
253
+ *
254
+ * @template D - The type for the deployment FQN, defaults to `Fqn`.
255
+ * @template M - The type for the model FQN, defaults to `Fqn`.
256
+ */
257
+ export type ModelExpression<A extends AnyAux = AnyAux> = ExclusiveUnion<{
258
+ Wildcard: ModelFqnExpr.Wildcard
259
+ Ref: ModelFqnExpr.Ref<A>
260
+ ElementKind: ModelFqnExpr.ElementKindExpr<A>
261
+ ElementTag: ModelFqnExpr.ElementTagExpr<A>
262
+ Custom: ModelFqnExpr.Custom<A>
263
+ Direct: ModelRelationExpr.Direct<A>
264
+ Incoming: ModelRelationExpr.Incoming<A>
265
+ Outgoing: ModelRelationExpr.Outgoing<A>
266
+ InOut: ModelRelationExpr.InOut<A>
267
+ Where: ModelExpression.Where<A>
268
+ CustomRelation: ModelRelationExpr.Custom<A>
269
+ }>
270
+
271
+ export namespace ModelExpression {
272
+ export type Where<A extends AnyAux = AnyAux> = ModelFqnExpr.Where<A> | ModelRelationExpr.Where<A>
273
+ export function isWhere<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelExpression.Where<A> {
274
+ return 'where' in expr
275
+ }
276
+
277
+ export function isRelationWhere<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Where<A> {
278
+ return ModelRelationExpr.isWhere(expr)
279
+ }
280
+
281
+ export function isFqnExprWhere<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelFqnExpr.Where<A> {
282
+ return ModelFqnExpr.isWhere(expr)
283
+ }
284
+
285
+ export function isFqnExpr<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelFqnExpr.Any<A> {
286
+ return ModelFqnExpr.is(expr) || ModelFqnExpr.isWhere(expr) || ModelFqnExpr.isCustom(expr)
287
+ }
288
+
289
+ export function isRelationExpr<A extends AnyAux>(expr: ModelExpression<A>): expr is ModelRelationExpr.Any<A> {
290
+ return ModelRelationExpr.is(expr) || ModelRelationExpr.isWhere(expr) || ModelRelationExpr.isCustom(expr)
291
+ }
292
+ }
@@ -0,0 +1,311 @@
1
+ import type { ExclusiveUnion } from './_common'
2
+ import type * as aux from './aux'
3
+ import type { AnyAux } from './aux'
4
+ import { FqnRef } from './fqnRef'
5
+ import type { WhereOperator } from './operators'
6
+ import { type Icon } from './scalar'
7
+ import type {
8
+ BorderStyle,
9
+ Color,
10
+ ElementShape,
11
+ RelationshipArrowType,
12
+ RelationshipLineType,
13
+ ShapeSize,
14
+ } from './styles'
15
+
16
+ export type PredicateSelector =
17
+ | 'children' // ele.*
18
+ | 'expanded' // ele._
19
+ | 'descendants' // ele.**
20
+
21
+ export namespace FqnExpr {
22
+ export type Wildcard = {
23
+ wildcard: true
24
+ }
25
+ export function isWildcard<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr.Wildcard {
26
+ return 'wildcard' in expr && expr.wildcard === true
27
+ }
28
+
29
+ export interface ModelRef<M extends AnyAux = AnyAux> {
30
+ ref: FqnRef.ModelRef<M>
31
+ selector?: PredicateSelector
32
+ }
33
+ export function isModelRef<A extends AnyAux>(ref: Expression<A>): ref is FqnExpr.ModelRef<A> {
34
+ return 'ref' in ref && FqnRef.isModelRef(ref.ref)
35
+ }
36
+
37
+ export interface DeploymentRef<A extends AnyAux = AnyAux> {
38
+ ref: FqnRef.DeploymentRef<A>
39
+ selector?: PredicateSelector
40
+ }
41
+ export function isDeploymentRef<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr.DeploymentRef<A> {
42
+ return 'ref' in expr && FqnRef.isDeploymentRef(expr.ref)
43
+ }
44
+
45
+ export interface ElementKindExpr<A extends AnyAux = AnyAux> {
46
+ elementKind: aux.ElementKind<A>
47
+ isEqual: boolean
48
+ }
49
+ export function isElementKindExpr<A extends AnyAux>(expr: Expression<A>): expr is ElementKindExpr<A> {
50
+ return 'elementKind' in expr && 'isEqual' in expr
51
+ }
52
+
53
+ export interface ElementTagExpr<A extends AnyAux = AnyAux> {
54
+ elementTag: aux.Tag<A>
55
+ isEqual: boolean
56
+ }
57
+ export function isElementTagExpr<A extends AnyAux>(expr: Expression<A>): expr is ElementTagExpr<A> {
58
+ return 'elementTag' in expr && 'isEqual' in expr
59
+ }
60
+
61
+ export type NonWildcard<A extends AnyAux = AnyAux> = ExclusiveUnion<{
62
+ ModelRef: ModelRef<A>
63
+ DeploymentRef: DeploymentRef<A>
64
+ ElementKind: ElementKindExpr<A>
65
+ ElementTag: ElementTagExpr<A>
66
+ }>
67
+
68
+ export interface Where<A extends AnyAux = AnyAux> {
69
+ where: {
70
+ expr: ExclusiveUnion<{
71
+ Wildcard: Wildcard
72
+ ModelRef: ModelRef<A>
73
+ DeploymentRef: DeploymentRef<A>
74
+ ElementKind: ElementKindExpr<A>
75
+ ElementTag: ElementTagExpr<A>
76
+ }>
77
+ condition: WhereOperator<A>
78
+ }
79
+ }
80
+
81
+ export function isWhere<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr.Where<A> {
82
+ return 'where' in expr && is(expr.where.expr)
83
+ }
84
+
85
+ export interface Custom<A extends AnyAux = AnyAux> {
86
+ custom: {
87
+ expr: OrWhere<A>
88
+ title?: string
89
+ description?: string
90
+ technology?: string
91
+ notation?: string
92
+ shape?: ElementShape
93
+ color?: Color
94
+ icon?: Icon
95
+ border?: BorderStyle
96
+ opacity?: number
97
+ navigateTo?: aux.StrictViewId<A>
98
+ multiple?: boolean
99
+ size?: ShapeSize
100
+ padding?: ShapeSize
101
+ textSize?: ShapeSize
102
+ }
103
+ }
104
+
105
+ export function isCustom<A extends AnyAux>(expr: Expression<A>): expr is Custom<A> {
106
+ return 'custom' in expr && (is(expr.custom.expr) || isWhere(expr.custom.expr))
107
+ }
108
+
109
+ export function is<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr<A> {
110
+ return isWildcard(expr)
111
+ || isModelRef(expr)
112
+ || isDeploymentRef(expr)
113
+ || isElementKindExpr(expr)
114
+ || isElementTagExpr(expr)
115
+ }
116
+
117
+ export type OrWhere<A extends AnyAux = AnyAux> = ExclusiveUnion<{
118
+ Wildcard: FqnExpr.Wildcard
119
+ ModelRef: FqnExpr.ModelRef<A>
120
+ DeploymentRef: FqnExpr.DeploymentRef<A>
121
+ ElementKind: ElementKindExpr<A>
122
+ ElementTag: ElementTagExpr<A>
123
+ Where: FqnExpr.Where<A>
124
+ }>
125
+
126
+ export type Any<A extends AnyAux = AnyAux> = ExclusiveUnion<{
127
+ Wildcard: Wildcard
128
+ ModelRef: ModelRef<A>
129
+ DeploymentRef: DeploymentRef<A>
130
+ ElementKind: ElementKindExpr<A>
131
+ ElementTag: ElementTagExpr<A>
132
+ Where: Where<A>
133
+ Custom: Custom<A>
134
+ }>
135
+
136
+ export function unwrap<A extends AnyAux>(
137
+ expr: FqnExpr.Any<A>,
138
+ ): Wildcard | ModelRef<A> | DeploymentRef<A> | ElementKindExpr<A> | ElementTagExpr<A> {
139
+ if (isCustom(expr)) {
140
+ expr = expr.custom.expr
141
+ }
142
+ if (isWhere(expr)) {
143
+ expr = expr.where.expr
144
+ }
145
+ return expr
146
+ }
147
+ }
148
+
149
+ export type FqnExpr<A extends AnyAux = AnyAux> = ExclusiveUnion<{
150
+ Wildcard: FqnExpr.Wildcard
151
+ ModelRef: FqnExpr.ModelRef<A>
152
+ DeploymentRef: FqnExpr.DeploymentRef<A>
153
+ ElementKind: FqnExpr.ElementKindExpr<A>
154
+ ElementTag: FqnExpr.ElementTagExpr<A>
155
+ }>
156
+
157
+ export namespace RelationExpr {
158
+ export type Endpoint<A extends AnyAux = AnyAux> = FqnExpr.Where<A>['where']['expr']
159
+
160
+ export interface Direct<A extends AnyAux = AnyAux> {
161
+ source: Endpoint<A>
162
+ target: Endpoint<A>
163
+ isBidirectional?: boolean
164
+ }
165
+ export function isDirect<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Direct<A> {
166
+ return 'source' in expr && 'target' in expr
167
+ }
168
+ export interface Incoming<A extends AnyAux = AnyAux> {
169
+ incoming: Endpoint<A>
170
+ }
171
+ export function isIncoming<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Incoming<A> {
172
+ return 'incoming' in expr
173
+ }
174
+ export interface Outgoing<A extends AnyAux = AnyAux> {
175
+ outgoing: Endpoint<A>
176
+ }
177
+ export function isOutgoing<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Outgoing<A> {
178
+ return 'outgoing' in expr
179
+ }
180
+ export interface InOut<A extends AnyAux = AnyAux> {
181
+ inout: Endpoint<A>
182
+ }
183
+ export function isInOut<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.InOut<A> {
184
+ return 'inout' in expr
185
+ }
186
+ export interface Where<A extends AnyAux = AnyAux> {
187
+ where: {
188
+ expr: ExclusiveUnion<{
189
+ Direct: RelationExpr.Direct<A>
190
+ Incoming: RelationExpr.Incoming<A>
191
+ Outgoing: RelationExpr.Outgoing<A>
192
+ InOut: RelationExpr.InOut<A>
193
+ }>
194
+ condition: WhereOperator<A>
195
+ }
196
+ }
197
+ export function isWhere<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Where<A> {
198
+ return 'where' in expr &&
199
+ (isDirect(expr.where.expr) || isIncoming(expr.where.expr) || isOutgoing(expr.where.expr) ||
200
+ isInOut(expr.where.expr))
201
+ }
202
+
203
+ export interface Custom<A extends AnyAux = AnyAux> {
204
+ customRelation: {
205
+ expr: OrWhere<A>
206
+ title?: string
207
+ description?: string
208
+ technology?: string
209
+ notation?: string
210
+ // Link to dynamic view
211
+ navigateTo?: aux.StrictViewId<A>
212
+ // Notes for walkthrough
213
+ notes?: string
214
+ color?: Color
215
+ line?: RelationshipLineType
216
+ head?: RelationshipArrowType
217
+ tail?: RelationshipArrowType
218
+ }
219
+ }
220
+
221
+ export function isCustom<A extends AnyAux>(expr: Expression<A>): expr is Custom<A> {
222
+ return 'customRelation' in expr
223
+ }
224
+
225
+ export function is<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr<A> {
226
+ return isDirect(expr)
227
+ || isIncoming(expr)
228
+ || isOutgoing(expr)
229
+ || isInOut(expr)
230
+ }
231
+
232
+ export type OrWhere<A extends AnyAux = AnyAux> = ExclusiveUnion<{
233
+ Direct: Direct<A>
234
+ Incoming: Incoming<A>
235
+ Outgoing: Outgoing<A>
236
+ InOut: InOut<A>
237
+ Where: Where<A>
238
+ }>
239
+
240
+ export type Any<A extends AnyAux = AnyAux> = ExclusiveUnion<{
241
+ Direct: Direct<A>
242
+ Incoming: Incoming<A>
243
+ Outgoing: Outgoing<A>
244
+ InOut: InOut<A>
245
+ Where: Where<A>
246
+ Custom: Custom<A>
247
+ }>
248
+
249
+ export function unwrap<A extends AnyAux>(
250
+ expr: RelationExpr.Any<A>,
251
+ ): Direct<A> | Incoming<A> | Outgoing<A> | InOut<A> {
252
+ if (isCustom(expr)) {
253
+ expr = expr.customRelation.expr
254
+ }
255
+ if (isWhere(expr)) {
256
+ expr = expr.where.expr
257
+ }
258
+ return expr
259
+ }
260
+ }
261
+
262
+ export type RelationExpr<A extends AnyAux = AnyAux> = ExclusiveUnion<{
263
+ Direct: RelationExpr.Direct<A>
264
+ Incoming: RelationExpr.Incoming<A>
265
+ Outgoing: RelationExpr.Outgoing<A>
266
+ InOut: RelationExpr.InOut<A>
267
+ }>
268
+
269
+ /**
270
+ * Represents a version 2 expression which can be one of several types.
271
+ *
272
+ * @template D - The type for the deployment FQN, defaults to `Fqn`.
273
+ * @template M - The type for the model FQN, defaults to `Fqn`.
274
+ */
275
+ export type Expression<A extends AnyAux = AnyAux> = ExclusiveUnion<{
276
+ Wildcard: FqnExpr.Wildcard
277
+ ModelRef: FqnExpr.ModelRef<A>
278
+ DeploymentRef: FqnExpr.DeploymentRef<A>
279
+ ElementKind: FqnExpr.ElementKindExpr<A>
280
+ ElementTag: FqnExpr.ElementTagExpr<A>
281
+ Custom: FqnExpr.Custom<A>
282
+ Direct: RelationExpr.Direct<A>
283
+ Incoming: RelationExpr.Incoming<A>
284
+ Outgoing: RelationExpr.Outgoing<A>
285
+ InOut: RelationExpr.InOut<A>
286
+ Where: Expression.Where<A>
287
+ CustomRelation: RelationExpr.Custom<A>
288
+ }>
289
+
290
+ export namespace Expression {
291
+ export type Where<A extends AnyAux = AnyAux> = FqnExpr.Where<A> | RelationExpr.Where<A>
292
+ export function isWhere<A extends AnyAux>(expr: Expression<A>): expr is Expression.Where<A> {
293
+ return 'where' in expr
294
+ }
295
+
296
+ export function isRelationWhere<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Where<A> {
297
+ return RelationExpr.isWhere(expr)
298
+ }
299
+
300
+ export function isFqnExprWhere<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr.Where<A> {
301
+ return FqnExpr.isWhere(expr)
302
+ }
303
+
304
+ export function isFqnExpr<A extends AnyAux>(expr: Expression<A>): expr is FqnExpr.Any<A> {
305
+ return FqnExpr.is(expr) || FqnExpr.isWhere(expr) || FqnExpr.isCustom(expr)
306
+ }
307
+
308
+ export function isRelation<A extends AnyAux>(expr: Expression<A>): expr is RelationExpr.Any<A> {
309
+ return RelationExpr.is(expr) || RelationExpr.isWhere(expr) || RelationExpr.isCustom(expr)
310
+ }
311
+ }
@@ -0,0 +1,88 @@
1
+ import { isString } from 'remeda'
2
+ import type { ExclusiveUnion } from './_common'
3
+ import type * as aux from './aux'
4
+ import type { AnyAux, Unknown } from './aux'
5
+ import { GlobalFqn } from './scalar'
6
+
7
+ export namespace FqnRef {
8
+ /**
9
+ * Reference to logical model element
10
+ */
11
+ export interface ElementRef<A extends AnyAux = Unknown> {
12
+ project?: never
13
+ model: aux.ElementId<A>
14
+ }
15
+ export function isElementRef<A extends AnyAux>(ref: FqnRef<A>): ref is ElementRef<A> {
16
+ return 'model' in ref && !('project' in ref)
17
+ }
18
+
19
+ /**
20
+ * Reference to imported logical model element
21
+ */
22
+ export interface ImportRef<A extends AnyAux = Unknown> {
23
+ project: aux.ProjectId<A>
24
+ model: aux.ElementId<A>
25
+ }
26
+ export function isImportRef<A extends AnyAux>(ref: FqnRef<A>): ref is ImportRef<A> {
27
+ return 'project' in ref && 'model' in ref
28
+ }
29
+
30
+ export function flatten<A extends AnyAux>(ref: FqnRef<A>): aux.StrictFqn<A> {
31
+ if (isString(ref)) {
32
+ throw new Error(`Expected FqnRef, got: "${ref}"`)
33
+ }
34
+ if (isImportRef(ref)) {
35
+ return GlobalFqn(ref.project, ref.model) as unknown as aux.StrictFqn<A>
36
+ }
37
+ if (isElementRef(ref)) {
38
+ return ref.model as unknown as aux.StrictFqn<A>
39
+ }
40
+ throw new Error('Expected FqnRef.ModelRef or FqnRef.ImportRef')
41
+ }
42
+
43
+ export type ModelRef<A extends AnyAux = Unknown> = ImportRef<A> | ElementRef<A>
44
+ export function isModelRef<A extends AnyAux>(ref: FqnRef<A>): ref is ModelRef<A> {
45
+ return isElementRef(ref) || isImportRef(ref)
46
+ }
47
+
48
+ /**
49
+ * Represents a reference to an instance within a deployment.
50
+ *
51
+ * @template D - The type representing the deployment fqn. Defaults to `Fqn`.
52
+ * @template M - The type representing the model fqn. Defaults to `Fqn`.
53
+ *
54
+ * @property {D} deployment - TThe fully qualified name (FQN) of the deployed instance.
55
+ * @property {M} element - The element reference within the deployment.
56
+ */
57
+ export interface InsideInstanceRef<A extends AnyAux = Unknown> {
58
+ deployment: aux.DeploymentId<A>
59
+ element: aux.ElementId<A>
60
+ }
61
+ export function isInsideInstanceRef<A extends AnyAux>(ref: FqnRef<A>): ref is InsideInstanceRef<A> {
62
+ return 'deployment' in ref && 'element' in ref
63
+ }
64
+
65
+ /**
66
+ * Represents a reference to a deployment element.
67
+ *
68
+ * @template F - The type of the fully qualified name (FQN) of the deployment element. Defaults to `Fqn`.
69
+ * @property {F} deployment - The fully qualified name (FQN) of the deployment element.
70
+ */
71
+ export interface DeploymentElementRef<A extends AnyAux> {
72
+ deployment: aux.DeploymentId<A>
73
+ element?: never
74
+ }
75
+ export function isDeploymentElementRef<A extends AnyAux>(ref: FqnRef<A>): ref is DeploymentElementRef<A> {
76
+ return 'deployment' in ref && !('element' in ref)
77
+ }
78
+
79
+ export type DeploymentRef<A extends AnyAux> = DeploymentElementRef<A> | InsideInstanceRef<A>
80
+ export function isDeploymentRef<A extends AnyAux>(ref: FqnRef<A>): ref is DeploymentRef<A> {
81
+ return isDeploymentElementRef(ref) || isInsideInstanceRef(ref)
82
+ }
83
+ }
84
+
85
+ export type FqnRef<A extends AnyAux = Unknown> = ExclusiveUnion<{
86
+ DeploymentRef: FqnRef.DeploymentRef<A>
87
+ ModelRef: FqnRef.ModelRef<A>
88
+ }>