@likec4/core 1.18.0 → 1.19.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 (176) 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.-BdzdI2C.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 +404 -0
  30. package/dist/utils/index.d.ts +404 -0
  31. package/dist/utils/index.js +330 -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 +74 -9
  148. package/src/utils/iterable/_types.ts +5 -0
  149. package/src/utils/iterable/filter.ts +55 -0
  150. package/src/utils/iterable/flat.ts +17 -0
  151. package/src/utils/iterable/index.ts +12 -0
  152. package/src/utils/iterable/map.ts +40 -0
  153. package/src/utils/iterable/reduce.ts +24 -0
  154. package/src/utils/iterable/some.ts +36 -0
  155. package/src/utils/iterable/to.ts +19 -0
  156. package/src/utils/iterable/unique.ts +29 -0
  157. package/src/utils/relations.ts +3 -64
  158. package/src/utils/set.ts +11 -9
  159. package/src/utils/string-hash.ts +1 -1
  160. package/dist/compute-view/index.mjs +0 -79
  161. package/dist/model/index.mjs +0 -2
  162. package/dist/shared/core.BBgiAAv1.mjs +0 -144
  163. package/dist/shared/core.BPyJvuMU.mjs +0 -2420
  164. package/dist/shared/core.BQ4AbfvB.mjs +0 -9228
  165. package/dist/shared/core.k12s_keD.mjs +0 -203
  166. package/dist/types/index.mjs +0 -21
  167. package/src/builder/Builder.test-d.ts +0 -124
  168. package/src/builder/Builder.view.ts +0 -543
  169. package/src/compute-view/LikeC4ModelGraph.ts +0 -330
  170. package/src/compute-view/deployment-view/Memory.ts +0 -108
  171. package/src/compute-view/deployment-view/Stage.ts +0 -145
  172. package/src/compute-view/deployment-view/predicates/deployment-ref.ts +0 -146
  173. package/src/compute-view/element-view/predicates.ts +0 -517
  174. package/src/compute-view/utils/sortNodes.ts +0 -101
  175. package/src/model/connection/ConnectionModel.ts +0 -94
  176. package/src/model/connection/DeploymentConnectionModel.ts +0 -99
