@likec4/core 1.38.0 → 1.39.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/dist/builder/index.d.mts +6 -3
- package/dist/builder/index.mjs +55 -111
- package/dist/compute-view/index.d.mts +6 -3
- package/dist/compute-view/index.mjs +33 -34
- package/dist/compute-view/relationships-view/index.d.mts +6 -3
- package/dist/compute-view/relationships-view/index.mjs +6 -6
- package/dist/index.d.mts +8 -5
- package/dist/index.mjs +15 -24
- package/dist/model/connection/deployment/index.d.mts +8 -5
- package/dist/model/connection/deployment/index.mjs +7 -9
- package/dist/model/connection/index.d.mts +10 -7
- package/dist/model/connection/index.mjs +10 -14
- package/dist/model/connection/model/index.d.mts +8 -5
- package/dist/model/connection/model/index.mjs +7 -10
- package/dist/model/index.d.mts +13 -10
- package/dist/model/index.mjs +17 -20
- package/dist/shared/core.20m8Um0g.d.mts +253 -0
- package/dist/shared/{core.CpwrZi3D.mjs → core.4u1dVmfX.mjs} +3 -5
- package/dist/shared/{core.HUONfQfd.mjs → core.BB6zA-UU.mjs} +9 -214
- package/dist/shared/{core.C1GV0WWV.mjs → core.BVNaR17u.mjs} +1 -1
- package/dist/shared/{core.BL_xjl90.mjs → core.Be1n9a0i.mjs} +4 -5
- package/dist/shared/{core.BoyJPEen.mjs → core.Be4Jy9Qx.mjs} +2 -2
- package/dist/shared/{core.H8NbNp2X.mjs → core.BqVo8LrH.mjs} +1 -1
- package/dist/shared/{core.yaRvRnMW.mjs → core.BuoXfSMj.mjs} +1 -1
- package/dist/shared/{core.DhDo8LAz.d.mts → core.C7pZp1nR.d.mts} +3 -3
- package/dist/shared/{core.BH9nN-_I.mjs → core.CCD1ID81.mjs} +3 -4
- package/dist/shared/{core.8KM0D6va.mjs → core.CNGyqkJh.mjs} +1 -9
- package/dist/shared/{core.B0oEIXqd.mjs → core.CUw_2J9j.mjs} +1 -1
- package/dist/shared/{core.Y3j3s-oq.mjs → core.CWv15GLo.mjs} +11 -15
- package/dist/shared/{core.Bf5zKDK1.d.mts → core.CXCmvCws.d.mts} +2 -2
- package/dist/shared/core.CaT0SUUK.mjs +201 -0
- package/dist/shared/{core.Dtw1SBlz.d.mts → core.ClpXZ4Ib.d.mts} +3 -3
- package/dist/shared/{core.DyzAZvbX.mjs → core.CsbOakly.mjs} +13 -22
- package/dist/shared/{core.Btl47GOn.mjs → core.DLpidoWc.mjs} +2 -2
- package/dist/shared/{core.wwaSalox.d.mts → core.DM3vdkO_.d.mts} +1 -1
- package/dist/shared/core.DXhDWKFZ.d.mts +3 -0
- package/dist/shared/{core.O6FG0HF9.d.mts → core.DdzRtJ9d.d.mts} +1 -1
- package/dist/shared/{core.DQj9iv_y.mjs → core.DgttqsJc.mjs} +8 -11
- package/dist/shared/{core.b2BzqGz0.mjs → core.DlG1xWt2.mjs} +3 -43
- package/dist/shared/core.DnRszv-l.mjs +11982 -0
- package/dist/shared/core.DoM6aM9N.mjs +7 -0
- package/dist/shared/{core.DsznOb9G.mjs → core.DozSPE83.mjs} +43 -60
- package/dist/shared/{core.DsMrjY2q.mjs → core.GTgsmXS_.mjs} +2 -2
- package/dist/shared/core.ILwny7BV.mjs +38 -0
- package/dist/shared/core.PHwHXzkG.d.mts +213 -0
- package/dist/shared/core.T-eLZTW_.mjs +59 -0
- package/dist/shared/{core.CE_hG7EJ.d.mts → core.aWJgARyY.d.mts} +10 -486
- package/dist/shared/{core.BvlHvikl.d.mts → core.v1iEaXaR.d.mts} +5 -3
- package/dist/shared/core.yHe79zEl.mjs +98 -0
- package/dist/theme/index.d.mts +3 -126
- package/dist/theme/index.mjs +2 -3
- package/dist/types/_aux.d.mts +1 -1
- package/dist/types/expression-model.d.mts +191 -0
- package/dist/types/expression-model.mjs +112 -0
- package/dist/types/expression.d.mts +7 -0
- package/dist/types/expression.mjs +116 -0
- package/dist/types/fqnRef.d.mts +61 -0
- package/dist/types/fqnRef.mjs +46 -0
- package/dist/types/index.d.mts +6 -3
- package/dist/types/index.mjs +9 -9
- package/dist/types/scalar.mjs +2 -3
- package/dist/utils/index.d.mts +7 -429
- package/dist/utils/index.mjs +56 -15
- package/dist/utils/iterable/index.d.mts +2 -3
- package/dist/utils/iterable/index.mjs +9 -44
- package/package.json +9 -8
- package/src/index.ts +24 -1
- package/src/model/RelationModel.ts +1 -1
- package/src/model/index.ts +1 -1
- package/src/theme/element.ts +2 -2
- package/src/theme/relationships.ts +2 -2
- package/src/types/RichText.ts +1 -1
- package/src/types/expression-model.ts +3 -1
- package/src/types/expression.ts +3 -1
- package/src/types/fqnRef.ts +4 -1
- package/src/utils/compare-natural.ts +4 -2
- package/src/utils/guards.ts +0 -1
- package/src/utils/index.ts +0 -1
- package/dist/shared/core.BW8K1y6R.mjs +0 -278
- package/dist/shared/core.BgvIuGGU.mjs +0 -3
- package/dist/shared/core.BpJu1RrF.mjs +0 -5
- package/dist/shared/core.ByrmCl9I.mjs +0 -5
- package/dist/shared/core.CnIyafWn.mjs +0 -3
- package/dist/shared/core.DK6I-Nr7.mjs +0 -149
- package/dist/shared/core.DbRvwARP.mjs +0 -5
- package/dist/shared/core.YyjkRVss.mjs +0 -5236
- package/dist/shared/core.zLlww-07.mjs +0 -3
- package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +0 -425
- package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +0 -318
- package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +0 -221
- package/src/compute-view/deployment-view/__test__/TestHelper.ts +0 -249
- package/src/compute-view/deployment-view/__test__/fixture.ts +0 -238
- package/src/compute-view/dynamic-view/__test__/fixture.ts +0 -67
- package/src/compute-view/element-view/__test__/TestHelper.ts +0 -282
- package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +0 -458
- package/src/compute-view/element-view/__test__/fixture.ts +0 -749
- package/src/compute-view/utils/__snapshots__/sortNodes.spec.ts.snap +0 -113
- package/src/model/__test__/fixture.ts +0 -168
- package/src/theme/__test__/theme-index.ts +0 -29
|
@@ -1,282 +0,0 @@
|
|
|
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 ElementViewRulesBuilder,
|
|
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 type { ConnectionModel, ElementModel, LikeC4Model } from '../../../model'
|
|
15
|
-
import { differenceConnections } from '../../../model/connection'
|
|
16
|
-
import {
|
|
17
|
-
type Any,
|
|
18
|
-
type ComputedElementView,
|
|
19
|
-
type ComputedView,
|
|
20
|
-
type ParsedElementView as ElementView,
|
|
21
|
-
type ViewId,
|
|
22
|
-
type ViewRule,
|
|
23
|
-
_stage,
|
|
24
|
-
_type,
|
|
25
|
-
} from '../../../types'
|
|
26
|
-
import { compareNatural } from '../../../utils'
|
|
27
|
-
import { imap, toArray } from '../../../utils/iterable'
|
|
28
|
-
import { difference as differenceSet } from '../../../utils/set'
|
|
29
|
-
import { withReadableEdges } from '../../utils/with-readable-edges'
|
|
30
|
-
import { processPredicates as processPredicatesImpl } from '../compute'
|
|
31
|
-
import { Memory } from '../memory'
|
|
32
|
-
|
|
33
|
-
type ConnectionExpression<T extends AnyTypes> = `${T['Fqn']} -> ${T['Fqn']}`
|
|
34
|
-
|
|
35
|
-
// type ConnectionsDeepMatcher<T extends AnyTypes> = {
|
|
36
|
-
// [K in `${T['Fqn']} -> ${T['Fqn']}`]?: {
|
|
37
|
-
// relations?: Array<`${T['Fqn']} -> ${T['Fqn']}`>
|
|
38
|
-
// }
|
|
39
|
-
// }
|
|
40
|
-
|
|
41
|
-
type ConnectionsDeepMatcher<Expr extends string> = {
|
|
42
|
-
[K in Expr]?: Array<Expr>
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
type ConnectionEqual<T extends AnyTypes> = [ConnectionsDeepMatcher<ConnectionExpression<T>>] | [
|
|
46
|
-
ConnectionExpression<T>,
|
|
47
|
-
...ConnectionExpression<T>[],
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
export class TestHelper<T extends AnyTypes> {
|
|
51
|
-
model: LikeC4Model.Computed<Types.ToAux<T>>
|
|
52
|
-
|
|
53
|
-
Aux!: typeof this.model.Aux
|
|
54
|
-
Elem!: ElementModel<typeof this.Aux>
|
|
55
|
-
Connection!: ConnectionModel<typeof this.Aux>
|
|
56
|
-
CompView!: ComputedElementView<typeof this.Aux>
|
|
57
|
-
|
|
58
|
-
static $include = viewhelpers.$include
|
|
59
|
-
static $exclude = viewhelpers.$exclude
|
|
60
|
-
static $rules = viewhelpers.$rules
|
|
61
|
-
static $style = viewhelpers.$style
|
|
62
|
-
|
|
63
|
-
$include = viewhelpers.$include
|
|
64
|
-
$exclude = viewhelpers.$exclude
|
|
65
|
-
$style = viewhelpers.$style
|
|
66
|
-
|
|
67
|
-
static from<const T extends AnyTypes>(
|
|
68
|
-
builder: Builder<T>,
|
|
69
|
-
expect = vitestExpect,
|
|
70
|
-
): TestHelper<T> {
|
|
71
|
-
return new TestHelper(builder, expect)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
constructor(
|
|
75
|
-
private builder: Builder<T>,
|
|
76
|
-
private _expect: ExpectStatic,
|
|
77
|
-
) {
|
|
78
|
-
this.model = builder.toLikeC4Model()
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
computeView = (...rules: ElementViewRulesBuilder<T>[]) => {
|
|
82
|
-
return withReadableEdges(
|
|
83
|
-
this.builder
|
|
84
|
-
.clone()
|
|
85
|
-
.views(_ => _.view('dev').with(...rules))
|
|
86
|
-
.toLikeC4Model()
|
|
87
|
-
.view('dev')
|
|
88
|
-
.$view,
|
|
89
|
-
' -> ',
|
|
90
|
-
)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
processPredicates(...rules: ElementViewRulesBuilder<T>[]) {
|
|
94
|
-
return ProcessPredicates.execute(this, ...rules)
|
|
95
|
-
}
|
|
96
|
-
processPredicatesWithScope(scope: T['Fqn'], ...rules: ElementViewRulesBuilder<T>[]) {
|
|
97
|
-
return ProcessPredicates.executeWithScope(this, scope, ...rules)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
expectView(view: ComputedView) {
|
|
101
|
-
return {
|
|
102
|
-
toHave: (nodesAndEdges: { nodes: Array<T['Fqn']>; edges: Array<ConnectionExpression<T>> }) => {
|
|
103
|
-
const actual = {
|
|
104
|
-
nodes: view.nodes.map(prop('id')),
|
|
105
|
-
edges: view.edges.map(prop('id')),
|
|
106
|
-
}
|
|
107
|
-
this._expect(actual).toEqual(nodesAndEdges)
|
|
108
|
-
},
|
|
109
|
-
toHaveNodes: <Id extends T['Fqn']>(...nodes: Id[]) => {
|
|
110
|
-
this._expect(view.nodes.map(prop('id'))).toEqual(nodes)
|
|
111
|
-
},
|
|
112
|
-
toHaveEdges: <Id extends ConnectionExpression<T>>(...edges: Id[]) => {
|
|
113
|
-
this._expect(view.edges.map(prop('id'))).toEqual(edges)
|
|
114
|
-
},
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
expectComputedView(...rules: ElementViewRulesBuilder<T>[]) {
|
|
119
|
-
return this.expectView(this.computeView(...rules))
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
expectMemory = (memory: Memory) => ({
|
|
123
|
-
toHaveAllElements: <Id extends T['Fqn']>(...ids: Id[]) => {
|
|
124
|
-
this._expect(map([...memory.elements], prop('id'))).toEqual(ids)
|
|
125
|
-
},
|
|
126
|
-
/**
|
|
127
|
-
* Final elements (visible in the view)
|
|
128
|
-
*/
|
|
129
|
-
toHaveElements: <Id extends T['Fqn']>(...ids: Id[]) => {
|
|
130
|
-
this._expect(map([...memory.final], prop('id'))).toEqual(ids)
|
|
131
|
-
},
|
|
132
|
-
toHaveConnections: (...matchers: ConnectionEqual<T>) => {
|
|
133
|
-
this.expectConnections(memory.connections as any).toEqual(...matchers)
|
|
134
|
-
},
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
expectElements = (elements: ReadonlySet<ElementModel<Any>>) => ({
|
|
138
|
-
toEqual: <const Id extends ViewPredicate.DeploymentConnectionExpression<T>>(...ids: Id[]) => {
|
|
139
|
-
this._expect(toArray(imap(elements, prop('id')))).toEqual(ids)
|
|
140
|
-
},
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
expectConnections = (connections: ReadonlyArray<typeof this.Connection>) => ({
|
|
144
|
-
toBeEmpty: () => {
|
|
145
|
-
this._expect(connections.map(c => c.expression)).to.be.empty
|
|
146
|
-
},
|
|
147
|
-
toEqual: (...matchers: ConnectionEqual<T>) => {
|
|
148
|
-
const [matcher, ...rest] = matchers
|
|
149
|
-
if (isString(matcher)) {
|
|
150
|
-
this._expect(connections.map(c => c.expression)).toEqual([matcher, ...rest])
|
|
151
|
-
return
|
|
152
|
-
}
|
|
153
|
-
const obj = pipe(
|
|
154
|
-
connections,
|
|
155
|
-
indexBy(prop('expression')),
|
|
156
|
-
mapValues(c => [...c.relations].map(prop('expression')).sort(compareNatural)),
|
|
157
|
-
)
|
|
158
|
-
const expected = mapValues(matcher, (v: any) => [...v].sort(compareNatural))
|
|
159
|
-
this._expect(obj).toEqual(expected)
|
|
160
|
-
},
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
expectStep = (step: ProcessPredicates<T>) => ({
|
|
164
|
-
...this.expectMemory(step.memory),
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
expect(value: typeof this.CompView): ReturnType<typeof this['expectView']>
|
|
168
|
-
expect(value: Set<ElementModel<Any>>): ReturnType<typeof this['expectElements']>
|
|
169
|
-
expect(value: ReadonlyArray<typeof this.Connection>): ReturnType<typeof this['expectConnections']>
|
|
170
|
-
expect(value: Memory | ProcessPredicates<T>): ReturnType<typeof this['expectMemory']>
|
|
171
|
-
expect(
|
|
172
|
-
value:
|
|
173
|
-
| Memory
|
|
174
|
-
| ProcessPredicates<T>
|
|
175
|
-
| Set<ElementModel<Any>>
|
|
176
|
-
| typeof this.CompView
|
|
177
|
-
| ReadonlyArray<typeof this.Connection>,
|
|
178
|
-
) {
|
|
179
|
-
if (value instanceof Memory) {
|
|
180
|
-
return this.expectMemory(value)
|
|
181
|
-
}
|
|
182
|
-
if (value instanceof ProcessPredicates) {
|
|
183
|
-
return this.expectStep(value)
|
|
184
|
-
}
|
|
185
|
-
if (value instanceof Set) {
|
|
186
|
-
return this.expectElements(value)
|
|
187
|
-
}
|
|
188
|
-
if (isArray(value)) {
|
|
189
|
-
return this.expectConnections(value)
|
|
190
|
-
}
|
|
191
|
-
return this.expectView(value)
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
class ProcessPredicates<T extends AnyTypes> {
|
|
196
|
-
static execute<B extends AnyTypes>(
|
|
197
|
-
test: TestHelper<B>,
|
|
198
|
-
...rules: ElementViewRulesBuilder<B>[]
|
|
199
|
-
) {
|
|
200
|
-
const processor = new ProcessPredicates<B>(test)
|
|
201
|
-
processor.next(...rules)
|
|
202
|
-
return processor
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
static executeWithScope<A extends AnyTypes>(
|
|
206
|
-
test: TestHelper<A>,
|
|
207
|
-
scope: A['Fqn'],
|
|
208
|
-
...rules: ElementViewRulesBuilder<A>[]
|
|
209
|
-
) {
|
|
210
|
-
const processor = new ProcessPredicates<A>(test, scope)
|
|
211
|
-
processor.next(...rules)
|
|
212
|
-
return processor
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
public viewrules: ReadonlyArray<ViewRule<typeof this.t.model.Aux>> = []
|
|
216
|
-
|
|
217
|
-
public previousMemory: Memory = Memory.empty(null)
|
|
218
|
-
public memory: Memory = Memory.empty(null)
|
|
219
|
-
public predicates: ElementViewRulesBuilder<T>[] = []
|
|
220
|
-
|
|
221
|
-
constructor(
|
|
222
|
-
public readonly t: TestHelper<T>,
|
|
223
|
-
public scope: T['Fqn'] | null = null,
|
|
224
|
-
protected age = 0,
|
|
225
|
-
) {}
|
|
226
|
-
|
|
227
|
-
get elements() {
|
|
228
|
-
return toArray(imap(this.memory.elements, prop('id')))
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
get connections() {
|
|
232
|
-
return this.memory.connections.map(c => c.expression)
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
diff() {
|
|
236
|
-
const prevState = this.previousMemory
|
|
237
|
-
const state = this.memory
|
|
238
|
-
return {
|
|
239
|
-
added: this.memory.update({
|
|
240
|
-
elements: differenceSet(state.elements, prevState.elements),
|
|
241
|
-
explicits: differenceSet(state.explicits, prevState.explicits),
|
|
242
|
-
final: differenceSet(state.final, prevState.final),
|
|
243
|
-
connections: differenceConnections(state.connections, prevState.connections),
|
|
244
|
-
}),
|
|
245
|
-
removed: this.memory.update({
|
|
246
|
-
elements: differenceSet(prevState.elements, state.elements),
|
|
247
|
-
explicits: differenceSet(prevState.explicits, state.explicits),
|
|
248
|
-
final: differenceSet(prevState.final, state.final),
|
|
249
|
-
connections: differenceConnections(prevState.connections, state.connections),
|
|
250
|
-
}),
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
next(...predicates: ElementViewRulesBuilder<T>[]): this {
|
|
255
|
-
const view = {
|
|
256
|
-
id: 'test' as ViewId,
|
|
257
|
-
[_stage]: 'parsed',
|
|
258
|
-
[_type]: 'element',
|
|
259
|
-
rules: [],
|
|
260
|
-
title: null,
|
|
261
|
-
description: null,
|
|
262
|
-
} as Writable<ElementView<typeof this.t.model.Aux>>
|
|
263
|
-
let vb = mkViewBuilder(view) as any
|
|
264
|
-
this.predicates = [
|
|
265
|
-
...this.predicates,
|
|
266
|
-
...predicates,
|
|
267
|
-
]
|
|
268
|
-
for (const rule of this.predicates) {
|
|
269
|
-
rule(vb)
|
|
270
|
-
}
|
|
271
|
-
this.previousMemory = this.memory
|
|
272
|
-
this.viewrules = view.rules
|
|
273
|
-
const scope = this.scope ? this.t.model.element(this.scope) : null
|
|
274
|
-
this.memory = processPredicatesImpl(
|
|
275
|
-
this.t.model,
|
|
276
|
-
Memory.empty(scope as any),
|
|
277
|
-
view.rules,
|
|
278
|
-
)
|
|
279
|
-
this.age++
|
|
280
|
-
return this
|
|
281
|
-
}
|
|
282
|
-
}
|