@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.
- package/LICENSE +1 -1
- package/dist/builder/index.d.mts +502 -0
- package/dist/builder/index.d.ts +502 -0
- package/dist/builder/index.js +871 -0
- package/dist/compute-view/index.d.mts +9 -78
- package/dist/compute-view/index.d.ts +9 -78
- package/dist/compute-view/index.js +78 -0
- package/dist/index.d.mts +9 -730
- package/dist/index.d.ts +9 -730
- package/dist/{index.mjs → index.js} +7 -784
- package/dist/model/index.d.mts +218 -606
- package/dist/model/index.d.ts +218 -606
- package/dist/model/index.js +1 -0
- package/dist/shared/chunk-RAAYCPUM.M-JWF7SS.js +21 -0
- package/dist/shared/core.BIfgabEw.d.ts +719 -0
- package/dist/shared/core.BZ9Msq7w.d.mts +719 -0
- package/dist/shared/{core.DMYY7C8s.d.mts → core.C05RDLhi.d.ts} +179 -230
- package/dist/shared/{core.DMYY7C8s.d.ts → core.CmYMqgha.d.mts} +179 -230
- package/dist/shared/core.D6-fWbM3.d.ts +127 -0
- package/dist/shared/core.D74xkKkG.d.mts +148 -0
- package/dist/shared/core.D74xkKkG.d.ts +148 -0
- package/dist/shared/core.sLaWHBjR.d.mts +127 -0
- package/dist/shared/index.-BdzdI2C.js +7443 -0
- package/dist/shared/object_hash.CE_oF3I3.js +1222 -0
- package/dist/shared/view.CyZrG8BJ.js +354 -0
- package/dist/types/index.d.mts +4 -2
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.js +20 -0
- package/dist/utils/index.d.mts +404 -0
- package/dist/utils/index.d.ts +404 -0
- package/dist/utils/index.js +330 -0
- package/package.json +47 -33
- package/src/builder/Builder-style1.test-d.ts +190 -0
- package/src/builder/Builder-style2.test-d.ts +175 -0
- package/src/builder/Builder.deployment.ts +25 -20
- package/src/builder/Builder.deploymentModel.ts +80 -55
- package/src/builder/Builder.element.ts +2 -0
- package/src/builder/Builder.model.ts +57 -43
- package/src/builder/Builder.ts +412 -431
- package/src/builder/Builder.view-common.ts +234 -0
- package/src/builder/Builder.view-deployment.ts +135 -0
- package/src/builder/Builder.view-element.ts +189 -0
- package/src/builder/Builder.views.ts +109 -33
- package/src/builder/Builder.with.ts +475 -0
- package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +374 -0
- package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +183 -0
- package/src/builder/__snapshots__/Builder.spec.ts.snap +374 -0
- package/src/builder/_types.ts +28 -5
- package/src/builder/index.ts +10 -4
- package/src/colors/index.ts +2 -2
- package/src/compute-view/compute-view.ts +45 -54
- package/src/compute-view/deployment-view/__test__/TestHelper.ts +236 -0
- package/src/compute-view/deployment-view/__test__/fixture.ts +50 -62
- package/src/compute-view/deployment-view/_types.ts +26 -18
- package/src/compute-view/deployment-view/clean-connections.ts +173 -164
- package/src/compute-view/deployment-view/compute.ts +51 -37
- package/src/compute-view/deployment-view/memory/index.ts +9 -0
- package/src/compute-view/deployment-view/memory/memory.ts +97 -0
- package/src/compute-view/deployment-view/predicates/elements.ts +144 -0
- package/src/compute-view/deployment-view/predicates/relation-direct.ts +183 -76
- package/src/compute-view/deployment-view/predicates/relation-in-out.ts +38 -20
- package/src/compute-view/deployment-view/predicates/relation-incoming.ts +72 -23
- package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +61 -22
- package/src/compute-view/deployment-view/predicates/wildcard.ts +15 -15
- package/src/compute-view/deployment-view/stages/stage-exclude.ts +5 -0
- package/src/compute-view/deployment-view/stages/stage-final.ts +245 -0
- package/src/compute-view/deployment-view/stages/stage-include.ts +95 -0
- package/src/compute-view/deployment-view/utils.ts +95 -31
- package/src/compute-view/dynamic-view/__test__/fixture.ts +4 -4
- package/src/compute-view/dynamic-view/compute.ts +59 -45
- package/src/compute-view/element-view/__test__/TestHelper.ts +258 -0
- package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +64 -62
- package/src/compute-view/element-view/__test__/fixture.ts +147 -117
- package/src/compute-view/element-view/_types.ts +48 -0
- package/src/compute-view/element-view/clean-connections.ts +113 -0
- package/src/compute-view/element-view/compute.ts +264 -683
- package/src/compute-view/element-view/memory/NodeGroup.ts +31 -0
- package/src/compute-view/element-view/memory/index.ts +10 -0
- package/src/compute-view/element-view/memory/memory.ts +177 -0
- package/src/compute-view/element-view/memory/stage-exclude.ts +59 -0
- package/src/compute-view/element-view/memory/stage-final.ts +129 -0
- package/src/compute-view/element-view/memory/stage-include.ts +128 -0
- package/src/compute-view/element-view/predicates/_utils.ts +86 -0
- package/src/compute-view/element-view/predicates/element-expand.ts +33 -0
- package/src/compute-view/element-view/predicates/element-kind-tag.ts +26 -0
- package/src/compute-view/element-view/predicates/element-ref.ts +37 -0
- package/src/compute-view/element-view/predicates/relation-direct.ts +309 -0
- package/src/compute-view/element-view/predicates/relation-in-out.ts +66 -0
- package/src/compute-view/element-view/predicates/relation-in.ts +118 -0
- package/src/compute-view/element-view/predicates/relation-out.ts +116 -0
- package/src/compute-view/element-view/predicates/wildcard.ts +88 -0
- package/src/compute-view/element-view/utils.ts +59 -0
- package/src/compute-view/index.ts +3 -4
- package/src/compute-view/memory/AbstractMemory.ts +45 -0
- package/src/compute-view/memory/AbstractStageExclude.ts +216 -0
- package/src/compute-view/memory/AbstractStageInclude.ts +200 -0
- package/src/compute-view/memory/_types.ts +147 -0
- package/src/compute-view/memory/index.ts +5 -0
- package/src/compute-view/memory/ops.ts +43 -0
- package/src/compute-view/utils/buildComputedNodes.ts +4 -4
- package/src/compute-view/utils/elementExpressionToPredicate.ts +1 -3
- package/src/compute-view/utils/link-nodes-with-edges.ts +3 -7
- package/src/compute-view/utils/{derive-edge-props-from-relationships.ts → merge-props-from-relationships.ts} +54 -23
- package/src/compute-view/utils/relationExpressionToPredicates.ts +2 -2
- package/src/compute-view/utils/resolve-extended-views.ts +44 -40
- package/src/compute-view/utils/resolve-global-rules.ts +6 -6
- package/src/compute-view/utils/topological-sort.ts +167 -71
- package/src/compute-view/utils/with-readable-edges.ts +14 -9
- package/src/index.ts +22 -16
- package/src/model/DeploymentElementModel.ts +150 -85
- package/src/model/DeploymentModel.ts +27 -21
- package/src/model/ElementModel.ts +51 -25
- package/src/model/LikeC4Model.test-d.ts +4 -3
- package/src/model/LikeC4Model.ts +98 -42
- package/src/model/RelationModel.ts +5 -4
- package/src/model/__test__/fixture.ts +5 -9
- package/src/model/connection/Connection.ts +72 -0
- package/src/model/connection/deployment/DeploymentConnectionModel.ts +178 -0
- package/src/model/connection/{deployment.ts → deployment/find.ts} +14 -18
- package/src/model/connection/deployment/index.ts +8 -0
- package/src/model/connection/index.ts +22 -0
- package/src/model/connection/model/ConnectionModel.ts +157 -0
- package/src/model/connection/{model.ts → model/find.ts} +43 -49
- package/src/model/connection/model/index.ts +8 -0
- package/src/model/connection/ops.ts +274 -0
- package/src/model/guards.ts +9 -0
- package/src/model/index.ts +45 -3
- package/src/model/types.ts +35 -18
- package/src/model/view/EdgeModel.ts +6 -6
- package/src/model/view/LikeC4ViewModel.ts +14 -8
- package/src/model/view/NodeModel.ts +6 -5
- package/src/types/_common.ts +53 -1
- package/src/types/deployments.ts +88 -156
- package/src/types/element.ts +2 -2
- package/src/types/expression-v2.ts +172 -0
- package/src/types/expression.ts +9 -5
- package/src/types/global.ts +3 -3
- package/src/types/index.ts +220 -13
- package/src/types/model.ts +28 -24
- package/src/types/operators.ts +1 -1
- package/src/types/relation.ts +14 -10
- package/src/types/theme.ts +0 -1
- package/src/types/view.ts +20 -18
- package/src/utils/const.ts +1 -0
- package/src/utils/fqn.ts +140 -49
- package/src/utils/getOrCreate.ts +1 -1
- package/src/utils/index.ts +74 -9
- package/src/utils/iterable/_types.ts +5 -0
- package/src/utils/iterable/filter.ts +55 -0
- package/src/utils/iterable/flat.ts +17 -0
- package/src/utils/iterable/index.ts +12 -0
- package/src/utils/iterable/map.ts +40 -0
- package/src/utils/iterable/reduce.ts +24 -0
- package/src/utils/iterable/some.ts +36 -0
- package/src/utils/iterable/to.ts +19 -0
- package/src/utils/iterable/unique.ts +29 -0
- package/src/utils/relations.ts +3 -64
- package/src/utils/set.ts +11 -9
- package/src/utils/string-hash.ts +1 -1
- package/dist/compute-view/index.mjs +0 -79
- package/dist/model/index.mjs +0 -2
- package/dist/shared/core.BBgiAAv1.mjs +0 -144
- package/dist/shared/core.BPyJvuMU.mjs +0 -2420
- package/dist/shared/core.BQ4AbfvB.mjs +0 -9228
- package/dist/shared/core.k12s_keD.mjs +0 -203
- package/dist/types/index.mjs +0 -21
- package/src/builder/Builder.test-d.ts +0 -124
- package/src/builder/Builder.view.ts +0 -543
- package/src/compute-view/LikeC4ModelGraph.ts +0 -330
- package/src/compute-view/deployment-view/Memory.ts +0 -108
- package/src/compute-view/deployment-view/Stage.ts +0 -145
- package/src/compute-view/deployment-view/predicates/deployment-ref.ts +0 -146
- package/src/compute-view/element-view/predicates.ts +0 -517
- package/src/compute-view/utils/sortNodes.ts +0 -101
- package/src/model/connection/ConnectionModel.ts +0 -94
- 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
|
-
|
|
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:
|
|
184
|
-
const modelsource = builder.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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:
|
|
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 {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
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
|
|
6
|
+
export { Memory, type Stage } from './memory'
|
|
10
7
|
|
|
11
|
-
export type
|
|
8
|
+
export type Where<T extends {}> = (x: T) => boolean
|
|
12
9
|
|
|
13
|
-
export type
|
|
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
|
|
27
|
-
include(
|
|
28
|
-
exclude(
|
|
34
|
+
export interface PredicateExecutor<Expr extends ExpressionV2> {
|
|
35
|
+
include(ctx: IncludePredicateCtx<Expr>): StageInclude | undefined
|
|
36
|
+
exclude(ctx: ExcludePredicateCtx<Expr>): StageExclude | undefined
|
|
29
37
|
}
|