likec4 1.12.2 → 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.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,13 @@
1
- import { LiteralUnion, Tagged, UnwrapTagged, IsNumericLiteral, SetRequired, ValueOf, ConditionalPick } from 'type-fest';
1
+ import { LiteralUnion, Tagged, TupleToUnion, Class, IsNumericLiteral, IfNever, Simplify, SetRequired, ValueOf, ConditionalPick } from 'type-fest';
2
+
3
+ type NonEmptyArray<T> = [T, ...T[]];
4
+ type IconUrl = Tagged<string, 'IconUrl'>;
5
+ type CustomColor$1 = string;
6
+ type Point = readonly [x: number, y: number];
7
+ interface XYPoint {
8
+ x: number;
9
+ y: number;
10
+ }
2
11
 
3
12
  declare const ThemeColors: readonly ["amber", "blue", "gray", "slate", "green", "indigo", "muted", "primary", "red", "secondary", "sky"];
4
13
  type ThemeColor$1 = typeof ThemeColors[number];
@@ -21,47 +30,38 @@ interface ThemeColorValues {
21
30
  relationships: RelationshipThemeColorValues;
22
31
  }
23
32
 
24
- type NonEmptyArray<T> = [T, ...T[]];
25
- type IconUrl = Tagged<string, 'IconUrl'>;
26
- type CustomColor$1 = string;
27
- type Point = readonly [x: number, y: number];
28
- interface XYPoint {
29
- x: number;
30
- y: number;
31
- }
32
-
33
- type Fqn$1 = Tagged<string, 'Fqn'>;
33
+ type Fqn$1<Id extends string = string> = Tagged<Id, 'Fqn'>;
34
34
  declare const BorderStyles: readonly ["solid", "dashed", "dotted", "none"];
35
- type BorderStyle = typeof BorderStyles[number];
36
- type ElementKind$1 = Tagged<string, 'ElementKind'>;
35
+ type BorderStyle = TupleToUnion<typeof BorderStyles>;
36
+ type ElementKind$1<Kinds extends string = string> = Tagged<Kinds, 'ElementKind'>;
37
37
  declare const ElementShapes: readonly ["rectangle", "person", "browser", "mobile", "cylinder", "storage", "queue"];
38
- type ElementShape$1 = typeof ElementShapes[number];
38
+ type ElementShape$1 = TupleToUnion<typeof ElementShapes>;
39
39
  interface ElementStyle {
40
40
  border?: BorderStyle;
41
41
  opacity?: number;
42
42
  }
43
- type Tag$1 = Tagged<string, 'Tag'>;
43
+ type Tag$1<Tags extends string = string> = Tagged<Tags, 'Tag'>;
44
44
  interface Link {
45
45
  readonly title?: string;
46
46
  readonly url: string;
47
47
  readonly relative?: string;
48
48
  }
