@likec4/core 1.18.0 → 1.19.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 (177) hide show
  1. package/LICENSE +1 -1
  2. package/dist/builder/index.d.mts +502 -0
  3. package/dist/builder/index.d.ts +502 -0
  4. package/dist/builder/index.js +871 -0
  5. package/dist/compute-view/index.d.mts +9 -78
  6. package/dist/compute-view/index.d.ts +9 -78
  7. package/dist/compute-view/index.js +78 -0
  8. package/dist/index.d.mts +9 -730
  9. package/dist/index.d.ts +9 -730
  10. package/dist/{index.mjs → index.js} +7 -784
  11. package/dist/model/index.d.mts +218 -606
  12. package/dist/model/index.d.ts +218 -606
  13. package/dist/model/index.js +1 -0
  14. package/dist/shared/chunk-RAAYCPUM.M-JWF7SS.js +21 -0
  15. package/dist/shared/core.BIfgabEw.d.ts +719 -0
  16. package/dist/shared/core.BZ9Msq7w.d.mts +719 -0
  17. package/dist/shared/{core.DMYY7C8s.d.mts → core.C05RDLhi.d.ts} +179 -230
  18. package/dist/shared/{core.DMYY7C8s.d.ts → core.CmYMqgha.d.mts} +179 -230
  19. package/dist/shared/core.D6-fWbM3.d.ts +127 -0
  20. package/dist/shared/core.D74xkKkG.d.mts +148 -0
  21. package/dist/shared/core.D74xkKkG.d.ts +148 -0
  22. package/dist/shared/core.sLaWHBjR.d.mts +127 -0
  23. package/dist/shared/index.DafVOuVd.js +7443 -0
  24. package/dist/shared/object_hash.CE_oF3I3.js +1222 -0
  25. package/dist/shared/view.CyZrG8BJ.js +354 -0
  26. package/dist/types/index.d.mts +4 -2
  27. package/dist/types/index.d.ts +4 -2
  28. package/dist/types/index.js +20 -0
  29. package/dist/utils/index.d.mts +419 -0
  30. package/dist/utils/index.d.ts +419 -0
  31. package/dist/utils/index.js +347 -0
  32. package/package.json +47 -33
  33. package/src/builder/Builder-style1.test-d.ts +190 -0
  34. package/src/builder/Builder-style2.test-d.ts +175 -0
  35. package/src/builder/Builder.deployment.ts +25 -20
  36. package/src/builder/Builder.deploymentModel.ts +80 -55
  37. package/src/builder/Builder.element.ts +2 -0
  38. package/src/builder/Builder.model.ts +57 -43
  39. package/src/builder/Builder.ts +412 -431
  40. package/src/builder/Builder.view-common.ts +234 -0
  41. package/src/builder/Builder.view-deployment.ts +135 -0
  42. package/src/builder/Builder.view-element.ts +189 -0
  43. package/src/builder/Builder.views.ts +109 -33
  44. package/src/builder/Builder.with.ts +475 -0
  45. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +374 -0
  46. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +183 -0
  47. package/src/builder/__snapshots__/Builder.spec.ts.snap +374 -0
  48. package/src/builder/_types.ts +28 -5
  49. package/src/builder/index.ts +10 -4
  50. package/src/colors/index.ts +2 -2
  51. package/src/compute-view/compute-view.ts +45 -54
  52. package/src/compute-view/deployment-view/__test__/TestHelper.ts +236 -0
  53. package/src/compute-view/deployment-view/__test__/fixture.ts +50 -62
  54. package/src/compute-view/deployment-view/_types.ts +26 -18
  55. package/src/compute-view/deployment-view/clean-connections.ts +173 -164
  56. package/src/compute-view/deployment-view/compute.ts +51 -37
  57. package/src/compute-view/deployment-view/memory/index.ts +9 -0
  58. package/src/compute-view/deployment-view/memory/memory.ts +97 -0
  59. package/src/compute-view/deployment-view/predicates/elements.ts +144 -0
  60. package/src/compute-view/deployment-view/predicates/relation-direct.ts +183 -76
  61. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +38 -20
  62. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +72 -23
  63. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +61 -22
  64. package/src/compute-view/deployment-view/predicates/wildcard.ts +15 -15
  65. package/src/compute-view/deployment-view/stages/stage-exclude.ts +5 -0
  66. package/src/compute-view/deployment-view/stages/stage-final.ts +245 -0
  67. package/src/compute-view/deployment-view/stages/stage-include.ts +95 -0
  68. package/src/compute-view/deployment-view/utils.ts +95 -31
  69. package/src/compute-view/dynamic-view/__test__/fixture.ts +4 -4
  70. package/src/compute-view/dynamic-view/compute.ts +59 -45
  71. package/src/compute-view/element-view/__test__/TestHelper.ts +258 -0
  72. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +64 -62
  73. package/src/compute-view/element-view/__test__/fixture.ts +147 -117
  74. package/src/compute-view/element-view/_types.ts +48 -0
  75. package/src/compute-view/element-view/clean-connections.ts +113 -0
  76. package/src/compute-view/element-view/compute.ts +264 -683
  77. package/src/compute-view/element-view/memory/NodeGroup.ts +31 -0
  78. package/src/compute-view/element-view/memory/index.ts +10 -0
  79. package/src/compute-view/element-view/memory/memory.ts +177 -0
  80. package/src/compute-view/element-view/memory/stage-exclude.ts +59 -0
  81. package/src/compute-view/element-view/memory/stage-final.ts +129 -0
  82. package/src/compute-view/element-view/memory/stage-include.ts +128 -0
  83. package/src/compute-view/element-view/predicates/_utils.ts +86 -0
  84. package/src/compute-view/element-view/predicates/element-expand.ts +33 -0
  85. package/src/compute-view/element-view/predicates/element-kind-tag.ts +26 -0
  86. package/src/compute-view/element-view/predicates/element-ref.ts +37 -0
  87. package/src/compute-view/element-view/predicates/relation-direct.ts +309 -0
  88. package/src/compute-view/element-view/predicates/relation-in-out.ts +66 -0
  89. package/src/compute-view/element-view/predicates/relation-in.ts +118 -0
  90. package/src/compute-view/element-view/predicates/relation-out.ts +116 -0
  91. package/src/compute-view/element-view/predicates/wildcard.ts +88 -0
  92. package/src/compute-view/element-view/utils.ts +59 -0
  93. package/src/compute-view/index.ts +3 -4
  94. package/src/compute-view/memory/AbstractMemory.ts +45 -0
  95. package/src/compute-view/memory/AbstractStageExclude.ts +216 -0
  96. package/src/compute-view/memory/AbstractStageInclude.ts +200 -0
  97. package/src/compute-view/memory/_types.ts +147 -0
  98. package/src/compute-view/memory/index.ts +5 -0
  99. package/src/compute-view/memory/ops.ts +43 -0
  100. package/src/compute-view/utils/buildComputedNodes.ts +4 -4
  101. package/src/compute-view/utils/elementExpressionToPredicate.ts +1 -3
  102. package/src/compute-view/utils/link-nodes-with-edges.ts +3 -7
  103. package/src/compute-view/utils/{derive-edge-props-from-relationships.ts → merge-props-from-relationships.ts} +54 -23
  104. package/src/compute-view/utils/relationExpressionToPredicates.ts +2 -2
  105. package/src/compute-view/utils/resolve-extended-views.ts +44 -40
  106. package/src/compute-view/utils/resolve-global-rules.ts +6 -6
  107. package/src/compute-view/utils/topological-sort.ts +167 -71
  108. package/src/compute-view/utils/with-readable-edges.ts +14 -9
  109. package/src/index.ts +22 -16
  110. package/src/model/DeploymentElementModel.ts +150 -85
  111. package/src/model/DeploymentModel.ts +27 -21
  112. package/src/model/ElementModel.ts +51 -25
  113. package/src/model/LikeC4Model.test-d.ts +4 -3
  114. package/src/model/LikeC4Model.ts +98 -42
  115. package/src/model/RelationModel.ts +5 -4
  116. package/src/model/__test__/fixture.ts +5 -9
  117. package/src/model/connection/Connection.ts +72 -0
  118. package/src/model/connection/deployment/DeploymentConnectionModel.ts +178 -0
  119. package/src/model/connection/{deployment.ts → deployment/find.ts} +14 -18
  120. package/src/model/connection/deployment/index.ts +8 -0
  121. package/src/model/connection/index.ts +22 -0
  122. package/src/model/connection/model/ConnectionModel.ts +157 -0
  123. package/src/model/connection/{model.ts → model/find.ts} +43 -49
  124. package/src/model/connection/model/index.ts +8 -0
  125. package/src/model/connection/ops.ts +274 -0
  126. package/src/model/guards.ts +9 -0
  127. package/src/model/index.ts +45 -3
  128. package/src/model/types.ts +35 -18
  129. package/src/model/view/EdgeModel.ts +6 -6
  130. package/src/model/view/LikeC4ViewModel.ts +14 -8
  131. package/src/model/view/NodeModel.ts +6 -5
  132. package/src/types/_common.ts +53 -1
  133. package/src/types/deployments.ts +88 -156
  134. package/src/types/element.ts +2 -2
  135. package/src/types/expression-v2.ts +172 -0
  136. package/src/types/expression.ts +9 -5
  137. package/src/types/global.ts +3 -3
  138. package/src/types/index.ts +220 -13
  139. package/src/types/model.ts +28 -24
  140. package/src/types/operators.ts +1 -1
  141. package/src/types/relation.ts +14 -10
  142. package/src/types/theme.ts +0 -1
  143. package/src/types/view.ts +20 -18
  144. package/src/utils/const.ts +1 -0
  145. package/src/utils/fqn.ts +140 -49
  146. package/src/utils/getOrCreate.ts +1 -1
  147. package/src/utils/index.ts +75 -9
  148. package/src/utils/iterable/_types.ts +5 -0
  149. package/src/utils/iterable/filter.ts +55 -0
  150. package/src/utils/iterable/find.ts +36 -0
  151. package/src/utils/iterable/flat.ts +17 -0
  152. package/src/utils/iterable/index.ts +13 -0
  153. package/src/utils/iterable/map.ts +40 -0
  154. package/src/utils/iterable/reduce.ts +24 -0
  155. package/src/utils/iterable/some.ts +36 -0
  156. package/src/utils/iterable/to.ts +19 -0
  157. package/src/utils/iterable/unique.ts +29 -0
  158. package/src/utils/relations.ts +3 -64
  159. package/src/utils/set.ts +11 -9
  160. package/src/utils/string-hash.ts +1 -1
  161. package/dist/compute-view/index.mjs +0 -79
  162. package/dist/model/index.mjs +0 -2
  163. package/dist/shared/core.BBgiAAv1.mjs +0 -144
  164. package/dist/shared/core.BPyJvuMU.mjs +0 -2420
  165. package/dist/shared/core.BQ4AbfvB.mjs +0 -9228
  166. package/dist/shared/core.k12s_keD.mjs +0 -203
  167. package/dist/types/index.mjs +0 -21
  168. package/src/builder/Builder.test-d.ts +0 -124
  169. package/src/builder/Builder.view.ts +0 -543
  170. package/src/compute-view/LikeC4ModelGraph.ts +0 -330
  171. package/src/compute-view/deployment-view/Memory.ts +0 -108
  172. package/src/compute-view/deployment-view/Stage.ts +0 -145
  173. package/src/compute-view/deployment-view/predicates/deployment-ref.ts +0 -146
  174. package/src/compute-view/element-view/predicates.ts +0 -517
  175. package/src/compute-view/utils/sortNodes.ts +0 -101
  176. package/src/model/connection/ConnectionModel.ts +0 -94
  177. package/src/model/connection/DeploymentConnectionModel.ts +0 -99
