@likec4/core 1.38.1 → 1.39.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 (98) hide show
  1. package/dist/builder/index.d.mts +6 -3
  2. package/dist/builder/index.mjs +55 -111
  3. package/dist/compute-view/index.d.mts +6 -3
  4. package/dist/compute-view/index.mjs +33 -34
  5. package/dist/compute-view/relationships-view/index.d.mts +6 -3
  6. package/dist/compute-view/relationships-view/index.mjs +6 -6
  7. package/dist/index.d.mts +8 -5
  8. package/dist/index.mjs +15 -24
  9. package/dist/model/connection/deployment/index.d.mts +8 -5
  10. package/dist/model/connection/deployment/index.mjs +7 -9
  11. package/dist/model/connection/index.d.mts +10 -7
  12. package/dist/model/connection/index.mjs +10 -14
  13. package/dist/model/connection/model/index.d.mts +8 -5
  14. package/dist/model/connection/model/index.mjs +7 -10
  15. package/dist/model/index.d.mts +13 -10
  16. package/dist/model/index.mjs +17 -20
  17. package/dist/shared/core.20m8Um0g.d.mts +253 -0
  18. package/dist/shared/{core.CpwrZi3D.mjs → core.4u1dVmfX.mjs} +3 -5
  19. package/dist/shared/{core.Bp-IQmJR.mjs → core.BB6zA-UU.mjs} +9 -214
  20. package/dist/shared/{core.BH0VqY-7.mjs → core.BVNaR17u.mjs} +1 -1
  21. package/dist/shared/{core.BL_xjl90.mjs → core.Be1n9a0i.mjs} +4 -5
  22. package/dist/shared/{core.BoyJPEen.mjs → core.Be4Jy9Qx.mjs} +2 -2
  23. package/dist/shared/{core.H8NbNp2X.mjs → core.BqVo8LrH.mjs} +1 -1
  24. package/dist/shared/{core.DDoAFHHp.mjs → core.BuoXfSMj.mjs} +1 -1
  25. package/dist/shared/{core.DhDo8LAz.d.mts → core.C7pZp1nR.d.mts} +3 -3
  26. package/dist/shared/{core.BH9nN-_I.mjs → core.CCD1ID81.mjs} +3 -4
  27. package/dist/shared/{core.8KM0D6va.mjs → core.CNGyqkJh.mjs} +1 -9
  28. package/dist/shared/{core.B0oEIXqd.mjs → core.CUw_2J9j.mjs} +1 -1
  29. package/dist/shared/{core.C4Cn4Jy_.mjs → core.CWv15GLo.mjs} +11 -15
  30. package/dist/shared/{core.Bf5zKDK1.d.mts → core.CXCmvCws.d.mts} +2 -2
  31. package/dist/shared/core.CaT0SUUK.mjs +201 -0
  32. package/dist/shared/{core.Dtw1SBlz.d.mts → core.ClpXZ4Ib.d.mts} +3 -3
  33. package/dist/shared/{core.DC6zzxS0.mjs → core.CsbOakly.mjs} +13 -22
  34. package/dist/shared/{core.Btl47GOn.mjs → core.DLpidoWc.mjs} +2 -2
  35. package/dist/shared/{core.wwaSalox.d.mts → core.DM3vdkO_.d.mts} +1 -1
  36. package/dist/shared/core.DXhDWKFZ.d.mts +3 -0
  37. package/dist/shared/{core.O6FG0HF9.d.mts → core.DdzRtJ9d.d.mts} +1 -1
  38. package/dist/shared/{core.OUoo2ohq.mjs → core.DgttqsJc.mjs} +5 -9
  39. package/dist/shared/{core.Dhc0yIwT.mjs → core.DlG1xWt2.mjs} +3 -43
  40. package/dist/shared/core.DnRszv-l.mjs +11982 -0
  41. package/dist/shared/core.DoM6aM9N.mjs +7 -0
  42. package/dist/shared/{core.CzHQRs5x.mjs → core.DozSPE83.mjs} +43 -60
  43. package/dist/shared/{core.DsMrjY2q.mjs → core.GTgsmXS_.mjs} +2 -2
  44. package/dist/shared/core.ILwny7BV.mjs +38 -0
  45. package/dist/shared/core.PHwHXzkG.d.mts +213 -0
  46. package/dist/shared/core.T-eLZTW_.mjs +59 -0
  47. package/dist/shared/{core.CE_hG7EJ.d.mts → core.aWJgARyY.d.mts} +10 -486
  48. package/dist/shared/{core.BvlHvikl.d.mts → core.v1iEaXaR.d.mts} +5 -3
  49. package/dist/shared/core.yHe79zEl.mjs +98 -0
  50. package/dist/theme/index.d.mts +3 -126
  51. package/dist/theme/index.mjs +2 -3
  52. package/dist/types/_aux.d.mts +1 -1
  53. package/dist/types/expression-model.d.mts +191 -0
  54. package/dist/types/expression-model.mjs +112 -0
  55. package/dist/types/expression.d.mts +7 -0
  56. package/dist/types/expression.mjs +116 -0
  57. package/dist/types/fqnRef.d.mts +61 -0
  58. package/dist/types/fqnRef.mjs +46 -0
  59. package/dist/types/index.d.mts +6 -3
  60. package/dist/types/index.mjs +9 -9
  61. package/dist/types/scalar.mjs +2 -3
  62. package/dist/utils/index.d.mts +6 -428
  63. package/dist/utils/index.mjs +56 -15
  64. package/dist/utils/iterable/index.d.mts +2 -3
  65. package/dist/utils/iterable/index.mjs +9 -44
  66. package/package.json +8 -7
  67. package/src/index.ts +24 -1
  68. package/src/model/RelationModel.ts +1 -1
  69. package/src/model/index.ts +1 -1
  70. package/src/theme/element.ts +2 -2
  71. package/src/theme/relationships.ts +2 -2
  72. package/src/types/RichText.ts +1 -1
  73. package/src/types/expression-model.ts +3 -1
  74. package/src/types/expression.ts +3 -1
  75. package/src/types/fqnRef.ts +4 -1
  76. package/src/utils/guards.ts +0 -1
  77. package/src/utils/index.ts +0 -1
  78. package/dist/shared/core.BW8K1y6R.mjs +0 -278
  79. package/dist/shared/core.BgvIuGGU.mjs +0 -3
  80. package/dist/shared/core.BpJu1RrF.mjs +0 -5
  81. package/dist/shared/core.ByrmCl9I.mjs +0 -5
  82. package/dist/shared/core.CnIyafWn.mjs +0 -3
  83. package/dist/shared/core.DK6I-Nr7.mjs +0 -149
  84. package/dist/shared/core.DbRvwARP.mjs +0 -5
  85. package/dist/shared/core.Dw47t7nG.mjs +0 -5236
  86. package/dist/shared/core.zLlww-07.mjs +0 -3
  87. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +0 -425
  88. package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +0 -318
  89. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +0 -221
  90. package/src/compute-view/deployment-view/__test__/TestHelper.ts +0 -249
  91. package/src/compute-view/deployment-view/__test__/fixture.ts +0 -238
  92. package/src/compute-view/dynamic-view/__test__/fixture.ts +0 -67
  93. package/src/compute-view/element-view/__test__/TestHelper.ts +0 -282
  94. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +0 -458
  95. package/src/compute-view/element-view/__test__/fixture.ts +0 -749
  96. package/src/compute-view/utils/__snapshots__/sortNodes.spec.ts.snap +0 -113
  97. package/src/model/__test__/fixture.ts +0 -168
  98. 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
- }