@likec4/core 1.12.1 → 1.13.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 (35) hide show
  1. package/dist/index.cjs +777 -251
  2. package/dist/index.d.cts +301 -32
  3. package/dist/index.d.mts +301 -32
  4. package/dist/index.d.ts +301 -32
  5. package/dist/index.mjs +774 -252
  6. package/dist/shared/{core.BvFch1jG.mjs → core.BJDxVHFh.mjs} +19 -19
  7. package/dist/shared/{core.dY8efyk0.d.ts → core.C4jDMQ1i.d.cts} +242 -238
  8. package/dist/shared/{core.dY8efyk0.d.cts → core.C4jDMQ1i.d.mts} +242 -238
  9. package/dist/shared/{core.dY8efyk0.d.mts → core.C4jDMQ1i.d.ts} +242 -238
  10. package/dist/shared/{core.CTiE4teS.cjs → core.IR7XOEkQ.cjs} +19 -18
  11. package/dist/types/index.cjs +1 -1
  12. package/dist/types/index.d.cts +1 -1
  13. package/dist/types/index.d.mts +1 -1
  14. package/dist/types/index.d.ts +1 -1
  15. package/dist/types/index.mjs +1 -1
  16. package/package.json +4 -3
  17. package/src/builder/Builder.element.ts +221 -0
  18. package/src/builder/Builder.model.ts +346 -0
  19. package/src/builder/Builder.test-d.ts +69 -0
  20. package/src/builder/Builder.ts +574 -0
  21. package/src/builder/Builder.view.ts +358 -0
  22. package/src/builder/Builder.views.ts +318 -0
  23. package/src/builder/_types.ts +195 -0
  24. package/src/builder/index.ts +5 -0
  25. package/src/index.ts +4 -0
  26. package/src/model/LikeC4DiagramModel.ts +5 -5
  27. package/src/model/LikeC4Model.ts +63 -46
  28. package/src/model/LikeC4ViewModel.ts +7 -7
  29. package/src/model/__test__/fixture.ts +5 -0
  30. package/src/types/element.ts +19 -11
  31. package/src/types/model.ts +13 -8
  32. package/src/types/relation.ts +1 -1
  33. package/src/types/view-changes.ts +6 -2
  34. package/src/types/view.ts +53 -22
  35. package/src/utils/fqn.ts +12 -11