@@ -0,0 +1,236 @@
1
+ import { indexBy, isArray, isString, map, mapValues, pipe, prop } from 'remeda'
2
+ import type { Writable } from 'type-fest'
3
+ import type { ExpectStatic } from 'vitest'
4
+ import { expect as vitestExpect } from 'vitest'
5
+ import {
6
+ type AnyTypes,
7
+ type Builder,
8
+ type DeploymentRulesBuilderOp,
9
+ type Types,
10
+ type ViewPredicate,
11
+ } from '../../../builder'
12
+ import * as viewhelpers from '../../../builder/Builder.view-common'
13
+ import { mkViewBuilder } from '../../../builder/Builder.views'
14
+ import { differenceConnections } from '../../../model/connection'
15
+ import type { ComputedDeploymentView, DeploymentView, DeploymentViewRule, ViewId } from '../../../types'
16
+ import { imap, toArray } from '../../../utils/iterable'
17
+ import { difference as differenceSet } from '../../../utils/set'
18
+ import { withReadableEdges } from '../../utils/with-readable-edges'
19
+ import { processPredicates as processPredicatesImpl } from '../compute'
20
+ import { Memory } from '../memory'
21
+
22
+ type ConnectionExpression<T extends AnyTypes> = `${T['DeploymentFqn']} -> ${T['DeploymentFqn']}`
23
+
24
+ type ConnectionsDeepMatcher<M extends string, D extends string> = {
25
+ [K in `${D} -> ${D}`]?: {
26
+ model?: Array<`${M} -> ${M}`>
27
+ deployment?: Array<`${D} -> ${D}`>
28
+ }
29
+ }
30
+
31
+ type ToDeepMatcher<T extends AnyTypes> = ConnectionsDeepMatcher<T['Fqn'], T['DeploymentFqn']>
32
+
33
+ type ConnectionEqual<T extends AnyTypes> = [ToDeepMatcher<T>] | [ConnectionExpression<T>, ...ConnectionExpression<T>[]]
34
+
35
+ type Elem = Memory['Ctx']['Element']
36
+ type Connection = Memory['Ctx']['Connection']
37
+
38
+ export class TestHelper<T extends AnyTypes> {
39
+ model: Types.ToLikeC4Model<T>
40
+
41
+ static $include = viewhelpers.$include
42
+ static $exclude = viewhelpers.$exclude
43
+ static $style = viewhelpers.$style
44
+
45
+ $include = viewhelpers.$include
46
+ $exclude = viewhelpers.$exclude
47
+ $style = viewhelpers.$style
48
+
49
+ static from<const T extends AnyTypes>(builder: Builder<T>, expect = vitestExpect): TestHelper<T> {
50
+ return new TestHelper(builder, expect)
51
+ }
52
+
53
+ constructor(
54
+ private builder: Builder<T>,
55
+ private _expect: ExpectStatic,
56
+ ) {
57
+ this.model = builder.toLikeC4Model() as Types.ToLikeC4Model<T>
58
+ }
59
+
60
+ computeView = (...rules: DeploymentRulesBuilderOp<T>[]) => {
61
+ return withReadableEdges(
62
+ this.builder
63
+ .clone()
64
+ .views(_ => _.deploymentView('dev').with(...rules))
65
+ .toLikeC4Model()
66
+ .view('dev')
67
+ .$view as ComputedDeploymentView<'dev'>,
68
+ ' -> ',
69
+ )
70
+ }
71
+
72
+ processPredicates(...rules: DeploymentRulesBuilderOp<T>[]) {
73
+ return ProcessPredicates.execute(this, ...rules)
74
+ }
75
+
76
+ expectView(view: ComputedDeploymentView) {
77
+ return {
78
+ toHave: (nodesAndEdges: { nodes: Array<T['DeploymentFqn']>; edges: Array<ConnectionExpression<T>> }) => {
79
+ const actual = {
80
+ nodes: view.nodes.map(prop('id')),
81
+ edges: view.edges.map(prop('id')),
82
+ }
83
+ this._expect(actual).toEqual(nodesAndEdges)
84
+ },
85
+ toHaveNodes: <Id extends T['DeploymentFqn']>(...nodes: Id[]) => {
86
+ this._expect(view.nodes.map(prop('id'))).toEqual(nodes)
87
+ },
88
+ toHaveEdges: <Id extends ConnectionExpression<T>>(...edges: Id[]) => {
89
+ this._expect(view.edges.map(prop('id'))).toEqual(edges)
90
+ },
91
+ }
92
+ }
93
+
94
+ expectComputedView(...rules: DeploymentRulesBuilderOp<T>[]) {
95
+ return this.expectView(this.computeView(...rules))
96
+ }
97
+
98
+ expectMemory = (memory: Memory) => ({
99
+ toHaveAllElements: <Id extends T['DeploymentFqn']>(...ids: Id[]) => {
100
+ this._expect(map([...memory.elements], prop('id'))).toEqual(ids)
101
+ },
102
+ toHaveElements: <Id extends T['DeploymentFqn']>(...ids: Id[]) => {
103
+ this._expect(map([...memory.final], prop('id'))).toEqual(ids)
104
+ },
105
+ toHaveConnections: (...matchers: ConnectionEqual<T>) => {
106
+ this.expectConnections(memory.connections).toEqual(...matchers)
107
+ },
108
+ })
109
+
110
+ expectElements = (elements: ReadonlySet<Elem>) => ({
111
+ toEqual: <const Id extends ViewPredicate.DeploymentConnectionExpression<T>>(...ids: Id[]) => {
112
+ this._expect(toArray(imap(elements, prop('id')))).toEqual(ids)
113
+ },
114
+ })
115
+
116
+ expectConnections = (connections: ReadonlyArray<Connection>) => ({
117
+ toBeEmpty: () => {
118
+ this._expect(connections.map(c => c.expression)).to.be.empty
119
+ },
120
+ toEqual: (...matchers: ConnectionEqual<T>) => {
121
+ const [matcher, ...rest] = matchers
122
+ if (isString(matcher)) {
123
+ this._expect(connections.map(c => c.expression)).toEqual([matcher, ...rest])
124
+ return
125
+ }
126
+ const obj = pipe(
127
+ connections,
128
+ indexBy(prop('expression')),
129
+ mapValues(c => ({
130
+ model: toArray(imap(c.relations.model, prop('expression'))).sort(),
131
+ deployment: toArray(imap(c.relations.deployment, prop('expression'))).sort(),
132
+ })),
133
+ )
134
+ const expected = mapValues(matcher, (v: any) => ({
135
+ ...v,
136
+ model: v.model ? [...v.model].sort() : [],
137
+ deployment: v.deployment ? [...v.deployment].sort() : [],
138
+ }))
139
+ this._expect(obj).toEqual(expected)
140
+ },
141
+ })
142
+
143
+ expectStep = (step: ProcessPredicates<T>) => ({
144
+ ...this.expectMemory(step.memory),
145
+ })
146
+
147
+ expect(value: ComputedDeploymentView): ReturnType<typeof this['expectView']>
148
+ expect(value: Set<Elem>): ReturnType<typeof this['expectElements']>
149
+ expect(value: ReadonlyArray<Connection>): ReturnType<typeof this['expectConnections']>
150
+ expect(value: Memory | ProcessPredicates<T>): ReturnType<typeof this['expectMemory']>
151
+ expect(value: Memory | ProcessPredicates<T> | Set<Elem> | ComputedDeploymentView | ReadonlyArray<Connection>) {
152
+ if (value instanceof Memory) {
153
+ return this.expectMemory(value)
154
+ }
155
+ if (value instanceof ProcessPredicates) {
156
+ return this.expectStep(value)
157
+ }
158
+ if (value instanceof Set) {
159
+ return this.expectElements(value)
160
+ }
161
+ if (isArray(value)) {
162
+ return this.expectConnections(value)
163
+ }
164
+ return this.expectView(value)
165
+ }
166
+ }
167
+
168
+ class ProcessPredicates<T extends AnyTypes> {
169
+ static execute<A extends AnyTypes>(
170
+ test: TestHelper<A>,
171
+ ...rules: DeploymentRulesBuilderOp<A>[]
172
+ ): ProcessPredicates<A> {
173
+ const processor = new ProcessPredicates(test)
174
+ processor.next(...rules)
175
+ return processor
176
+ }
177
+
178
+ public viewrules: ReadonlyArray<DeploymentViewRule> = []
179
+
180
+ public previousMemory: Memory = Memory.empty()
181
+ public memory: Memory = Memory.empty()
182
+ public predicates: DeploymentRulesBuilderOp<T>[] = []
183
+
184
+ constructor(
185
+ public readonly t: TestHelper<T>,
186
+ protected age = 0,
187
+ ) {}
188
+
189
+ get elements() {
190
+ return toArray(imap(this.memory.elements, prop('id')))
191
+ }
192
+
193
+ get connections() {
194
+ return this.memory.connections.map(c => c.expression)
195
+ }
196
+
197
+ diff() {
198
+ const prevState = this.previousMemory
199
+ const state = this.memory
200
+ return {
201
+ added: this.memory.update({
202
+ elements: differenceSet(state.elements, prevState.elements),
203
+ explicits: differenceSet(state.explicits, prevState.explicits),
204
+ final: differenceSet(state.final, prevState.final),
205
+ connections: differenceConnections(state.connections, prevState.connections),
206
+ }),
207
+ removed: this.memory.update({
208
+ elements: differenceSet(prevState.elements, state.elements),
209
+ explicits: differenceSet(prevState.explicits, state.explicits),
210
+ final: differenceSet(prevState.final, state.final),
211
+ connections: differenceConnections(prevState.connections, state.connections),
212
+ }),
213
+ }
214
+ }
215
+
216
+ next(...predicates: DeploymentRulesBuilderOp<T>[]): this {
217
+ const view = {
218
+ id: 'test' as ViewId,
219
+ __: 'deployment',
220
+ rules: [],
221
+ } as any as Writable<DeploymentView>
222
+ let vb = mkViewBuilder(view) as any
223
+ this.predicates = [
224
+ ...this.predicates,
225
+ ...predicates,
226
+ ]
227
+ for (const rule of this.predicates) {
228
+ rule(vb)
229
+ }
230
+ this.previousMemory = this.memory
231
+ this.viewrules = view.rules
232
+ this.memory = processPredicatesImpl(this.t.model.deployment, view.rules)
233
+ this.age++
234
+ return this
235
+ }
236
+ }
@@ -1,6 +1,6 @@
1
1
  import { map, prop } from 'remeda'
