@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.
Files changed (99) 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.HUONfQfd.mjs → core.BB6zA-UU.mjs} +9 -214
  20. package/dist/shared/{core.C1GV0WWV.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.yaRvRnMW.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.Y3j3s-oq.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.DyzAZvbX.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.DQj9iv_y.mjs → core.DgttqsJc.mjs} +8 -11
  39. package/dist/shared/{core.b2BzqGz0.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.DsznOb9G.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 +7 -429
  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 +9 -8
  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/compare-natural.ts +4 -2
  77. package/src/utils/guards.ts +0 -1
  78. package/src/utils/index.ts +0 -1
  79. package/dist/shared/core.BW8K1y6R.mjs +0 -278
  80. package/dist/shared/core.BgvIuGGU.mjs +0 -3
  81. package/dist/shared/core.BpJu1RrF.mjs +0 -5
  82. package/dist/shared/core.ByrmCl9I.mjs +0 -5
  83. package/dist/shared/core.CnIyafWn.mjs +0 -3
  84. package/dist/shared/core.DK6I-Nr7.mjs +0 -149
  85. package/dist/shared/core.DbRvwARP.mjs +0 -5
  86. package/dist/shared/core.YyjkRVss.mjs +0 -5236
  87. package/dist/shared/core.zLlww-07.mjs +0 -3
  88. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +0 -425
  89. package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +0 -318
  90. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +0 -221
  91. package/src/compute-view/deployment-view/__test__/TestHelper.ts +0 -249
  92. package/src/compute-view/deployment-view/__test__/fixture.ts +0 -238
  93. package/src/compute-view/dynamic-view/__test__/fixture.ts +0 -67
  94. package/src/compute-view/element-view/__test__/TestHelper.ts +0 -282
  95. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +0 -458
  96. package/src/compute-view/element-view/__test__/fixture.ts +0 -749
  97. package/src/compute-view/utils/__snapshots__/sortNodes.spec.ts.snap +0 -113
  98. package/src/model/__test__/fixture.ts +0 -168
  99. 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
- }