49
- interface Element$1 {
50
- readonly id: Fqn$1;
51
- readonly kind: ElementKind$1;
49
+ interface TypedElement<Ids extends string, Kinds extends string, Tags extends string, MetadataKeys extends string = never> {
50
+ readonly id: Fqn$1<Ids>;
51
+ readonly kind: ElementKind$1<Kinds>;
52
52
  readonly title: string;
53
53
  readonly description: string | null;
54
54
  readonly technology: string | null;
55
- readonly tags: NonEmptyArray<Tag$1> | null;
55
+ readonly tags: NonEmptyArray<Tag$1<Tags>> | null;
56
56
  readonly links: NonEmptyArray<Link> | null;
57
57
  readonly icon?: IconUrl;
58
58
  readonly shape?: ElementShape$1;
59
59
  readonly color?: Color$1;
60
60
  readonly style?: ElementStyle;
61
61
  readonly notation?: string;
62
- readonly metadata?: {
63
- [key: string]: string;
64
- };
62
+ readonly metadata?: Record<MetadataKeys, string>;
63
+ }
64
+ interface Element$1 extends TypedElement<string, string, string, string> {
65
65
  }
66
66
  interface ElementKindSpecificationStyle {
67
67
  shape?: ElementShape$1;
@@ -107,135 +107,6 @@ type OrOperator<Tag, Kind> = Omit<AllNever, 'or'> & {
107
107
  };
108
108
  type WhereOperator<Tag, Kind> = TagEqual<Tag> | KindEqual<Kind> | NotOperator<Tag, Kind> | AndOperator<Tag, Kind> | OrOperator<Tag, Kind>;
109
109
 
110
- type RelationID$1 = Tagged<string, 'RelationID'>;
111
- type RelationshipKind$1 = Tagged<string, 'RelationshipKind'>;
112
- type RelationshipLineType = 'dashed' | 'solid' | 'dotted';
113
- type RelationshipArrowType = 'none' | 'normal' | 'onormal' | 'dot' | 'odot' | 'diamond' | 'odiamond' | 'crow' | 'open' | 'vee';
114
- interface Relation$1 {
115
- readonly id: RelationID$1;
116
- readonly source: Fqn$1;
117
- readonly target: Fqn$1;
118
- readonly title: string;
119
- readonly description?: string;
120
- readonly technology?: string;
121
- readonly tags?: NonEmptyArray<Tag$1>;
122
- readonly kind?: RelationshipKind$1;
123
- readonly color?: Color$1;
124
- readonly line?: RelationshipLineType;
125
- readonly head?: RelationshipArrowType;
126
- readonly tail?: RelationshipArrowType;
127
- readonly links?: NonEmptyArray<Link>;
128
- readonly navigateTo?: ViewID$1;
129
- readonly metadata?: {
130
- [key: string]: string;
131
- };
132
- }
133
- interface RelationshipKindSpecification {
134
- readonly technology?: string;
135
- readonly notation?: string;
136
- readonly color?: Color$1;
137
- readonly line?: RelationshipLineType;
138
- readonly head?: RelationshipArrowType;
139
- readonly tail?: RelationshipArrowType;
140
- }
141
-
142
- interface BaseExpr {
143
- where?: never;
144
- element?: never;
145
- custom?: never;
146
- expanded?: never;
147
- elementKind?: never;
148
- elementTag?: never;
149
- isEqual?: never;
150
- isDescedants?: never;
151
- wildcard?: never;
152
- source?: never;
153
- target?: never;
154
- inout?: never;
155
- incoming?: never;
156
- outgoing?: never;
157
- customRelation?: never;
158
- }
159
- interface ElementRefExpr extends Omit<BaseExpr, 'element' | 'isDescedants'> {
160
- element: Fqn$1;
161
- isDescedants?: boolean;
162
- }
163
- interface ExpandedElementExpr extends Omit<BaseExpr, 'expanded'> {
164
- expanded: Fqn$1;
165
- }
166
- interface CustomElementExpr extends Omit<BaseExpr, 'custom'> {
167
- custom: {
168
- expr: ElementExpression$1 | ElementWhereExpr;
169
- title?: string;
170
- description?: string;
171
- technology?: string;
172
- notation?: string;
173
- shape?: ElementShape$1;
174
- color?: Color$1;
175
- icon?: IconUrl;
176
- border?: BorderStyle;
177
- opacity?: number;
178
- navigateTo?: ViewID$1;
179
- };
180
- }
181
- interface WildcardExpr extends Omit<BaseExpr, 'wildcard'> {
182
- wildcard: true;
183
- }
184
- interface ElementKindExpr extends Omit<BaseExpr, 'elementKind' | 'isEqual'> {
185
- elementKind: ElementKind$1;
186
- isEqual: boolean;
187
- }
188
- interface ElementTagExpr extends Omit<BaseExpr, 'elementTag' | 'isEqual'> {
189
- elementTag: Tag$1;
190
- isEqual: boolean;
191
- }
192
- type ElementExpression$1 = ElementRefExpr | WildcardExpr | ElementKindExpr | ElementTagExpr | ExpandedElementExpr;
193
- interface ElementWhereExpr extends Omit<BaseExpr, 'where'> {
194
- where: {
195
- expr: ElementExpression$1;
196
- condition: WhereOperator<string, string>;
197
- };
198
- }
199
- type ElementPredicateExpression = ElementExpression$1 | ElementWhereExpr | CustomElementExpr;
200
- interface RelationExpr extends Omit<BaseExpr, 'source' | 'target'> {
201
- source: ElementExpression$1;
202
- target: ElementExpression$1;
203
- isBidirectional?: boolean;
204
- }
205
- interface InOutExpr extends Omit<BaseExpr, 'inout'> {
206
- inout: ElementExpression$1;
207
- }
208
- interface IncomingExpr extends Omit<BaseExpr, 'incoming'> {
209
- incoming: ElementExpression$1;
210
- }
211
- interface OutgoingExpr extends Omit<BaseExpr, 'outgoing'> {
212
- outgoing: ElementExpression$1;
213
- }
214
- type RelationExpression$1 = RelationExpr | InOutExpr | IncomingExpr | OutgoingExpr;
215
- interface RelationWhereExpr extends Omit<BaseExpr, 'where'> {
216
- where: {
217
- expr: RelationExpression$1;
218
- condition: WhereOperator<string, string>;
219
- };
220
- }
221
- interface CustomRelationExpr extends Omit<BaseExpr, 'customRelation'> {
222
- customRelation: {
223
- relation: RelationExpression$1 | RelationWhereExpr;
224
- title?: string;
225
- description?: string;
226
- technology?: string;
227
- notation?: string;
228
- navigateTo?: ViewID$1;
229
- notes?: string;
230
- color?: Color$1;
231
- line?: RelationshipLineType;
232
- head?: RelationshipArrowType;
233
- tail?: RelationshipArrowType;
234
- };
235
- }
236
- type RelationPredicateExpression = RelationExpression$1 | RelationWhereExpr | CustomRelationExpr;
237
- type Expression$1 = ElementPredicateExpression | RelationPredicateExpression;
238
-
239
110
  type ElementNotation = {
240
111
  kinds: ElementKind$1[];
241
112
  shape: ElementShape$1;
@@ -243,7 +114,7 @@ type ElementNotation = {
243
114
  title: string;
244
115
  };
245
116
 
246
- type ViewID$1 = Tagged<string, 'ViewID'>;
117
+ type ViewID$1<Id extends string = string> = Tagged<Id, 'ViewID'>;
247
118
  type ViewRulePredicate$1 = {
248
119
  include: Expression$1[];
249
120
  exclude?: never;
@@ -267,12 +138,12 @@ interface ViewRuleAutoLayout$1 {
267
138
  rankSep?: number;
268
139
  }
269
140
  type ViewRule$1 = ViewRulePredicate$1 | ViewRuleStyle$1 | ViewRuleAutoLayout$1;
270
- interface BasicView<ViewType extends 'element' | 'dynamic'> {
141
+ interface BasicView<ViewType extends 'element' | 'dynamic', ViewIDs extends string, Tags extends string> {
271
142
  readonly __?: ViewType;
272
- readonly id: ViewID$1;
143
+ readonly id: ViewID$1<ViewIDs>;
273
144
  readonly title: string | null;
274
145
  readonly description: string | null;
275
- readonly tags: NonEmptyArray<Tag$1> | null;
146
+ readonly tags: NonEmptyArray<Tag$1<Tags>> | null;
276
147
  readonly links: NonEmptyArray<Link> | null;
277
148
  /**
278
149
  * URI to the source file of this view.
@@ -294,17 +165,17 @@ interface BasicView<ViewType extends 'element' | 'dynamic'> {
294
165
  readonly manualLayout?: ViewManualLayout | undefined;
295
166
  readonly customColorDefinitions: CustomColorDefinitions;
296
167
  }
297
- interface BasicElementView extends BasicView<'element'> {
168
+ interface BasicElementView<ViewIDs extends string, Tags extends string> extends BasicView<'element', ViewIDs, Tags> {
298
169
  readonly viewOf?: Fqn$1;
299
170
  readonly rules: ViewRule$1[];
300
171
  }
301
- interface ScopedElementView extends BasicElementView {
172
+ interface ScopedElementView<ViewIDs extends string, Tags extends string> extends BasicElementView<ViewIDs, Tags> {
302
173
  readonly viewOf: Fqn$1;
303
174
  }
304
- interface ExtendsElementView extends BasicElementView {
305
- readonly extends: ViewID$1;
175
+ interface ExtendsElementView<ViewIDs extends string, Tags extends string> extends BasicElementView<ViewIDs, Tags> {
176
+ readonly extends: ViewID$1<ViewIDs>;
306
177
  }
307
- type ElementView$1 = ScopedElementView | ExtendsElementView | BasicElementView;
178
+ type ElementView$1<ViewIDs extends string = string, Tags extends string = string> = ScopedElementView<ViewIDs, Tags> | ExtendsElementView<ViewIDs, Tags> | BasicElementView<ViewIDs, Tags>;
308
179
  interface DynamicViewStep$1 {
309
180
  readonly source: Fqn$1;
310
181
  readonly target: Fqn$1;
@@ -329,7 +200,7 @@ type DynamicViewIncludeRule = {
329
200
  include: ElementPredicateExpression[];
330
201
  };
331
202
  type DynamicViewRule$1 = DynamicViewIncludeRule | ViewRuleStyle$1 | ViewRuleAutoLayout$1;
332
- interface DynamicView$1 extends BasicView<'dynamic'> {
203
+ interface DynamicView$1<ViewIDs extends string = string, Tags extends string = string> extends BasicView<'dynamic', ViewIDs, Tags> {
333
204
  readonly __: 'dynamic';
334
205
  readonly steps: DynamicViewStepOrParallel[];
335
206
  readonly rules: DynamicViewRule$1[];
@@ -337,8 +208,8 @@ interface DynamicView$1 extends BasicView<'dynamic'> {
337
208
  type CustomColorDefinitions = {
338
209
  [key: string]: ThemeColorValues;
339
210
  };
340
- type LikeC4View$1 = ElementView$1 | DynamicView$1;
341
- type NodeId = Tagged<string, 'Fqn'>;
211
+ type LikeC4View$1<ViewIDs extends string = string, Tags extends string = string> = ElementView$1<ViewIDs, Tags> | DynamicView$1<ViewIDs, Tags>;
212
+ type NodeId<IDs extends string = string> = Tagged<IDs, 'Fqn'>;
342
213
  type EdgeId$1 = Tagged<string, 'EdgeId'>;
343
214
  type StepEdgeIdLiteral = `step-${number}` | `step-${number}.${number}`;
344
215
  type StepEdgeId = Tagged<StepEdgeIdLiteral, 'EdgeId'>;
@@ -421,15 +292,15 @@ interface ViewAutoLayout {
421
292
  rankSep?: number;
422
293
  nodeSep?: number;
423
294
  }
424
- interface ComputedElementView extends Omit<ElementView$1, 'rules' | 'docUri'>, ViewWithHash, ViewWithNotation {
425
- readonly extends?: ViewID$1;
295
+ interface ComputedElementView<ViewIDs extends string = string, Tags extends string = string> extends Omit<ElementView$1<ViewIDs, Tags>, 'rules' | 'docUri'>, ViewWithHash, ViewWithNotation {
296
+ readonly extends?: ViewID$1<ViewIDs>;
426
297
  readonly autoLayout: ViewAutoLayout;
427
298
  readonly nodes: ComputedNode[];
428
299
  readonly edges: ComputedEdge[];
429
300
  rules?: never;
430
301
  docUri?: never;
431
302
  }
432
- interface ComputedDynamicView extends Omit<DynamicView$1, 'rules' | 'steps' | 'docUri'>, ViewWithHash, ViewWithNotation {
303
+ interface ComputedDynamicView<ViewIDs extends string = string, Tags extends string = string> extends Omit<DynamicView$1<ViewIDs, Tags>, 'rules' | 'steps' | 'docUri'>, ViewWithHash, ViewWithNotation {
433
304
  readonly autoLayout: ViewAutoLayout;
434
305
  readonly nodes: ComputedNode[];
435
306
  readonly edges: ComputedEdge[];
@@ -438,7 +309,7 @@ interface ComputedDynamicView extends Omit<DynamicView$1, 'rules' | 'steps' | 'd
438
309
  docUri?: never;
439
310
  }
440
311
  declare function isComputedDynamicView(view: ComputedView): view is ComputedDynamicView;
441
- type ComputedView = ComputedElementView | ComputedDynamicView;
312
+ type ComputedView<ViewIDs extends string = string, Tags extends string = string> = ComputedElementView<ViewIDs, Tags> | ComputedDynamicView<ViewIDs, Tags>;
442
313
  type BBox = {
443
314
  x: number;
444
315
  y: number;
@@ -457,7 +328,7 @@ interface DiagramEdge extends ComputedEdge {
457
328
  labelBBox?: BBox | null;
458
329
  dotpos?: string;
459
330
  }
460
- interface DiagramView extends Omit<ComputedView, 'nodes' | 'edges' | 'manualLayout'> {
331
+ interface DiagramView<ViewIDs extends string = string, Tags extends string = string> extends Omit<ComputedView<ViewIDs, Tags>, 'nodes' | 'edges' | 'manualLayout'> {
461
332
  readonly nodes: DiagramNode[];
462
333
  readonly edges: DiagramEdge[];
463
334
  readonly bounds: BBox;
@@ -490,18 +361,147 @@ type ViewManualLayout = {
490
361
  }>;
491
362
  };
492
363
 
364
+ type RelationID$1 = Tagged<string, 'RelationID'>;
365
+ type RelationshipKind$1<Kinds extends string = string> = Tagged<Kinds, 'RelationshipKind'>;
366
+ type RelationshipLineType = 'dashed' | 'solid' | 'dotted';
367
+ type RelationshipArrowType = 'none' | 'normal' | 'onormal' | 'dot' | 'odot' | 'diamond' | 'odiamond' | 'crow' | 'open' | 'vee';
368
+ interface Relation$1 {
369
+ readonly id: RelationID$1;
370
+ readonly source: Fqn$1;
371
+ readonly target: Fqn$1;
372
+ readonly title: string;
373
+ readonly description?: string;
374
+ readonly technology?: string;
375
+ readonly tags?: NonEmptyArray<Tag$1>;
376
+ readonly kind?: RelationshipKind$1;
377
+ readonly color?: Color$1;
378
+ readonly line?: RelationshipLineType;
379
+ readonly head?: RelationshipArrowType;
380
+ readonly tail?: RelationshipArrowType;
381
+ readonly links?: NonEmptyArray<Link>;
382
+ readonly navigateTo?: ViewID$1;
383
+ readonly metadata?: {
384
+ [key: string]: string;
385
+ };
386
+ }
387
+ interface RelationshipKindSpecification {
388
+ readonly technology?: string;
389
+ readonly notation?: string;
390
+ readonly color?: Color$1;
391
+ readonly line?: RelationshipLineType;
392
+ readonly head?: RelationshipArrowType;
393
+ readonly tail?: RelationshipArrowType;
394
+ }
395
+
396
+ interface BaseExpr {
397
+ where?: never;
398
+ element?: never;
399
+ custom?: never;
400
+ expanded?: never;
401
+ elementKind?: never;
402
+ elementTag?: never;
403
+ isEqual?: never;
404
+ isDescedants?: never;
405
+ wildcard?: never;
406
+ source?: never;
407
+ target?: never;
408
+ inout?: never;
409
+ incoming?: never;
410
+ outgoing?: never;
411
+ customRelation?: never;
412
+ }
413
+ interface ElementRefExpr extends Omit<BaseExpr, 'element' | 'isDescedants'> {
414
+ element: Fqn$1;
415
+ isDescedants?: boolean;
416
+ }
417
+ interface ExpandedElementExpr extends Omit<BaseExpr, 'expanded'> {
418
+ expanded: Fqn$1;
419
+ }
420
+ interface CustomElementExpr extends Omit<BaseExpr, 'custom'> {
421
+ custom: {
422
+ expr: ElementExpression$1 | ElementWhereExpr;
423
+ title?: string;
424
+ description?: string;
425
+ technology?: string;
426
+ notation?: string;
427
+ shape?: ElementShape$1;
428
+ color?: Color$1;
429
+ icon?: IconUrl;
430
+ border?: BorderStyle;
431
+ opacity?: number;
432
+ navigateTo?: ViewID$1;
433
+ };
434
+ }
435
+ interface WildcardExpr extends Omit<BaseExpr, 'wildcard'> {
436
+ wildcard: true;
437
+ }
438
+ interface ElementKindExpr extends Omit<BaseExpr, 'elementKind' | 'isEqual'> {
439
+ elementKind: ElementKind$1;
440
+ isEqual: boolean;
441
+ }
442
+ interface ElementTagExpr extends Omit<BaseExpr, 'elementTag' | 'isEqual'> {
443
+ elementTag: Tag$1;
444
+ isEqual: boolean;
445
+ }
446
+ type ElementExpression$1 = ElementRefExpr | WildcardExpr | ElementKindExpr | ElementTagExpr | ExpandedElementExpr;
447
+ interface ElementWhereExpr extends Omit<BaseExpr, 'where'> {
448
+ where: {
449
+ expr: ElementExpression$1;
450
+ condition: WhereOperator<string, string>;
451
+ };
452
+ }
453
+ type ElementPredicateExpression = ElementExpression$1 | ElementWhereExpr | CustomElementExpr;
454
+ interface RelationExpr extends Omit<BaseExpr, 'source' | 'target'> {
455
+ source: ElementExpression$1;
456
+ target: ElementExpression$1;
457
+ isBidirectional?: boolean;
458
+ }
459
+ interface InOutExpr extends Omit<BaseExpr, 'inout'> {
460
+ inout: ElementExpression$1;
461
+ }
462
+ interface IncomingExpr extends Omit<BaseExpr, 'incoming'> {
463
+ incoming: ElementExpression$1;
464
+ }
465
+ interface OutgoingExpr extends Omit<BaseExpr, 'outgoing'> {
466
+ outgoing: ElementExpression$1;
467
+ }
468
+ type RelationExpression$1 = RelationExpr | InOutExpr | IncomingExpr | OutgoingExpr;
469
+ interface RelationWhereExpr extends Omit<BaseExpr, 'where'> {
470
+ where: {
471
+ expr: RelationExpression$1;
472
+ condition: WhereOperator<string, string>;
473
+ };
474
+ }
475
+ interface CustomRelationExpr extends Omit<BaseExpr, 'customRelation'> {
476
+ customRelation: {
477
+ relation: RelationExpression$1 | RelationWhereExpr;
478
+ title?: string;
479
+ description?: string;
480
+ technology?: string;
481
+ notation?: string;
482
+ navigateTo?: ViewID$1;
483
+ notes?: string;
484
+ color?: Color$1;
485
+ line?: RelationshipLineType;
486
+ head?: RelationshipArrowType;
487
+ tail?: RelationshipArrowType;
488
+ };
489
+ }
490
+ type RelationPredicateExpression = RelationExpression$1 | RelationWhereExpr | CustomRelationExpr;
491
+ type Expression$1 = ElementPredicateExpression | RelationPredicateExpression;
492
+
493
493
  /**
494
494
  * Parsed elements, relations, and views.
495
495
  */
496
- interface ParsedLikeC4Model {
496
+ interface ParsedLikeC4Model<ElementKinds extends string = string, RelationKinds extends string = string, Tags extends string = string, Fqns extends string = string, Views extends string = string> {
497
497
  specification: {
498
- tags: Tag$1[];
499
- elements: Record<UnwrapTagged<ElementKind$1>, ElementKindSpecification>;
500
- relationships: Record<UnwrapTagged<ElementKind$1>, RelationshipKindSpecification>;
498
+ tags: Tag$1<Tags>[];
499
+ elements: Record<ElementKinds, ElementKindSpecification>;
500
+ relationships: Record<RelationKinds, RelationshipKindSpecification>;
501
501
  };
502
- elements: Record<Fqn$1, Element$1>;
502
+ elements: Record<Fqns, TypedElement<Fqns, ElementKinds, Tags>>;
503
503
  relations: Record<RelationID$1, Relation$1>;
504
- views: Record<ViewID$1, LikeC4View$1>;
504
+ views: Record<Views, LikeC4View$1<Views, Tags>>;
505
505
  }
506
506
  /**
507
507
  * Same as `ParsedLikeC4Model` but with computed views.
@@ -574,11 +574,274 @@ declare namespace ViewChange {
574
574
  }
575
575
  interface ChangeAutoLayout {
576
576
  op: 'change-autolayout';
577
- layout: ViewRuleAutoLayout$1;
577
+ layout: {
578
+ direction: AutoLayoutDirection;
579
+ nodeSep?: number | null;
580
+ rankSep?: number | null;
581
+ };
578
582
  }
579
583
  }
580
584
  type ViewChange = ViewChange.ChangeElementStyle | ViewChange.SaveManualLayout | ViewChange.ChangeAutoLayout;
581
585
 
586
+ type KeysOf<T> = keyof T extends infer K extends string ? K : never;
587
+ type BuilderSpecification = {
588
+ elements: {
589
+ [kind: string]: Partial<ElementKindSpecification>;
590
+ };
591
+ relationships?: Record<string, Partial<RelationshipKindSpecification>>;
592
+ tags?: [string, ...string[]];
593
+ metadataKeys?: [string, ...string[]];
594
+ };
595
+ type Metadata<MetadataKey extends string> = IfNever<MetadataKey, never, Record<MetadataKey, string>>;
596
+ type NewElementProps<Tag, Metadata> = {
597
+ title?: string;
598
+ description?: string;
599
+ technology?: string;
600
+ tags?: IfNever<Tag, never, [Tag, ...Tag[]]>;
601
+ metadata?: Metadata;
602
+ icon?: string;
603
+ shape?: ElementShape$1;
604
+ color?: Color$1;
605
+ links?: Array<string | {
606
+ title?: string;
607
+ url: string;
608
+ }>;
609
+ style?: {
610
+ border?: BorderStyle;
611
+ opacity?: number;
612
+ };
613
+ };
614
+ type NewViewProps<Tag> = {
615
+ title?: string;
616
+ description?: string;
617
+ tags?: IfNever<Tag, never, [Tag, ...Tag[]]>;
618
+ links?: Array<string | {
619
+ title?: string;
620
+ url: string;
621
+ }>;
622
+ };
623
+ type NewRelationProps<Kind, Tag, Metadata> = {
624
+ kind?: Kind;
625
+ title?: string;
626
+ description?: string;
627
+ technology?: string;
628
+ tags?: IfNever<Tag, never, [Tag, ...Tag[]]>;
629
+ metadata?: Metadata;
630
+ head?: RelationshipArrowType;
631
+ tail?: RelationshipArrowType;
632
+ line?: RelationshipLineType;
633
+ color?: Color$1;
634
+ links?: Array<string | {
635
+ title?: string;
636
+ url: string;
637
+ }>;
638
+ };
639
+ type Invalid<Message extends string> = Tagged<Message, 'Error'>;
640
+ /**
641
+ * When building nested objects
642
+ */
643
+ interface TypesNested<Parent extends string, ElementKind extends string, Fqn extends string, ViewId extends string, RelationshipKind extends string, Tag extends string, MetadataKey extends string> extends Types<ElementKind, Fqn, ViewId, RelationshipKind, Tag, MetadataKey> {
644
+ Parent: Parent;
645
+ }
646
+ type AnyTypes = Types<any, any, any, any, any, any>;
647
+ type AnyTypesNested = TypesNested<any, any, any, any, any, any, any>;
648
+ /**
649
+ * Auxilary type to keep track of the types in builder
650
+ */
651
+ interface Types<ElementKind extends string, Fqn extends string, ViewId extends string, RelationshipKind extends string, Tag extends string, MetadataKey extends string> {
652
+ ElementKind: ElementKind;
653
+ Fqn: Fqn;
654
+ ViewId: ViewId;
655
+ RelationshipKind: RelationshipKind;
656
+ Tag: Tag;
657
+ MetadataKey: MetadataKey;
658
+ Tags: IfNever<Tag, never, [Tag, ...Tag[]]>;
659
+ NewElementProps: NewElementProps<Tag, Metadata<MetadataKey>>;
660
+ NewRelationshipProps: NewRelationProps<RelationshipKind, Tag, Metadata<MetadataKey>>;
661
+ NewViewProps: NewViewProps<Tag>;
662
+ }
663
+ declare namespace Types {
664
+ type FromSpecification<Spec> = Spec extends BuilderSpecification ? Types<KeysOf<Spec['elements']>, never, never, KeysOf<Spec['relationships']>, TupleToUnion<Spec['tags']>, TupleToUnion<Spec['metadataKeys']>> : never;
665
+ type AddFqn<T, Id extends string> = T extends TypesNested<infer P, any, any, any, any, any, any> ? TypesNested<P, T['ElementKind'], `${P}.${Id}` | T['Fqn'], T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : T extends AnyTypes ? Types<T['ElementKind'], Id | T['Fqn'], T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : never;
666
+ type AddView<T, Id extends string> = T extends TypesNested<infer P, any, any, any, any, any, any> ? TypesNested<P, T['ElementKind'], T['Fqn'], Id | T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : T extends AnyTypes ? Types<T['ElementKind'], T['Fqn'], Id | T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : never;
667
+ type ToParsedLikeC4Model<T> = T extends AnyTypes ? ParsedLikeC4Model<T['ElementKind'], T['RelationshipKind'], T['Tag'], T['Fqn'], T['ViewId']> : never;
668
+ }
669
+
670
+ type ToNested<T, Id extends string> = T extends TypesNested<infer P, any, infer F, any, any, any, any> ? TypesNested<`${P}.${Id}`, T['ElementKind'], `${P}.${Id}` | F, T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : T extends AnyTypes ? TypesNested<Id, T['ElementKind'], Id | T['Fqn'], T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : never;
671
+ type FromNested<T extends AnyTypes, N> = N extends TypesNested<any, any, infer F, any, any, any, any> ? T extends TypesNested<infer P, any, any, any, any, any, any> ? TypesNested<P, T['ElementKind'], F, T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : T extends AnyTypes ? Types<T['ElementKind'], F, T['ViewId'], T['RelationshipKind'], T['Tag'], T['MetadataKey']> : never : never;
672
+ /**
673
+ * Chainable builder to create element
674
+ */
675
+ interface AddElement<Id extends string> {
676
+ <T extends AnyTypes>(builder: ModelBuilder<T>): ModelBuilder<Types.AddFqn<T, Id>>;
677
+ with<T extends AnyTypes, A extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, A>>;
678
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, B>>;
679
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, C>>;
680
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, D>>;
681
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, E>>;
682
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>, op6: (input: ModelBuilder<E>) => ModelBuilder<F>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, F>>;
683
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>, op6: (input: ModelBuilder<E>) => ModelBuilder<F>, op7: (input: ModelBuilder<F>) => ModelBuilder<G>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, G>>;
684
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>, op6: (input: ModelBuilder<E>) => ModelBuilder<F>, op7: (input: ModelBuilder<F>) => ModelBuilder<G>, op8: (input: ModelBuilder<G>) => ModelBuilder<H>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, H>>;
685
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>, op6: (input: ModelBuilder<E>) => ModelBuilder<F>, op7: (input: ModelBuilder<F>) => ModelBuilder<G>, op8: (input: ModelBuilder<G>) => ModelBuilder<H>, op9: (input: ModelBuilder<H>) => ModelBuilder<I>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, I>>;
686
+ with<T extends AnyTypes, A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes>(op1: (input: ModelBuilder<ToNested<T, Id>>) => ModelBuilder<A>, op2: (input: ModelBuilder<A>) => ModelBuilder<B>, op3: (input: ModelBuilder<B>) => ModelBuilder<C>, op4: (input: ModelBuilder<C>) => ModelBuilder<D>, op5: (input: ModelBuilder<D>) => ModelBuilder<E>, op6: (input: ModelBuilder<E>) => ModelBuilder<F>, op7: (input: ModelBuilder<F>) => ModelBuilder<G>, op8: (input: ModelBuilder<G>) => ModelBuilder<H>, op9: (input: ModelBuilder<H>) => ModelBuilder<I>, op10: (input: ModelBuilder<I>) => ModelBuilder<J>): (builder: ModelBuilder<T>) => ModelBuilder<FromNested<T, J>>;
687
+ }
688
+ type AddElementHelper<T = unknown> = <const Id extends string>(id: Id, titleOrProps?: string | T) => AddElement<Id>;
689
+ type AddElementHelpers<T extends AnyTypes> = T extends Types<infer Kinds extends string, any, any, any, any, any> ? {
690
+ [Kind in Kinds]: AddElementHelper<T['NewElementProps']>;
691
+ } : Invalid<'No Element Kinds'>;
692
+
693
+ interface ModelBuilder<T extends AnyTypes> {
694
+ addElement(element: Element$1): Builder<T>;
695
+ addRelation(relation: Omit<Relation$1, 'id'>): Builder<T>;
696
+ /**
697
+ * Create a fully qualified name from an id (for nested models)
698
+ */
699
+ fqn(id: string): Fqn$1;
700
+ addSourcelessRelation(relation: Omit<Relation$1, 'id' | 'source'>): Builder<T>;
701
+ }
702
+ declare function model<A extends AnyTypes, B extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>): (input: Builder<A>) => Builder<B>;
703
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>): (input: Builder<A>) => Builder<C>;
704
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>): (input: Builder<A>) => Builder<D>;
705
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>): (input: Builder<A>) => Builder<E>;
706
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>): (input: Builder<A>) => Builder<F>;
707
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>): (input: Builder<A>) => Builder<G>;
708
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>): (input: Builder<A>) => Builder<H>;
709
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>): (input: Builder<A>) => Builder<I>;
710
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>): (input: Builder<A>) => Builder<J>;
711
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>): (input: Builder<A>) => Builder<K>;
712
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>, op11: (input: ModelBuilder<K>) => ModelBuilder<L>): (input: Builder<A>) => Builder<L>;
713
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>, op11: (input: ModelBuilder<K>) => ModelBuilder<L>, op12: (input: ModelBuilder<L>) => ModelBuilder<M>): (input: Builder<A>) => Builder<M>;
714
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>, op11: (input: ModelBuilder<K>) => ModelBuilder<L>, op12: (input: ModelBuilder<L>) => ModelBuilder<M>, op13: (input: ModelBuilder<M>) => ModelBuilder<N>): (input: Builder<A>) => Builder<N>;
715
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes, O extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>, op11: (input: ModelBuilder<K>) => ModelBuilder<L>, op12: (input: ModelBuilder<L>) => ModelBuilder<M>, op13: (input: ModelBuilder<M>) => ModelBuilder<N>, op14: (input: ModelBuilder<N>) => ModelBuilder<O>): (input: Builder<A>) => Builder<O>;
716
+ declare function model<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes, O extends AnyTypes, P extends AnyTypes>(op1: (input: ModelBuilder<A>) => ModelBuilder<B>, op2: (input: ModelBuilder<B>) => ModelBuilder<C>, op3: (input: ModelBuilder<C>) => ModelBuilder<D>, op4: (input: ModelBuilder<D>) => ModelBuilder<E>, op5: (input: ModelBuilder<E>) => ModelBuilder<F>, op6: (input: ModelBuilder<F>) => ModelBuilder<G>, op7: (input: ModelBuilder<G>) => ModelBuilder<H>, op8: (input: ModelBuilder<H>) => ModelBuilder<I>, op9: (input: ModelBuilder<I>) => ModelBuilder<J>, op10: (input: ModelBuilder<J>) => ModelBuilder<K>, op11: (input: ModelBuilder<K>) => ModelBuilder<L>, op12: (input: ModelBuilder<L>) => ModelBuilder<M>, op13: (input: ModelBuilder<M>) => ModelBuilder<N>, op14: (input: ModelBuilder<N>) => ModelBuilder<O>, op15: (input: ModelBuilder<O>) => ModelBuilder<P>): (input: Builder<A>) => Builder<P>;
717
+ type RelationshipHelper<Props = unknown> = <T extends AnyTypes, From extends string & T['Fqn'], To extends string & T['Fqn']>(from: From, to: To, titleOrProps?: string | Props) => (builder: ModelBuilder<T>) => ModelBuilder<T>;
718
+ type NestedRelationshipHelper<Props = unknown> = <T extends AnyTypesNested, To extends string & T['Fqn']>(to: To, titleOrProps?: string | Props) => (builder: ModelBuilder<T>) => ModelBuilder<T>;
719
+ type ModelHelpers<T extends AnyTypes> = AddElementHelpers<T> & {
720
+ model: typeof model;
721
+ rel: RelationshipHelper<T['NewRelationshipProps']>;
722
+ relTo: NestedRelationshipHelper<T['NewRelationshipProps']>;
723
+ };
724
+
725
+ interface ViewsBuilder<T extends AnyTypes> {
726
+ addView(view: LikeC4View$1): Builder<T>;
727
+ }
728
+ declare function views<A extends AnyTypes, B extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>): (input: Builder<A>) => Builder<B>;
729
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>): (input: Builder<A>) => Builder<C>;
730
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>): (input: Builder<A>) => Builder<D>;
731
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>): (input: Builder<A>) => Builder<E>;
732
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>): (input: Builder<A>) => Builder<F>;
733
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>): (input: Builder<A>) => Builder<G>;
734
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>): (input: Builder<A>) => Builder<H>;
735
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>): (input: Builder<A>) => Builder<I>;
736
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>): (input: Builder<A>) => Builder<J>;
737
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>): (input: Builder<A>) => Builder<K>;
738
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>, op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>): (input: Builder<A>) => Builder<L>;
739
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>, op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>, op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>): (input: Builder<A>) => Builder<M>;
740
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>, op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>, op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>, op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>): (input: Builder<A>) => Builder<N>;
741
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes, O extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>, op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>, op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>, op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>, op14: (input: ViewsBuilder<N>) => ViewsBuilder<O>): (input: Builder<A>) => Builder<O>;
742
+ declare function views<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes, K extends AnyTypes, L extends AnyTypes, M extends AnyTypes, N extends AnyTypes, O extends AnyTypes, P extends AnyTypes>(op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>, op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>, op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>, op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>, op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>, op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>, op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>, op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>, op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>, op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>, op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>, op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>, op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>, op14: (input: ViewsBuilder<N>) => ViewsBuilder<O>, op15: (input: ViewsBuilder<O>) => ViewsBuilder<P>): (input: Builder<A>) => Builder<P>;
743
+
744
+ interface ViewBuilder<T extends AnyTypes> {
745
+ include(...exprs: Expression$1[]): ViewBuilder<T>;
746
+ exclude(...exprs: Expression$1[]): ViewBuilder<T>;
747
+ style(rule: ViewRuleStyle$1): ViewBuilder<T>;
748
+ autoLayout(layout: AutoLayoutDirection): ViewBuilder<T>;
749
+ }
750
+ declare namespace ViewPredicate {
751
+ export type ElementExpr<Fqn extends string> = '*' | Fqn | `${Fqn}.*` | `${Fqn}._`;
752
+ type AllExpression<ElementExpr extends string> = ElementExpr | `-> ${ElementExpr} ->` | `-> ${ElementExpr}` | `${ElementExpr} ->` | `${ElementExpr} ${'->' | '<->'} ${ElementExpr}`;
753
+ export type Expression<T extends AnyTypes> = T extends Types<any, infer F extends string, any, any, any, any> ? AllExpression<ViewPredicate.ElementExpr<F>> : never;
754
+ export type WhereTag<Tag extends string> = `tag ${'is' | 'is not'} #${Tag}`;
755
+ export type WhereKind<Kind extends string> = `kind ${'is' | 'is not'} ${Kind}`;
756
+ export type WhereEq<Types extends AnyTypes> = ViewPredicate.WhereTag<Types['Tag']> | ViewPredicate.WhereKind<Types['ElementKind']>;
757
+ export type WhereOperator<Types extends AnyTypes> = ViewPredicate.WhereEq<Types> | {
758
+ and: NonEmptyArray<ViewPredicate.WhereOperator<Types>>;
759
+ or?: never;
760
+ not?: never;
761
+ } | {
762
+ or: NonEmptyArray<ViewPredicate.WhereOperator<Types>>;
763
+ and?: never;
764
+ not?: never;
765
+ } | {
766
+ not: ViewPredicate.WhereOperator<Types>;
767
+ and?: never;
768
+ or?: never;
769
+ };
770
+ export type Custom<Types extends AnyTypes> = {
771
+ where?: ViewPredicate.WhereOperator<Types>;
772
+ with?: Simplify<Omit<CustomElementExpr['custom'] & CustomRelationExpr['customRelation'], 'expr' | 'relation' | 'navigateTo'> & {
773
+ navigateTo?: Types['ViewId'];
774
+ }>;
775
+ };
776
+ export { };
777
+ }
778
+ type ViewRuleBuilderOp<Types extends AnyTypes> = (b: ViewBuilder<Types>) => ViewBuilder<Types>;
779
+ interface AddViewHelper<Props = unknown> {
780
+ <const Id extends string, T extends AnyTypes>(id: Id, builder: (b: ViewBuilder<T>) => ViewBuilder<T>): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
781
+ <const Id extends string, T extends AnyTypes>(id: Id, propsOrTitle: Props | string): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
782
+ <const Id extends string, T extends AnyTypes>(id: Id, propsOrTitle: Props | string | undefined, builder: (b: ViewBuilder<T>) => ViewBuilder<T>): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
783
+ }
784
+ interface AddViewOfHelper<Props = unknown> {
785
+ <const Id extends string, T extends AnyTypes, Of extends string & T['Fqn']>(id: Id, of: Of): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
786
+ <const Id extends string, T extends AnyTypes, Of extends string & T['Fqn']>(id: Id, of: Of, builder: (b: ViewBuilder<T>) => ViewBuilder<T>): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
787
+ <const Id extends string, T extends AnyTypes, Of extends string & T['Fqn']>(id: Id, of: Of, propsOrTitle: Props | string): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
788
+ <const Id extends string, T extends AnyTypes, Of extends string & T['Fqn']>(id: Id, of: Of, propsOrTitle: Props | string | undefined, builder: (b: ViewBuilder<T>) => ViewBuilder<T>): (builder: ViewsBuilder<T>) => ViewsBuilder<Types.AddView<T, Id>>;
789
+ }
790
+ type TypedC4Expression<Types extends AnyTypes> = Tagged<Expression$1, 'typed', Types>;
791
+ declare function $include<Types extends AnyTypes>(...args: [ViewPredicate.Expression<Types>] | [TypedC4Expression<Types>] | [ViewPredicate.Expression<Types>, ViewPredicate.Custom<Types>]): (b: ViewBuilder<Types>) => ViewBuilder<Types>;
792
+ declare function $exclude<Types extends AnyTypes>(...args: [ViewPredicate.Expression<Types>] | [TypedC4Expression<Types>] | [ViewPredicate.Expression<Types>, ViewPredicate.Custom<Types>]): (b: ViewBuilder<Types>) => ViewBuilder<Types>;
793
+ declare function $style<Types extends AnyTypes>(element: ViewPredicate.ElementExpr<Types['Fqn']> | NonEmptyArray<ViewPredicate.ElementExpr<Types['Fqn']>>, { notation, ...style }: ViewRuleStyle$1['style'] & {
794
+ notation?: string;
795
+ }): (b: ViewBuilder<Types>) => ViewBuilder<Types>;
796
+ declare function $autoLayout<Types extends AnyTypes>(layout: AutoLayoutDirection): (b: ViewBuilder<Types>) => ViewBuilder<Types>;
797
+ declare function $rules<T extends AnyTypes>(...rules: ViewRuleBuilderOp<T>[]): (b: ViewBuilder<T>) => ViewBuilder<T>;
798
+
799
+ type ViewHelpers<T = unknown> = {
800
+ views: typeof views;
801
+ view: AddViewHelper<T>;
802
+ viewOf: AddViewOfHelper<T>;
803
+ $include: typeof $include;
804
+ $exclude: typeof $exclude;
805
+ $style: typeof $style;
806
+ $rules: typeof $rules;
807
+ $autoLayout: typeof $autoLayout;
808
+ };
809
+
810
+ interface Builder<T extends AnyTypes> {
811
+ /**
812
+ * Only available in compile time
813
+ */
814
+ readonly Types: T;
815
+ clone(): Builder<T>;
816
+ /**
817
+ * Builders for each element kind
818
+ */
819
+ helpers(): {
820
+ model: ModelHelpers<T>;
821
+ views: ViewHelpers<T['NewViewProps']>;
822
+ };
823
+ __model(): ModelBuilder<T>;
824
+ __views(): ViewsBuilder<T>;
825
+ build(): ParsedLikeC4Model<T['ElementKind'], T['RelationshipKind'], T['Tag'], T['Fqn'], T['ViewId']>;
826
+ with<A extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>): Builder<A>;
827
+ with<A extends AnyTypes, B extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>): Builder<B>;
828
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>): Builder<C>;
829
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>): Builder<D>;
830
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>): Builder<E>;
831
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>, op6: (input: Builder<E>) => Builder<F>): Builder<F>;
832
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>, op6: (input: Builder<E>) => Builder<F>, op7: (input: Builder<F>) => Builder<G>): Builder<G>;
833
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>, op6: (input: Builder<E>) => Builder<F>, op7: (input: Builder<F>) => Builder<G>, op8: (input: Builder<G>) => Builder<H>): Builder<H>;
834
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>, op6: (input: Builder<E>) => Builder<F>, op7: (input: Builder<F>) => Builder<G>, op8: (input: Builder<G>) => Builder<H>, op9: (input: Builder<H>) => Builder<I>): Builder<I>;
835
+ with<A extends AnyTypes, B extends AnyTypes, C extends AnyTypes, D extends AnyTypes, E extends AnyTypes, F extends AnyTypes, G extends AnyTypes, H extends AnyTypes, I extends AnyTypes, J extends AnyTypes>(op1: (input: Builder<T>) => Builder<A>, op2: (input: Builder<A>) => Builder<B>, op3: (input: Builder<B>) => Builder<C>, op4: (input: Builder<C>) => Builder<D>, op5: (input: Builder<D>) => Builder<E>, op6: (input: Builder<E>) => Builder<F>, op7: (input: Builder<F>) => Builder<G>, op8: (input: Builder<G>) => Builder<H>, op9: (input: Builder<H>) => Builder<I>, op10: (input: Builder<I>) => Builder<J>): Builder<J>;
836
+ }
837
+ declare namespace Builder {
838
+ function forSpecification<const Spec extends BuilderSpecification>(spec: Spec): {
839
+ builder: Builder<Types.FromSpecification<Spec>>;
840
+ model: ModelHelpers<Types.FromSpecification<Spec>>;
841
+ views: ViewHelpers<Types.FromSpecification<Spec>['NewViewProps']>;
842
+ };
843
+ }
844
+
582
845
  declare const ElementColors: {
583
846
  readonly primary: {
584
847
  fill: "#3b82f6";
@@ -856,11 +1119,11 @@ type ElementOrFqn = Fqn | {
856
1119
  declare class LikeC4ViewModel {
857
1120
  readonly view: ComputedView;
858
1121
  readonly model: LikeC4Model<LikeC4ViewModel>;
859
- private _rootElements;
860
- private _elements;
861
- private _connections;
1122
+ private readonly _rootElements;
1123
+ private readonly _elements;
1124
+ private readonly _connections;
862
1125
  constructor(view: ComputedView, model: LikeC4Model<LikeC4ViewModel>);
863
- get id(): ViewID$1;
1126
+ get id(): ViewID$1<string>;
864
1127
  get title(): string;
865
1128
  get viewOf(): LikeC4Model.ElementModel<LikeC4ViewModel>;
866
1129
  get tags(): Tag$1[];
@@ -895,9 +1158,9 @@ declare namespace LikeC4ViewModel {
895
1158
  */
896
1159
  class Element {
897
1160
  readonly node: ComputedNode;
898
- private viewmodel;
1161
+ private readonly viewmodel;
899
1162
  constructor(node: ComputedNode, viewmodel: LikeC4ViewModel);
900
- get id(): NodeId;
1163
+ get id(): NodeId<string>;
901
1164
  get title(): string;
902
1165
  get kind(): ElementKind$1;
903
1166
  get isRoot(): boolean;
@@ -926,7 +1189,7 @@ declare namespace LikeC4ViewModel {
926
1189
  */
927
1190
  class Connection {
928
1191
  readonly edge: ComputedEdge;
929
- private viewmodel;
1192
+ private readonly viewmodel;
930
1193
  constructor(edge: ComputedEdge, viewmodel: LikeC4ViewModel);
931
1194
  get id(): EdgeId$1;
932
1195
  get source(): LikeC4ViewModel.Element;
@@ -953,10 +1216,7 @@ declare class LikeC4Model<M extends LikeC4Model.ViewModel = LikeC4Model.ViewMode
953
1216
  private _internal;
954
1217
  private _cacheAscendingSiblings;
955
1218
  private _views;
956
- static create(source: LikeC4Model.SourceModel): PickBySource<typeof source>;
957
- static computed(source: ComputedLikeC4Model): LikeC4Model<LikeC4ViewModel>;
958
- static layouted(source: LayoutedLikeC4Model): LikeC4Model<LikeC4DiagramModel>;
959
- protected constructor(type: LikeC4Model.ModelType<M>, sourcemodel: LikeC4Model.SourceModel<M>, elements: Element$1[], relations: Relation$1[]);
1219
+ constructor(type: LikeC4Model.ModelType<M>, sourcemodel: LikeC4Model.SourceModel<M>, elements: Element$1[], relations: Relation$1[], views: LikeC4Model.SourceModel<M>['views'], ViewModelClass: Class<M>);
960
1220
  /**
961
1221
  * Returns the root elements of the model.
962
1222
  */
@@ -1047,10 +1307,14 @@ declare class LikeC4Model<M extends LikeC4Model.ViewModel = LikeC4Model.ViewMode
1047
1307
  private _internalOf;
1048
1308
  }
1049
1309
  declare namespace LikeC4Model {
1310
+ function create(source: LikeC4Model.SourceModel): PickBySource<typeof source>;
1311
+ function computed(source: ComputedLikeC4Model): LikeC4Model<LikeC4ViewModel>;
1312
+ function layouted(source: LayoutedLikeC4Model): LikeC4Model<LikeC4DiagramModel>;
1050
1313
  function isModel(model: any): model is LikeC4Model;
1051
1314
  type SourceModel<M extends ViewModel = ViewModel> = M extends LikeC4DiagramModel ? LayoutedLikeC4Model : ComputedLikeC4Model;
1052
1315
  type ViewModel = LikeC4ViewModel | LikeC4DiagramModel;
1053
1316
  namespace ViewModel {
1317
+ type ElementModel = LikeC4ViewModel.Element | LikeC4DiagramModel.Element;
1054
1318
  type Relationship = LikeC4Model.Relationship<ViewModel>;
1055
1319
  function isLayouted(model: ViewModel): model is LikeC4DiagramModel;
1056
1320
  }
@@ -1066,13 +1330,13 @@ declare namespace LikeC4Model {
1066
1330
  }
1067
1331
  type ModelType<M extends ViewModel = ViewModel> = M extends LikeC4DiagramModel ? 'layouted' : M extends LikeC4ViewModel ? 'computed' : never;
1068
1332
  function isLayouted(model: LikeC4Model): model is Layouted;
1069
- class Relationship<M extends ViewModel> {
1333
+ class Relationship<M extends ViewModel = ViewModel> {
1070
1334
  readonly relationship: Relation$1;
1071
- private model;
1335
+ private readonly model;
1072
1336
  constructor(relationship: Relation$1, model: LikeC4Model<M>);
1073
1337
  get id(): RelationID$1;
1074
1338
  get title(): string;
1075
- get kind(): RelationshipKind$1;
1339
+ get kind(): RelationshipKind$1<string>;
1076
1340
  get tags(): Tag$1[];
1077
1341
  get source(): ElementModel<M>;
1078
1342
  get target(): ElementModel<M>;
@@ -1080,11 +1344,11 @@ declare namespace LikeC4Model {
1080
1344
  metadata(key: string, defaultValue: string): string;
1081
1345
  hasMetadata(key: string): boolean;
1082
1346
  }
1083
- class ElementModel<M extends ViewModel> {
1347
+ class ElementModel<M extends ViewModel = ViewModel> {
1084
1348
  readonly element: Element$1;
1085
- private model;
1349
+ private readonly model;
1086
1350
  constructor(element: Element$1, model: LikeC4Model<M>);
1087
- get id(): Fqn$1;
1351
+ get id(): Fqn$1<string>;
1088
1352
  get title(): string;
1089
1353
  get kind(): ElementKind$1;
1090
1354
  get isRoot(): boolean;
@@ -1100,6 +1364,10 @@ declare namespace LikeC4Model {
1100
1364
  siblings(): readonly ElementModel<M>[];
1101
1365
  descendants(): readonly ElementModel<M>[];
1102
1366
  children(): readonly ElementModel<M>[];
1367
+ /**
1368
+ * All views 'view of' current element
1369
+ */
1370
+ viewsOf(): M[];
1103
1371
  /**
1104
1372
  * Views that contain this element
1105
1373
  */
@@ -1109,6 +1377,11 @@ declare namespace LikeC4Model {
1109
1377
  outgoing(filter?: OutgoingFilter): readonly Relationship<M>[];
1110
1378
  outgoers(filter?: OutgoingFilter): readonly ElementModel<M>[];
1111
1379
  internal(): readonly Relationship<M>[];
1380
+ /**
1381
+ * Resolve siblings of the element and siblings of ancestors
1382
+ * (from closest to root)
1383
+ */
1384
+ ascendingSiblings(): readonly ElementModel<M>[];
1112
1385
  }
1113
1386
  }
1114
1387
 
@@ -1118,12 +1391,12 @@ declare namespace LikeC4Model {
1118
1391
  declare class LikeC4DiagramModel {
1119
1392
  readonly view: DiagramView;
1120
1393
  readonly model: LikeC4Model.Layouted;
1121
- private _rootElements;
1122
- private _elements;
1123
- private _connections;
1394
+ private readonly _rootElements;
1395
+ private readonly _elements;
1396
+ private readonly _connections;
1124
1397
  constructor(view: DiagramView, model: LikeC4Model.Layouted);
1125
1398
  get isDynamic(): boolean;
1126
- get id(): ViewID$1;
1399
+ get id(): ViewID$1<string>;
1127
1400
  get title(): string;
1128
1401
  get viewOf(): LikeC4Model.ElementModel<LikeC4DiagramModel>;
1129
1402
  get tags(): Tag$1[];
@@ -1158,9 +1431,9 @@ declare namespace LikeC4DiagramModel {
1158
1431
  */
1159
1432
  class Element {
1160
1433
  readonly node: DiagramNode;
1161
- private view;
1434
+ private readonly view;
1162
1435
  constructor(node: DiagramNode, view: LikeC4DiagramModel);
1163
- get id(): NodeId;
1436
+ get id(): NodeId<string>;
1164
1437
  get title(): string;
1165
1438
  get kind(): ElementKind$1;
1166
1439
  get isRoot(): boolean;
@@ -1191,7 +1464,7 @@ declare namespace LikeC4DiagramModel {
1191
1464
  */
1192
1465
  class Connection {
1193
1466
  readonly edge: DiagramEdge;
1194
- private view;
1467
+ private readonly view;
1195
1468
  constructor(edge: DiagramEdge, view: LikeC4DiagramModel);
1196
1469
  get id(): EdgeId$1;
1197
1470
  get source(): LikeC4DiagramModel.Element;
@@ -1204,7 +1477,7 @@ declare namespace LikeC4DiagramModel {
1204
1477
  relationships(): ReadonlyArray<LikeC4Model.Relationship<LikeC4DiagramModel>>;
1205
1478
  }
1206
1479
  }
1207
- declare function nameFromFqn(fqn: Fqn$1): string;
1480
+ declare function nameFromFqn(fqn: LiteralUnion<Fqn$1, string>): string;
1208
1481
  declare function isAncestor<E extends {
1209
1482
  id: Fqn$1;
1210
1483
  }>(...args: [ancestor: string, another: string] | [ancestor: E, another: E]): boolean;
@@ -1214,13 +1487,13 @@ declare function isSameHierarchy<E extends {
1214
1487
  declare function isDescendantOf<E extends {
1215
1488
  id: Fqn$1;
1216
1489
  }>(ancestors: E[]): (e: E) => boolean;
1217
- declare function commonAncestor(first: Fqn$1, second: Fqn$1): Fqn$1;
1218
- declare function parentFqn(fqn: Fqn$1): Fqn$1 | null;
1490
+ declare function commonAncestor<IDs extends string>(first: Fqn$1<IDs>, second: Fqn$1<IDs>): Fqn$1<IDs>;
1491
+ declare function parentFqn<IDs extends string>(fqn: Fqn$1<IDs>): Fqn$1<IDs> | null;
1219
1492
  /**
1220
1493
  * Get all ancestor elements (i.e. parent, parent’s parent, etc.)
1221
1494
  * (from closest to root)
1222
1495
  */
1223
- declare function ancestorsFqn(fqn: Fqn$1): Fqn$1[];
1496
+ declare function ancestorsFqn<IDs extends string>(fqn: Fqn$1<IDs>): Fqn$1<IDs>[];
1224
1497
  /**
1225
1498
  * Compares two fully qualified names (fqns) hierarchically based on their depth.
1226
1499
  * From parent nodes to leaves
@@ -15417,6 +15690,7 @@ interface ModelViews extends AstNode {
15417
15690
  readonly $container: LikeC4Grammar;
15418
15691
  readonly $type: 'ModelViews';
15419
15692
  name: 'views';
15693
+ styles: Array<ViewRuleStyle>;
15420
15694
  views: Array<LikeC4View>;
15421
15695
  }
15422
15696
  declare const ModelViews = "ModelViews";
@@ -15609,7 +15883,7 @@ interface ViewRuleAutoLayout extends AstNode {
15609
15883
  }
15610
15884
  declare const ViewRuleAutoLayout = "ViewRuleAutoLayout";
15611
15885
  interface ViewRuleStyle extends AstNode {
15612
- readonly $container: DynamicViewBody | ElementViewBody;
15886
+ readonly $container: DynamicViewBody | ElementViewBody | ModelViews;
15613
15887
  readonly $type: 'ViewRuleStyle';
15614
15888
  props: Array<NotationProperty | StyleProperty>;
15615
15889
  target: ElementExpressionsIterator;
@@ -16024,11 +16298,15 @@ declare class LikeC4ModelParser {
16024
16298
  private parseRelationPredicateWith;
16025
16299
  private parseRelationExpr;
16026
16300
  private parseViewRule;
16301
+ private parseViewRuleStyle;
16302
+ private parseRuleStyle;
16027
16303
  private parseViewManualLaout;
16028
16304
  private parseDynamicParallelSteps;
16029
16305
  private parseDynamicStep;
16030
16306
  private parseElementView;
16031
16307
  private parseDynamicElementView;
16308
+ private parseDynamicViewRule;
16309
+ private parseDynamicViewIncludePredicate;
16032
16310
  protected resolveFqn(node: Element | ExtendElement): Fqn$1;
16033
16311
  private getAstNodePath;
16034
16312
  private getMetadata;
@@ -16960,4 +17238,4 @@ declare class LikeC4 {
16960
17238
  dispose(): void;
16961
17239
  }
16962
17240
 
16963
- export { type AutoLayoutDirection, type BBox, BorderStyles, type Color$1 as Color, type ComputedDynamicView, type ComputedEdge, type ComputedElementView, type ComputedLikeC4Model, type ComputedNode, type ComputedView, type DiagramEdge, type DiagramNode, type DiagramView, type DynamicView$1 as DynamicView, type EdgeId$1 as EdgeId, type Element$1 as Element, ElementColors, type ElementKind$1 as ElementKind, ElementShapes, type ElementView$1 as ElementView, type Fqn$1 as Fqn, type HexColorLiteral, type LayoutedLikeC4Model, LikeC4, LikeC4DiagramModel, LikeC4Model, type LikeC4View$1 as LikeC4View, LikeC4ViewModel, type NodeId, type ParsedLikeC4Model, type Point, type Relation$1 as Relation, type RelationExpr, type RelationID$1 as RelationID, RelationshipColors, StepEdgeId, type Tag$1 as Tag, type ThemeColor$1 as ThemeColor, type ViewID$1 as ViewID, type XYPoint, ancestorsFqn, commonAncestor, compareByFqnHierarchically, compareFqnHierarchically, compareRelations, defaultTheme, extractStep, hasAtLeast, invariant, isAncestor, isComputedDynamicView, isDescendantOf, isSameHierarchy, isStepEdgeId, nameFromFqn, nonNullable, nonexhaustive, parentFqn };
17241
+ export { type AutoLayoutDirection, type BBox, BorderStyles, Builder, type BuilderSpecification, type Color$1 as Color, type ComputedDynamicView, type ComputedEdge, type ComputedElementView, type ComputedLikeC4Model, type ComputedNode, type ComputedView, type DiagramEdge, type DiagramNode, type DiagramView, type DynamicView$1 as DynamicView, type EdgeId$1 as EdgeId, type Element$1 as Element, ElementColors, type ElementKind$1 as ElementKind, ElementShapes, type ElementView$1 as ElementView, type Fqn$1 as Fqn, type HexColorLiteral, type LayoutedLikeC4Model, LikeC4, Builder as LikeC4Builder, LikeC4DiagramModel, LikeC4Model, type LikeC4View$1 as LikeC4View, LikeC4ViewModel, type NodeId, type ParsedLikeC4Model, type Point, type Relation$1 as Relation, type RelationExpr, type RelationID$1 as RelationID, RelationshipColors, StepEdgeId, type Tag$1 as Tag, type ThemeColor$1 as ThemeColor, type ViewID$1 as ViewID, type XYPoint, ancestorsFqn, commonAncestor, compareByFqnHierarchically, compareFqnHierarchically, compareRelations, defaultTheme, extractStep, hasAtLeast, invariant, isAncestor, isComputedDynamicView, isDescendantOf, isSameHierarchy, isStepEdgeId, nameFromFqn, nonNullable, nonexhaustive, parentFqn };