2
+ import type { DeploymentRulesBuilderOp } from '../../../builder'
2
3
  import { Builder } from '../../../builder'
3
- import type { DeploymentViewRuleBuilderOp } from '../../../builder/Builder.view'
4
4
  import { LikeC4Model } from '../../../model'
5
5
  import type { DeploymentView } from '../../../types'
6
6
  import { withReadableEdges } from '../../utils/with-readable-edges'
@@ -26,70 +26,67 @@ const {
26
26
  ...$d
27
27
  },
28
28
  views: {
29
- view,
30
29
  views,
31
- viewOf,
32
30
  deploymentView,
33
31
  $rules,
34
32
  $include,
35
33
  $exclude,
36
- $style
37
- }
34
+ },
38
35
  } = Builder.forSpecification({
39
36
  elements: {
40
37
  person: {
41
38
  style: {
42
- shape: 'person'
43
- }
39
+ shape: 'person',
40
+ },
44
41
  },
45
42
  system: {},
46
43
  component: {},
47
44
  webapp: {
48
45
  style: {
49
- shape: 'browser'
50
- }
46
+ shape: 'browser',
47
+ },
51
48
  },
52
49
  mobile: {
53
50
  style: {
54
- shape: 'mobile'
55
- }
56
- }
51
+ shape: 'mobile',
52
+ },
53
+ },
57
54
  },