@@ -1,13 +1,12 @@
1
- import type { MergeExclusive, Simplify, Tagged, UnionToIntersection } from 'type-fest'
1
+ import type { MergeExclusive, Simplify, Tagged } from 'type-fest'
2
2
  import type { IconUrl, NonEmptyArray } from './_common'
3
3
  import type { ElementShape, ElementStyle, Fqn, Link, Tag } from './element'
4
- import type { RelationId, RelationshipArrowType, RelationshipKind, RelationshipLineType } from './relation'
4
+ import type { AbstractRelation, RelationId } from './relation'
5
5
  import type { Color } from './theme'
6
- import type { ViewId } from './view'
7
6
 
8
7
  export type DeploymentNodeKind<Kinds extends string = string> = Tagged<Kinds, 'DeploymentNodeKind'>
9
8
 
10
- export type PhysicalElementStyle = ElementStyle & {
9
+ export type DeploymentElementStyle = ElementStyle & {
11
10
  readonly icon?: IconUrl
12
11
  readonly shape?: ElementShape
13
12
  readonly color?: Color
@@ -16,7 +15,7 @@ export type PhysicalElementStyle = ElementStyle & {
16
15
  export interface DeploymentNodeKindSpecification {
17
16
  readonly technology?: string
18
17
  readonly notation?: string
19
- readonly style: PhysicalElementStyle
18
+ readonly style: DeploymentElementStyle
20
19
  }
21
20
 
22
21
  export interface DeploymentNode {
@@ -28,7 +27,7 @@ export interface DeploymentNode {
28
27
  readonly technology?: string | null
29
28
  readonly tags?: NonEmptyArray<Tag> | null
30
29
  readonly links?: NonEmptyArray<Link> | null
31
- readonly style?: PhysicalElementStyle
30
+ readonly style?: DeploymentElementStyle
32
31
  readonly notation?: string
33
32
  readonly metadata?: Record<string, string>
34
33
  }
@@ -45,7 +44,7 @@ export interface DeployedInstance {
45
44
  readonly technology?: string | null
46
45
  readonly tags?: NonEmptyArray<Tag> | null
47
46
  readonly links?: NonEmptyArray<Link> | null
48
- readonly style?: PhysicalElementStyle
47
+ readonly style?: DeploymentElementStyle
49
48
  readonly notation?: string
50
49
  readonly metadata?: Record<string, string>
51
50
  }
@@ -61,6 +60,11 @@ export namespace DeploymentElement {
61
60
  }
62
61
  }
63
62
 
63
+ export type PredicateSelector =
64
+ | 'children' // ele.*
65
+ | 'expanded' // ele._
66
+ | 'descendants' // ele.**
67
+
64
68
  export interface DeploymentRef {
65
69
  // Reference to DeploymentNode or DeployedInstance
66
70
  readonly id: Fqn
@@ -68,170 +72,98 @@ export interface DeploymentRef {
68
72
  readonly element?: Fqn
69
73
  }
70
74
 
71
- // export namespace DeploymentRef {
72
- // export interface Node {
73
- // readonly id: Fqn
74
- // }
75
- // export interface Instance {
76
- // readonly id: Fqn
77
- // readonly element?: Fqn
78
- // }
79
- // export interface LogicalElement {
80
- // readonly element: Fqn
81
- // }
82
-
83
- // export const isDeploymentElement = (ref: DeploymentRef): ref is Node | Instance => {
84
- // return 'id' in ref
85
- // }
86
-
87
- // export const isLogicalElement = (ref: DeploymentRef): ref is LogicalElement => {
88
- // return 'element' in ref && !('id' in ref)
89
- // }
90
- // }
91
- // export type DeploymentRef = ExclusiveUnion<{
92
- // Node: DeploymentRef.Node
93
- // Instance: DeploymentRef.Instance
94
- // Element: DeploymentRef.LogicalElement
95
- // }>
96
-
97
75
  /**
98
76
  * NOTE:
99
77
  */
100
- export interface DeploymentRelation {
78
+ export interface DeploymentRelation extends AbstractRelation {
101
79
  readonly id: RelationId
102
80
  readonly source: DeploymentRef
103
81
  readonly target: DeploymentRef
104
- readonly title?: string
105
- readonly tags?: NonEmptyArray<Tag> | null
106
- readonly description?: string
107
- readonly technology?: string
108
- readonly kind?: RelationshipKind
109
- readonly color?: Color
110
- readonly line?: RelationshipLineType
111
- readonly head?: RelationshipArrowType
112
- readonly tail?: RelationshipArrowType
113
- readonly links?: NonEmptyArray<Link> | null
114
- // Link to dynamic view
115
- readonly navigateTo?: ViewId
116
- readonly metadata?: { [key: string]: string }
117
82
  }
118
- // export interface DeploymentRelation
119
83
 
120
- // interface Expressions {
121
- // DeploymentRef: {
122
- // ref: DeploymentRef
123
- // isExpanded?: boolean
124
- // isNested?: never
125
- // } | {
126
- // ref: DeploymentRef
127
- // isExpanded?: never
128
- // isNested?: boolean
84
+ // export namespace DeploymentRelationExpression {
85
+ // // type LogicalRefEndpoint = {
86
+ // // logicalRef: ElementRefExpr
87
+ // // }
88
+ // // export type DirectEndpoint = ExclusiveUnion<{
89
+ // // DeploymentElementExpression: DeploymentElementExpression
90
+ // // Logical: LogicalRefEndpoint
91
+ // // }>
92
+
93
+ // // export const isLogicalEndpoint = (expr: DirectEndpoint): expr is LogicalRefEndpoint => {
94
+ // // return 'logicalRef' in expr
95
+ // // }
96
+
97
+ // export type Direct = {
98
+ // source: FqnExpression.Element
99
+ // target: FqnExpression.Element
100
+ // isBidirectional?: boolean
129
101
  // }
130
-
131
- // Wildcard: {
132
- // wildcard: true
102
+ // export const isDirect = (expr: DeploymentExpression): expr is Direct => {
103
+ // return 'source' in expr && 'target' in expr
104
+ // }
105
+ // export type Incoming = {
106
+ // incoming: FqnExpression.Element
107
+ // }
108
+ // export const isIncoming = (expr: DeploymentExpression): expr is Incoming => {
109
+ // return 'incoming' in expr
110
+ // }
111
+ // export type Outgoing = {
112
+ // outgoing: FqnExpression.Element
113
+ // }
114
+ // export const isOutgoing = (expr: DeploymentExpression): expr is Outgoing => {
115
+ // return 'outgoing' in expr
116
+ // }
117
+ // export type InOut = {
118
+ // inout: FqnExpression.Element
119
+ // }
120
+ // export const isInOut = (expr: DeploymentExpression): expr is InOut => {
121
+ // return 'inout' in expr
133
122
  // }
134
123
  // }
135
124
 
136
- type AllNever<Expressions> = UnionToIntersection<
137
- {
138
- [Name in keyof Expressions]: {
139
- -readonly [Key in keyof Expressions[Name]]?: never
140
- }
141
- }[keyof Expressions]
142
- >
143
-
144
- type ExclusiveUnion<Expressions> = Expressions extends object ? {
145
- [Name in keyof Expressions]: Simplify<Omit<AllNever<Expressions>, keyof Expressions[Name]> & Expressions[Name]>
146
- }[keyof Expressions]
147
- : Expressions
148
-
149
- export namespace DeploymentRelationExpression {
150
- // type LogicalRefEndpoint = {
151
- // logicalRef: ElementRefExpr
152
- // }
153
- // export type DirectEndpoint = ExclusiveUnion<{
154
- // DeploymentElementExpression: DeploymentElementExpression
155
- // Logical: LogicalRefEndpoint
156
- // }>
157
-
158
- // export const isLogicalEndpoint = (expr: DirectEndpoint): expr is LogicalRefEndpoint => {
159
- // return 'logicalRef' in expr
160
- // }
161
-
162
- export type Direct = {
163
- source: DeploymentElementExpression
164
- target: DeploymentElementExpression
165
- isBidirectional?: boolean
166
- }
167
- export const isDirect = (expr: DeploymentExpression): expr is Direct => {
168
- return 'source' in expr && 'target' in expr
169
- }
170
- export type Incoming = {
171
- incoming: DeploymentElementExpression
172
- }
173
- export const isIncoming = (expr: DeploymentExpression): expr is Incoming => {
174
- return 'incoming' in expr
175
- }
176
- export type Outgoing = {
177
- outgoing: DeploymentElementExpression
178
- }
179
- export const isOutgoing = (expr: DeploymentExpression): expr is Outgoing => {
180
- return 'outgoing' in expr
181
- }
182
- export type InOut = {
183
- inout: DeploymentElementExpression
184
- }
185
- export const isInOut = (expr: DeploymentExpression): expr is InOut => {
186
- return 'inout' in expr
187
- }
188
- }
125
+ // export type DeploymentRelationExpression = ExclusiveUnion<{
126
+ // Direct: DeploymentRelationExpression.Direct
127
+ // Incoming: DeploymentRelationExpression.Incoming
128
+ // Outgoing: DeploymentRelationExpression.Outgoing
129
+ // InOut: DeploymentRelationExpression.InOut
130
+ // }>
189
131
 
190
- export type DeploymentRelationExpression = ExclusiveUnion<{
191
- Direct: DeploymentRelationExpression.Direct
192
- Incoming: DeploymentRelationExpression.Incoming
193
- Outgoing: DeploymentRelationExpression.Outgoing
194
- InOut: DeploymentRelationExpression.InOut
195
- }>
196
-
197
- export namespace DeploymentElementExpression {
198
- export type Ref = {
199
- ref: DeploymentRef
200
- selector?:
201
- | 'children' // ele.*
202
- | 'expanded' // ele._
203
- | 'descendants' // ele.**
204
- }
205
- export const isRef = (expr: DeploymentExpression): expr is Ref => {
206
- return 'ref' in expr
207
- }
132
+ // export namespace DeploymentElementExpression {
133
+ // export type Ref = {
134
+ // ref: DeploymentRef
135
+ // selector?: PredicateSelector
136
+ // }
137
+ // export const isRef = (expr: DeploymentExpression): expr is Ref => {
138
+ // return 'ref' in expr
139
+ // }
208
140
 
209
- export type Wildcard = {
210
- wildcard: true
211
- }
212
- export const isWildcard = (expr: DeploymentExpression): expr is Wildcard => {
213
- return 'wildcard' in expr && expr.wildcard === true
214
- }
215
- }
141
+ // export type Wildcard = {
142
+ // wildcard: true
143
+ // }
144
+ // export const isWildcard = (expr: DeploymentExpression): expr is Wildcard => {
145
+ // return 'wildcard' in expr && expr.wildcard === true
146
+ // }
147
+ // }
216
148
 
217
- export type DeploymentElementExpression = ExclusiveUnion<{
218
- DeploymentRef: DeploymentElementExpression.Ref
219
- Wildcard: DeploymentElementExpression.Wildcard
220
- }>
149
+ // export type DeploymentElementExpression = ExclusiveUnion<{
150
+ // DeploymentRef: DeploymentElementExpression.Ref
151
+ // Wildcard: DeploymentElementExpression.Wildcard
152
+ // }>
221
153
 
222
- export type DeploymentExpression = ExclusiveUnion<{
223
- Element: DeploymentElementExpression
224
- Relation: DeploymentRelationExpression
225
- }>
154
+ // export type DeploymentExpression = ExclusiveUnion<{
155
+ // Element: DeploymentElementExpression
156
+ // Relation: DeploymentRelationExpression
157
+ // }>
226
158
 
227
- export namespace DeploymentExpression {
228
- export type Element = DeploymentElementExpression
229
- export type Relation = DeploymentRelationExpression
159
+ // export namespace DeploymentExpression {
160
+ // export type Element = DeploymentElementExpression
161
+ // export type Relation = DeploymentRelationExpression
230
162
 
231
- export const isElement = (expr: DeploymentExpression): expr is DeploymentElementExpression => {
232
- return DeploymentElementExpression.isRef(expr) || DeploymentElementExpression.isWildcard(expr)
233
- }
234
- export const isRelation = (expr: DeploymentExpression): expr is DeploymentRelationExpression => {
235
- return !DeploymentExpression.isElement(expr)
236
- }
237
- }
163
+ // export const isElement = (expr: DeploymentExpression): expr is DeploymentElementExpression => {
164
+ // return DeploymentElementExpression.isRef(expr) || DeploymentElementExpression.isWildcard(expr)
165
+ // }
166
+ // export const isRelation = (expr: DeploymentExpression): expr is DeploymentRelationExpression => {
167
+ // return !DeploymentExpression.isElement(expr)
168
+ // }
169
+ // }
@@ -28,8 +28,8 @@ export const ElementShapes = [
28
28
  ] as const
29
29
 
30
30
  export type ElementShape = TupleToUnion<typeof ElementShapes>
31
- export const DefaultThemeColor = 'primary' satisfies ThemeColor
32
- export const DefaultElementShape = 'rectangle' satisfies ElementShape
31
+ export const DefaultThemeColor: ThemeColor = 'primary'
32
+ export const DefaultElementShape: ElementShape = 'rectangle'
33
33
 
34
34
  export interface ElementStyle {
35
35
  readonly border?: BorderStyle
@@ -0,0 +1,172 @@
1
+ import { invariant } from '../errors'
2
+ import type { ExclusiveUnion } from './_common'
3
+ import type { DeploymentRef as DeploymentModelRef, PredicateSelector } from './deployments'
4
+ import type { Fqn } from './element'
5
+
6
+ export namespace FqnRef {
7
+ /**
8
+ * Represents a reference to an instance within a deployment.
9
+ *
10
+ * @template D - The type representing the deployment fqn. Defaults to `Fqn`.
11
+ * @template M - The type representing the model fqn. Defaults to `Fqn`.
12
+ *
13
+ * @property {D} deployment - TThe fully qualified name (FQN) of the deployed instance.
14
+ * @property {M} element - The element reference within the deployment.
15
+ */
16
+ export type InsideInstanceRef<D = Fqn, M = Fqn> = {
17
+ deployment: D
18
+ element: M
19
+ }
20
+ export const isInsideInstanceRef = (ref: FqnRef): ref is InsideInstanceRef => {
21
+ return 'deployment' in ref && 'element' in ref
22
+ }
23
+
24
+ /**
25
+ * Represents a reference to a deployment element.
26
+ *
27
+ * @template F - The type of the fully qualified name (FQN) of the deployment element. Defaults to `Fqn`.
28
+ * @property {F} deployment - The fully qualified name (FQN) of the deployment element.
29
+ */
30
+ export type DeploymentElementRef<F = Fqn> = {
31
+ deployment: F
32
+ }
33
+ export const isDeploymentElementRef = (ref: FqnRef): ref is DeploymentElementRef => {
34
+ return 'deployment' in ref && !('element' in ref)
35
+ }
36
+
37
+ export type DeploymentRef<D = Fqn, M = Fqn> = DeploymentElementRef<D> | InsideInstanceRef<D, M>
38
+ export const isDeploymentRef = (ref: FqnRef): ref is DeploymentRef => {
39
+ return !isModelRef(ref)
40
+ }
41
+
42
+ /**
43
+ * Reference to logical model element
44
+ */
45
+ export type ModelRef<F = Fqn> = {
46
+ model: F
47
+ }
48
+ export const isModelRef = (ref: FqnRef): ref is ModelRef => {
49
+ return 'model' in ref
50
+ }
51
+
52
+ export const toDeploymentRef = (ref: FqnRef): DeploymentModelRef => {
53
+ invariant(isDeploymentRef(ref), 'Expected DeploymentRef')
54
+ return isInsideInstanceRef(ref)
55
+ ? {
56
+ id: ref.deployment,
57
+ element: ref.element,
58
+ }
59
+ : {
60
+ id: ref.deployment,
61
+ }
62
+ }
63
+ }
64
+
65
+ export type FqnRef<D = Fqn, M = Fqn> = ExclusiveUnion<{
66
+ InsideInstanceRef: FqnRef.InsideInstanceRef<D, M>
67
+ DeploymentRef: FqnRef.DeploymentRef<D>
68
+ ModelRef: FqnRef.ModelRef<M>
69
+ }>
70
+
71
+ export namespace FqnExpr {
72
+ export type Wildcard = {
73
+ wildcard: true
74
+ }
75
+ export const isWildcard = (expr: ExpressionV2): expr is Wildcard => {
76
+ return 'wildcard' in expr && expr.wildcard === true
77
+ }
78
+
79
+ export type ModelRef<M = Fqn> = {
80
+ ref: FqnRef.ModelRef<M>
81
+ selector?: PredicateSelector
82
+ }
83
+ export const isModelRef = (ref: ExpressionV2): ref is ModelRef => {
84
+ return 'ref' in ref && FqnRef.isModelRef(ref.ref)
85
+ }
86
+
87
+ export type DeploymentRef<D = Fqn, M = Fqn> = {
88
+ ref: FqnRef.DeploymentRef<D> | FqnRef.InsideInstanceRef<D, M>
89
+ selector?: PredicateSelector
90
+ }
91
+ export const isDeploymentRef = (ref: ExpressionV2): ref is FqnExpr.DeploymentRef => {
92
+ return 'ref' in ref && FqnRef.isDeploymentRef(ref.ref)
93
+ }
94
+
95
+ export type NonWildcard<D = Fqn, M = Fqn> = ExclusiveUnion<{
96
+ ModelRef: ModelRef<M>
97
+ DeploymentRef: DeploymentRef<D, M>
98
+ }>
99
+ }
100
+
101
+ export type FqnExpr<D = Fqn, M = Fqn> = ExclusiveUnion<{
102
+ Wildcard: FqnExpr.Wildcard
103
+ ModelRef: FqnExpr.ModelRef<M>
104
+ DeploymentRef: FqnExpr.DeploymentRef<D, M>
105
+ }>
106
+
107
+ export namespace RelationExpr {
108
+ export type Direct<D = Fqn, M = Fqn> = {
109
+ source: FqnExpr<D, M>
110
+ target: FqnExpr<D, M>
111
+ isBidirectional?: boolean
112
+ }
113
+ export const isDirect = (expr: ExpressionV2): expr is Direct => {
114
+ return 'source' in expr && 'target' in expr
115
+ }
116
+ export type Incoming<D = Fqn, M = Fqn> = {
117
+ incoming: FqnExpr<D, M>
118
+ }
119
+ export const isIncoming = (expr: ExpressionV2): expr is Incoming => {
120
+ return 'incoming' in expr
121
+ }
122
+ export type Outgoing<D = Fqn, M = Fqn> = {
123
+ outgoing: FqnExpr<D, M>
124
+ }
125
+ export const isOutgoing = (expr: ExpressionV2): expr is Outgoing => {
126
+ return 'outgoing' in expr
127
+ }
128
+ export type InOut<D = Fqn, M = Fqn> = {
129
+ inout: FqnExpr<D, M>
130
+ }
131
+ export const isInOut = (expr: ExpressionV2): expr is InOut => {
132
+ return 'inout' in expr
133
+ }
134
+ }
135
+
136
+ export type RelationExpr<D = Fqn, M = Fqn> = ExclusiveUnion<{
137
+ Direct: RelationExpr.Direct<D, M>
138
+ Incoming: RelationExpr.Incoming<D, M>
139
+ Outgoing: RelationExpr.Outgoing<D, M>
140
+ InOut: RelationExpr.InOut<D, M>
141
+ }>
142
+
143
+ /**
144
+ * Represents a version 2 expression which can be one of several types.
145
+ *
146
+ * @template D - The type for the deployment FQN, defaults to `Fqn`.
147
+ * @template M - The type for the model FQN, defaults to `Fqn`.
148
+ */
149
+ export type ExpressionV2<D = Fqn, M = Fqn> = ExclusiveUnion<{
150
+ Wildcard: FqnExpr.Wildcard
151
+ ModelRef: FqnExpr.ModelRef<M>
152
+ DeploymentRef: FqnExpr.DeploymentRef<D, M>
153
+ Direct: RelationExpr.Direct<D, M>
154
+ Incoming: RelationExpr.Incoming<D, M>
155
+ Outgoing: RelationExpr.Outgoing<D, M>
156
+ InOut: RelationExpr.InOut<D, M>
157
+ }>
158
+
159
+ export namespace ExpressionV2 {
160
+ export const isFqnExpr = (expr: ExpressionV2): expr is FqnExpr => {
161
+ return FqnExpr.isWildcard(expr)
162
+ || FqnExpr.isModelRef(expr)
163
+ || FqnExpr.isDeploymentRef(expr)
164
+ }
165
+
166
+ export const isRelation = (expr: ExpressionV2): expr is RelationExpr => {
167
+ return RelationExpr.isDirect(expr)
168
+ || RelationExpr.isIncoming(expr)
169
+ || RelationExpr.isOutgoing(expr)
170
+ || RelationExpr.isInOut(expr)
171
+ }
172
+ }
@@ -82,12 +82,16 @@ export function isElementTagExpr(expr: Expression): expr is ElementTagExpr {
82
82
  return 'elementTag' in expr && 'isEqual' in expr
83
83
  }
84
84
 
85
- export type ElementExpression =
85
+ export type NonWilcard =
86
86
  | ElementRefExpr
87
- | WildcardExpr
88
87
  | ElementKindExpr
89
88
  | ElementTagExpr
90
89
  | ExpandedElementExpr
90
+
91
+ export type ElementExpression =
92
+ | NonWilcard
93
+ | WildcardExpr
94
+
91
95
  export function isElement(expr: Expression): expr is ElementExpression {
92
96
  return isElementRef(expr)
93
97
  || isWildcard(expr)
@@ -111,12 +115,12 @@ export function isElementPredicateExpr(expr: Expression): expr is ElementPredica
111
115
  return isElement(expr) || isElementWhere(expr) || isCustomElement(expr)
112
116
  }
113
117
 
114
- export interface RelationExpr extends Omit<BaseExpr, 'source' | 'target'> {
118
+ export interface DirectRelationExpr extends Omit<BaseExpr, 'source' | 'target'> {
115
119
  source: ElementExpression
116
120
  target: ElementExpression
117
121
  isBidirectional?: boolean
118
122
  }
119
- export function isRelation(expr: Expression): expr is RelationExpr {
123
+ export function isRelation(expr: Expression): expr is DirectRelationExpr {
120
124
  return 'source' in expr && 'target' in expr
121
125
  }
122
126
 
@@ -140,7 +144,7 @@ export function isOutgoing(expr: Expression): expr is OutgoingExpr {
140
144
  return 'outgoing' in expr
141
145
  }
142
146
 
143
- export type RelationExpression = RelationExpr | InOutExpr | IncomingExpr | OutgoingExpr
147
+ export type RelationExpression = DirectRelationExpr | InOutExpr | IncomingExpr | OutgoingExpr
144
148
 
145
149
  export function isRelationExpression(expr: Expression): expr is RelationExpression {
146
150
  return isRelation(expr) || isInOut(expr) || isIncoming(expr) || isOutgoing(expr)
@@ -13,7 +13,7 @@ export type GlobalStyleID = Tagged<string, 'GlobalStyleID'>
13
13
  export type GlobalStyles = NonEmptyTuple<ViewRuleStyle>
14
14
 
15
15
  export interface ModelGlobals {
16
- predicates: Record<GlobalPredicateId, GlobalPredicates>
17
- dynamicPredicates: Record<GlobalPredicateId, GlobalDynamicPredicates>
18
- styles: Record<GlobalStyleID, GlobalStyles>
16
+ readonly predicates: Record<GlobalPredicateId, GlobalPredicates>
17
+ readonly dynamicPredicates: Record<GlobalPredicateId, GlobalDynamicPredicates>
18
+ readonly styles: Record<GlobalStyleID, GlobalStyles>
19
19
  }