@@ -0,0 +1,346 @@
1
+ import type { Element, Fqn, Relation } from '../types'
2
+ import type { AnyTypes, AnyTypesNested, Types, TypesNested } from './_types'
3
+ import type { Builder } from './Builder'
4
+ import type { AddElementHelpers } from './Builder.element'
5
+
6
+ export interface ModelBuilder<T extends AnyTypes> {
7
+ addElement(element: Element): Builder<T>
8
+ addRelation(relation: Omit<Relation, 'id'>): Builder<T>
9
+ /**
10
+ * Create a fully qualified name from an id (for nested models)
11
+ */
12
+ fqn(id: string): Fqn
13
+ addSourcelessRelation(relation: Omit<Relation, 'id' | 'source'>): Builder<T>
14
+ }
15
+
16
+ export function model<
17
+ A extends AnyTypes,
18
+ B extends AnyTypes
19
+ >(
20
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>
21
+ ): (input: Builder<A>) => Builder<B>
22
+ export function model<
23
+ A extends AnyTypes,
24
+ B extends AnyTypes,
25
+ C extends AnyTypes
26
+ >(
27
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
28
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>
29
+ ): (input: Builder<A>) => Builder<C>
30
+ export function model<
31
+ A extends AnyTypes,
32
+ B extends AnyTypes,
33
+ C extends AnyTypes,
34
+ D extends AnyTypes
35
+ >(
36
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
37
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
38
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>
39
+ ): (input: Builder<A>) => Builder<D>
40
+ export function model<
41
+ A extends AnyTypes,
42
+ B extends AnyTypes,
43
+ C extends AnyTypes,
44
+ D extends AnyTypes,
45
+ E extends AnyTypes
46
+ >(
47
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
48
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
49
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
50
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>
51
+ ): (input: Builder<A>) => Builder<E>
52
+ export function model<
53
+ A extends AnyTypes,
54
+ B extends AnyTypes,
55
+ C extends AnyTypes,
56
+ D extends AnyTypes,
57
+ E extends AnyTypes,
58
+ F extends AnyTypes
59
+ >(
60
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
61
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
62
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
63
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
64
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>
65
+ ): (input: Builder<A>) => Builder<F>
66
+ export function model<
67
+ A extends AnyTypes,
68
+ B extends AnyTypes,
69
+ C extends AnyTypes,
70
+ D extends AnyTypes,
71
+ E extends AnyTypes,
72
+ F extends AnyTypes,
73
+ G extends AnyTypes
74
+ >(
75
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
76
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
77
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
78
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
79
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
80
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>
81
+ ): (input: Builder<A>) => Builder<G>
82
+ export function model<
83
+ A extends AnyTypes,
84
+ B extends AnyTypes,
85
+ C extends AnyTypes,
86
+ D extends AnyTypes,
87
+ E extends AnyTypes,
88
+ F extends AnyTypes,
89
+ G extends AnyTypes,
90
+ H extends AnyTypes
91
+ >(
92
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
93
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
94
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
95
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
96
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
97
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
98
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>
99
+ ): (input: Builder<A>) => Builder<H>
100
+ export function model<
101
+ A extends AnyTypes,
102
+ B extends AnyTypes,
103
+ C extends AnyTypes,
104
+ D extends AnyTypes,
105
+ E extends AnyTypes,
106
+ F extends AnyTypes,
107
+ G extends AnyTypes,
108
+ H extends AnyTypes,
109
+ I extends AnyTypes
110
+ >(
111
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
112
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
113
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
114
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
115
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
116
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
117
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
118
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>
119
+ ): (input: Builder<A>) => Builder<I>
120
+ export function model<
121
+ A extends AnyTypes,
122
+ B extends AnyTypes,
123
+ C extends AnyTypes,
124
+ D extends AnyTypes,
125
+ E extends AnyTypes,
126
+ F extends AnyTypes,
127
+ G extends AnyTypes,
128
+ H extends AnyTypes,
129
+ I extends AnyTypes,
130
+ J extends AnyTypes
131
+ >(
132
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
133
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
134
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
135
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
136
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
137
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
138
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
139
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
140
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>
141
+ ): (input: Builder<A>) => Builder<J>
142
+ export function model<
143
+ A extends AnyTypes,
144
+ B extends AnyTypes,
145
+ C extends AnyTypes,
146
+ D extends AnyTypes,
147
+ E extends AnyTypes,
148
+ F extends AnyTypes,
149
+ G extends AnyTypes,
150
+ H extends AnyTypes,
151
+ I extends AnyTypes,
152
+ J extends AnyTypes,
153
+ K extends AnyTypes
154
+ >(
155
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
156
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
157
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
158
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
159
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
160
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
161
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
162
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
163
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
164
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>
165
+ ): (input: Builder<A>) => Builder<K>
166
+ export function model<
167
+ A extends AnyTypes,
168
+ B extends AnyTypes,
169
+ C extends AnyTypes,
170
+ D extends AnyTypes,
171
+ E extends AnyTypes,
172
+ F extends AnyTypes,
173
+ G extends AnyTypes,
174
+ H extends AnyTypes,
175
+ I extends AnyTypes,
176
+ J extends AnyTypes,
177
+ K extends AnyTypes,
178
+ L extends AnyTypes
179
+ >(
180
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
181
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
182
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
183
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
184
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
185
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
186
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
187
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
188
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
189
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>,
190
+ op11: (input: ModelBuilder<K>) => ModelBuilder<L>
191
+ ): (input: Builder<A>) => Builder<L>
192
+ export function model<
193
+ A extends AnyTypes,
194
+ B extends AnyTypes,
195
+ C extends AnyTypes,
196
+ D extends AnyTypes,
197
+ E extends AnyTypes,
198
+ F extends AnyTypes,
199
+ G extends AnyTypes,
200
+ H extends AnyTypes,
201
+ I extends AnyTypes,
202
+ J extends AnyTypes,
203
+ K extends AnyTypes,
204
+ L extends AnyTypes,
205
+ M extends AnyTypes
206
+ >(
207
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
208
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
209
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
210
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
211
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
212
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
213
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
214
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
215
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
216
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>,
217
+ op11: (input: ModelBuilder<K>) => ModelBuilder<L>,
218
+ op12: (input: ModelBuilder<L>) => ModelBuilder<M>
219
+ ): (input: Builder<A>) => Builder<M>
220
+ export function model<
221
+ A extends AnyTypes,
222
+ B extends AnyTypes,
223
+ C extends AnyTypes,
224
+ D extends AnyTypes,
225
+ E extends AnyTypes,
226
+ F extends AnyTypes,
227
+ G extends AnyTypes,
228
+ H extends AnyTypes,
229
+ I extends AnyTypes,
230
+ J extends AnyTypes,
231
+ K extends AnyTypes,
232
+ L extends AnyTypes,
233
+ M extends AnyTypes,
234
+ N extends AnyTypes
235
+ >(
236
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
237
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
238
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
239
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
240
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
241
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
242
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
243
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
244
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
245
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>,
246
+ op11: (input: ModelBuilder<K>) => ModelBuilder<L>,
247
+ op12: (input: ModelBuilder<L>) => ModelBuilder<M>,
248
+ op13: (input: ModelBuilder<M>) => ModelBuilder<N>
249
+ ): (input: Builder<A>) => Builder<N>
250
+ export function model<
251
+ A extends AnyTypes,
252
+ B extends AnyTypes,
253
+ C extends AnyTypes,
254
+ D extends AnyTypes,
255
+ E extends AnyTypes,
256
+ F extends AnyTypes,
257
+ G extends AnyTypes,
258
+ H extends AnyTypes,
259
+ I extends AnyTypes,
260
+ J extends AnyTypes,
261
+ K extends AnyTypes,
262
+ L extends AnyTypes,
263
+ M extends AnyTypes,
264
+ N extends AnyTypes,
265
+ O extends AnyTypes
266
+ >(
267
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
268
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
269
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
270
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
271
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
272
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
273
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
274
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
275
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
276
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>,
277
+ op11: (input: ModelBuilder<K>) => ModelBuilder<L>,
278
+ op12: (input: ModelBuilder<L>) => ModelBuilder<M>,
279
+ op13: (input: ModelBuilder<M>) => ModelBuilder<N>,
280
+ op14: (input: ModelBuilder<N>) => ModelBuilder<O>
281
+ ): (input: Builder<A>) => Builder<O>
282
+ export function model<
283
+ A extends AnyTypes,
284
+ B extends AnyTypes,
285
+ C extends AnyTypes,
286
+ D extends AnyTypes,
287
+ E extends AnyTypes,
288
+ F extends AnyTypes,
289
+ G extends AnyTypes,
290
+ H extends AnyTypes,
291
+ I extends AnyTypes,
292
+ J extends AnyTypes,
293
+ K extends AnyTypes,
294
+ L extends AnyTypes,
295
+ M extends AnyTypes,
296
+ N extends AnyTypes,
297
+ O extends AnyTypes,
298
+ P extends AnyTypes
299
+ >(
300
+ op1: (input: ModelBuilder<A>) => ModelBuilder<B>,
301
+ op2: (input: ModelBuilder<B>) => ModelBuilder<C>,
302
+ op3: (input: ModelBuilder<C>) => ModelBuilder<D>,
303
+ op4: (input: ModelBuilder<D>) => ModelBuilder<E>,
304
+ op5: (input: ModelBuilder<E>) => ModelBuilder<F>,
305
+ op6: (input: ModelBuilder<F>) => ModelBuilder<G>,
306
+ op7: (input: ModelBuilder<G>) => ModelBuilder<H>,
307
+ op8: (input: ModelBuilder<H>) => ModelBuilder<I>,
308
+ op9: (input: ModelBuilder<I>) => ModelBuilder<J>,
309
+ op10: (input: ModelBuilder<J>) => ModelBuilder<K>,
310
+ op11: (input: ModelBuilder<K>) => ModelBuilder<L>,
311
+ op12: (input: ModelBuilder<L>) => ModelBuilder<M>,
312
+ op13: (input: ModelBuilder<M>) => ModelBuilder<N>,
313
+ op14: (input: ModelBuilder<N>) => ModelBuilder<O>,
314
+ op15: (input: ModelBuilder<O>) => ModelBuilder<P>
315
+ ): (input: Builder<A>) => Builder<P>
316
+
317
+ export function model(...ops: any[]) {
318
+ return (input: Builder<any>) => {
319
+ let builder = input
320
+ for (const op of ops) {
321
+ builder = op(builder)
322
+ }
323
+ return builder
324
+ }
325
+ }
326
+
327
+ export type RelationshipHelper<Props = unknown> = <
328
+ T extends AnyTypes,
329
+ From extends string & T['Fqn'],
330
+ To extends string & T['Fqn']
331
+ >(
332
+ from: From,
333
+ to: To,
334
+ titleOrProps?: string | Props
335
+ ) => (builder: ModelBuilder<T>) => ModelBuilder<T>
336
+
337
+ export type NestedRelationshipHelper<Props = unknown> = <T extends AnyTypesNested, To extends string & T['Fqn']>(
338
+ to: To,
339
+ titleOrProps?: string | Props
340
+ ) => (builder: ModelBuilder<T>) => ModelBuilder<T>
341
+
342
+ export type ModelHelpers<T extends AnyTypes> = AddElementHelpers<T> & {
343
+ model: typeof model
344
+ rel: RelationshipHelper<T['NewRelationshipProps']>
345
+ relTo: NestedRelationshipHelper<T['NewRelationshipProps']>
346
+ }
@@ -0,0 +1,69 @@
1
+ import { expectTypeOf, test } from 'vitest'
2
+ import type { ParsedLikeC4Model } from '../types'
3
+ import { Builder } from './Builder'
4
+
5
+ test('should have types', () => {
6
+ const {
7
+ model: {
8
+ model,
9
+ actor,
10
+ system,
11
+ component,
12
+ relTo
13
+ },
14
+ views: {
15
+ views,
16
+ view,
17
+ viewOf,
18
+ $include
19
+ },
20
+ builder
21
+ } = Builder.forSpecification({
22
+ elements: {
23
+ actor: {
24
+ style: {
25
+ shape: 'person'
26
+ }
27
+ },
28
+ system: {},
29
+ component: {}
30
+ },
31
+ relationships: {
32
+ like: {},
33
+ dislike: {}
34
+ },
35
+ tags: ['tag1', 'tag2', 'tag1']
36
+ })
37
+
38
+ const m = builder
39
+ .with(
40
+ model(
41
+ actor('alice'),
42
+ actor('bob'),
43
+ system('cloud').with(
44
+ component('backend').with(
45
+ component('api'),
46
+ component('db')
47
+ ),
48
+ component('frontend').with(
49
+ relTo('cloud.backend.api')
50
+ )
51
+ )
52
+ ),
53
+ views(
54
+ view('index', $include('*')),
55
+ viewOf('cloud', 'cloud', $include('*'))
56
+ )
57
+ )
58
+ .build()
59
+
60
+ expectTypeOf(m).toEqualTypeOf(
61
+ {} as ParsedLikeC4Model<
62
+ 'actor' | 'system' | 'component',
63
+ 'like' | 'dislike',
64
+ 'tag1' | 'tag2',
65
+ 'alice' | 'bob' | 'cloud' | 'cloud.backend' | 'cloud.backend.api' | 'cloud.backend.db' | 'cloud.frontend',
66
+ 'index' | 'cloud'
67
+ >
68
+ )
69
+ })