58
55
  deployments: {
59
56
  env: {},
60
57
  zone: {},
61
- node: {}
62
- }
58
+ node: {},
59
+ },
63
60
  })
64
61
 
65
62
  export const builder = b
66
63
  .with(
67
64
  model(
68
65
  person('customer', {
69
- title: 'Happy Customer'
66
+ title: 'Happy Customer',
70
67
  }),
71
68
  system('cloud').with(
72
69
  component('frontend').with(
73
70
  webapp('dashboard'),
74
- mobile('mobile')
71
+ mobile('mobile'),
75
72
  ),
76
73
  component('auth'),
77
74
  component('backend').with(
78
- component('api')
75
+ component('api'),
79
76
  ),
80
77
  component('media', {
81
- shape: 'storage'
82
- })
78
+ shape: 'storage',
79
+ }),
83
80
  ),
84
81
  system('aws').with(
85
82
  component('rds', {
86
- shape: 'storage'
83
+ shape: 'storage',
87
84
  }),
88
85
  component('s3', {
89
- shape: 'storage'
90
- })
86
+ shape: 'storage',
87
+ }),
91
88
  ),
92
- system('email')
89
+ system('email'),
93
90
  ),
94
91
  model(
95
92
  $m.rel('customer', 'cloud', 'uses services'),
@@ -97,13 +94,13 @@ export const builder = b
97
94
  $m.rel('customer', 'cloud.frontend.dashboard', 'opens in browser'),
98
95
  $m.rel('cloud.frontend.dashboard', 'cloud.auth', {
99
96
  title: 'authenticates',
100
- color: 'green'
97
+ color: 'green',
101
98
  }),
102
99
  $m.rel('cloud.frontend.dashboard', 'cloud.backend.api', 'fetches data'),
103
100
  $m.rel('cloud.frontend.dashboard', 'cloud.media', 'fetches media'),
104
101
  $m.rel('cloud.frontend.mobile', 'cloud.auth', {
105
102
  title: 'authenticates',
106
- color: 'amber'
103
+ color: 'amber',
107
104
  }),
108
105
  $m.rel('cloud.frontend.mobile', 'cloud.backend.api', 'fetches data'),
109
106
  $m.rel('cloud.frontend.mobile', 'cloud.media', 'fetches media'),
@@ -112,99 +109,90 @@ export const builder = b
112
109
  $m.rel('cloud.backend.api', 'aws.rds', 'reads/writes'),
113
110
  $m.rel('cloud.backend.api', 'email', 'sends emails'),
114
111
  $m.rel('cloud.media', 'aws.s3', 'uploads'),
115
- $m.rel('email', 'customer', 'sends emails')
112
+ $m.rel('email', 'customer', 'sends emails'),
116
113
  ),
117
114
  deployment(
118
115
  node('customer').with(
119
- instanceOf('instance', 'customer')
116
+ instanceOf('instance', 'customer'),
120
117
  ),
121
118
  env('prod').with(
122
119
  zone('eu').with(
123
120
  zone('zone1').with(
124
121
  instanceOf('api', 'cloud.backend.api'),
125
- instanceOf('ui', 'cloud.frontend.dashboard')
122
+ instanceOf('ui', 'cloud.frontend.dashboard'),
126
123
  ),
127
124
  zone('zone2').with(
128
125
  instanceOf('api', 'cloud.backend.api'),
129
- instanceOf('ui', 'cloud.frontend.dashboard')
126
+ instanceOf('ui', 'cloud.frontend.dashboard'),
130
127
  ),
131
128
  instanceOf('auth', 'cloud.auth'),
132
129
  instanceOf('media', 'cloud.media'),
133
- instanceOf('db', 'aws.rds')
130
+ instanceOf('db', 'aws.rds'),
134
131
  ),
135
132
  zone('us').with(
136
133
  zone('zone1').with(
137
134
  instanceOf('api', 'cloud.backend.api'),
138
- instanceOf('ui', 'cloud.frontend.dashboard')
135
+ instanceOf('ui', 'cloud.frontend.dashboard'),
139
136
  ),
140
- instanceOf('db', 'aws.rds')
141
- )
137
+ instanceOf('db', 'aws.rds'),
138
+ ),
142
139
  ),
143
140
  env('acc').with(
144
141
  node('testCustomer').with(
145
- instanceOf('instance', 'customer')
142
+ instanceOf('instance', 'customer'),
146
143
  ),
147
144
  zone('eu').with(
148
145
  instanceOf('api', 'cloud.backend.api'),
149
146
  instanceOf('ui', 'cloud.frontend.dashboard'),
150
147
  instanceOf('auth', 'cloud.auth'),
151
- instanceOf('db', 'aws.rds')
152
- )
148
+ instanceOf('db', 'aws.rds'),
149
+ ),
153
150
  ),
154
151
  env('global').with(
155
- instanceOf('email', 'email')
152
+ instanceOf('email', 'email'),
156
153
  ),
157
154
  $d.rel('prod.eu.db', 'prod.us.db', {
158
155
  title: 'replicates',
159
- color: 'green'
156
+ color: 'green',
160
157
  }),
161
158
  $d.rel('prod.us.db', 'prod.eu.db', {
162
159
  title: 'replicates',
163
- color: 'amber'
164
- })
165
- )
166
- // views(
167
- // view('index', $include('*')),
168
- // viewOf('cloud', 'cloud', $rules(
169
- // $include('*'),
170
- // )),
171
- // deploymentView('prod', $rules(
172
- // $include('customer.c'),
173
- // $include('prod._'),
174
- // $exclude('prod.eu.zone1 <-> prod.eu.zone2')
175
- // ))
176
- // )
160
+ color: 'amber',
161
+ }),
162
+ ),
177
163
  )
164
+ .clone()
178
165
 
179
166
  export type Types = typeof builder['Types']
180
167
 
181
168
  export { $exclude, $include }
182
169
 
183
- export function computeView(...rules: DeploymentViewRuleBuilderOp<Types>[]) {
184
- const modelsource = builder.with(
185
- views(
186
- deploymentView('index', $rules(...rules))
187
- )
188
- ).build()
170
+ export function computeView(...rules: DeploymentRulesBuilderOp<Types>[]) {
171
+ const modelsource = builder.clone()
172
+ .with(
173
+ views(
174
+ deploymentView('index', $rules(...rules)),
175
+ ),
176
+ ).build()
189
177
 
190
178
  const model = LikeC4Model.create({
191
179
  ...modelsource,
192
- views: {}
180
+ views: {},
193
181
  })
194
182
 
195
183
  const view = withReadableEdges(computeDeploymentView(model, modelsource.views.index as DeploymentView))
196
184
 
197
185
  return Object.assign(view, {
198
186
  nodeIds: map(view.nodes, prop('id')) as string[],
199
- edgeIds: map(view.edges, prop('id')) as string[]
187
+ edgeIds: map(view.edges, prop('id')) as string[],
200
188
  })
201
189
  }
202
190
 
203
- export function computeNodesAndEdges(...rules: DeploymentViewRuleBuilderOp<Types>[]) {
191
+ export function computeNodesAndEdges(...rules: DeploymentRulesBuilderOp<Types>[]) {
204
192
  const { nodeIds, edgeIds } = computeView(...rules)
205
193
  return {
206
194
  // Starts with capital letter to be first in snapshot
207
195
  Nodes: nodeIds,
208
- edges: edgeIds
196
+ edges: edgeIds,
209
197
  }
210
198
  }
@@ -1,29 +1,37 @@
1
1
  import { LikeC4DeploymentModel } from '../../model'
2
- import type { DeploymentConnectionModel } from '../../model/connection/deployment'
3
- import type { DeploymentElementModel } from '../../model/DeploymentElementModel'
4
- import type { AnyAux } from '../../model/types'
5
- import type { DeploymentExpression } from '../../types'
6
- import type { Memory, Patch } from './Memory'
7
- import type { Stage } from './Stage'
2
+ import type { RelationshipModel } from '../../model/RelationModel'
3
+ import type { ExpressionV2 } from '../../types'
4
+ import type { Ctx, Memory, Stage, StageExclude, StageInclude } from './memory'
8
5
 
9
- export type Elem = DeploymentElementModel<AnyAux>
6
+ export { Memory, type Stage } from './memory'
10
7
 
11
- export type Connections<M extends AnyAux = AnyAux> = ReadonlyArray<DeploymentConnectionModel<M>>
8
+ export type Where<T extends {}> = (x: T) => boolean
12
9
 
13
- export type PredicateParams<Expr extends DeploymentExpression = any> = {
10
+ export type Elem = Ctx['Element']
11
+ export type Connection = Ctx['Connection']
12
+
13
+ export type ElementWhere = Where<Elem>
14
+ export type ElementWhereFilter = (elements: readonly Elem[]) => Elem[]
15
+ export type ConnectionWhere = Where<Connection>
16
+ export type RelationshipWhere = Where<RelationshipModel>
17
+ export type ConnectionWhereFilter = (connections: readonly Connection[]) => Connection[]
18
+
19
+ export type Connections = ReadonlyArray<Connection>
20
+
21
+ export interface PredicateCtx<Expr extends ExpressionV2 = ExpressionV2> {
14
22
  expr: Expr
15
- model: LikeC4DeploymentModel
16
23
  stage: Stage
17
- memory: Memory
18
- }
19
-
20
- export interface PredicateCtx {
21
24
  model: LikeC4DeploymentModel
22
- stage: Stage
23
25
  memory: Memory
24
26
  }
27
+ export interface IncludePredicateCtx<Expr extends ExpressionV2 = ExpressionV2> extends PredicateCtx<Expr> {
28
+ stage: StageInclude
29
+ }
30
+ export interface ExcludePredicateCtx<Expr extends ExpressionV2 = ExpressionV2> extends PredicateCtx<Expr> {
31
+ stage: StageExclude
32
+ }
25
33
 
26
- export interface PredicateExecutor<Expr extends DeploymentExpression> {
27
- include(expr: Expr, ctx: PredicateCtx): Patch
28
- exclude(expr: Expr, ctx: PredicateCtx): Patch
34
+ export interface PredicateExecutor<Expr extends ExpressionV2> {
35
+ include(ctx: IncludePredicateCtx<Expr>): StageInclude | undefined
36
+ exclude(ctx: ExcludePredicateCtx<Expr>): StageExclude | undefined
29
37
  }